Lium GPU Cloud について
Liumは、Liumプラットフォーム上のGPU podを管理するコマンドラインツールとPython SDKです。単一podのジョブとマルチノードクラスターに対応し、コマンド実行やバックグラウンドジョブの管理、リソースの削除ができます。
主な機能
- 01GPU podのレンタルと削除
- 02コマンド実行とGPU状態の確認
- 03Python関数のpodへのオフロード
- 04バックグラウンドジョブの実行と再接続
- 05マルチノードクラスターの作成
活用シーン
- 01GPU推論やトレーニングの実行
- 02スクリプトによるpodライフサイクルの自動化
- 03複数GPUノードでの分散ジョブ実行
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
6掲載時のツール一覧 · 今日に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| limit | integer | いいえ | |
| gpu_type | any | いいえ | |
| gpu_count | any | いいえ |
詳細
翻訳後に原文が更新されています。最新の内容は原文をご確認ください。
Lium — Python SDK と CLI
lium.io は、Lium プラットフォーム上の GPU ポッドを管理するための、コマンドラインインターフェースとPython SDKの両方を提供する Python パッケージです。一度インストールすれば、用途に合ったインターフェースをお使いいただけます。
Lium
インストール
Python パッケージ
pip install lium.io
バイナリーのインストール(macOS amd64/arm64/Linux amd64/arm64)
curl -fsSL https://lium.io/install.sh | bash
新規にバイナリーをインストールすると、バージョン付きバイナリー ~/.lium/versions/<version>/lium を指す管理対象のシンボリックリンクが ~/.lium/bin/lium に作成されます。
クイックスタート
CLI
# First-time setup: create an account (mints and stores an API key) …
lium signup --email [email protected]
# … or link an existing account (opens a browser). Headless (agents, CI, containers): pass the key
# instead — lium init --api-key sk_... (keys: https://lium.io/api-keys), or export LIUM_API_KEY and skip init.
lium init
lium balance
# List available nodes (GPU machines)
lium ls
# Price a job on node #1 before renting it (no API key needed)
lium quote 1 --hours 2
# Create a pod using node index
lium up 1 # Use node #1 from previous ls
# Or create a pod using filters
lium up --gpu A100 # Auto-select best A100 node
# List your pods
lium ps
lium ps --filter status=RUNNING --sort spent # running pods, most expensive so far first
lium spend # burn per hour, spend per pod, runway
# Copy files to pod
lium scp 1 ./my_script.py
# SSH into a pod
lium ssh <pod-name>
# Stop a pod — billing is per second and runs until you do this
lium rm <pod-name>
ポッド利用開始から最初の1時間
レンタルしたばかりのポッドで時間を節約するためのヒントをいくつか紹介します(完全版は docs/getting-started.rst をご覧ください)。
lium upには必ず--ttl(または--until)を指定してください。ポッドは削除されるまで課金されます。- ポッドのローカルボリューム(標準テンプレートでは
/root、SDK ではpod.volume_path)は、lium bkでバックアップでき、暗号化の対象となる唯一のパスです。アタッチされたボリュームは/mntの下にあります。それ以外(/workspace、/tmp)は通常のコンテナファイルシステムで、暗号化もバックアップもされません。重み、データセット、Hugging Face キャッシュはボリュームに保存してください。mkdir -p /root/hf /root/logs; export HF_HOME=/root/hf HF_HUB_ENABLE_HF_TRANSFER=1 - Ubuntu 24.04 イメージでは、venv(
python -m venv /root/venv)を使うか、pip installの前にexport PIP_BREAK_SYSTEM_PACKAGES=1を実行してください。 - Blackwell GPU(B200、B300、RTX PRO 6000、RTX 5090)には cu128 以降の PyTorch ビルドが必要です。
pip install torch --index-url https://download.pytorch.org/whl/cu130を実行してください。FlashAttention-3 は Hopper 専用です。Blackwell では FlashAttention-4 または cuDNN attention を使用してください。 - ツールが不足している場合:
apt-get update && apt-get install -y ffmpeg rsync - バックグラウンドジョブ:
nohup setsid cmd > /root/logs/x.log 2>&1 < /dev/null & - 使用率の確認:
nvidia-smi --query-gpu=timestamp,index,utilization.gpu,memory.used --format=csv -l 5 > /root/logs/gpu.csv &
SDK
SDK は CLI の機能をプログラムから利用できるようにしたものです。エントリーポイントは 2 つあります。関数をすばやく切り離して実行するための @lium.machine デコレーターと、長時間にわたるオーケストレーションコード向けの Lium() クライアントです。
高水準のデコレーター — 関数に注釈を付け、GPU ポッドに処理をオフロードします。machine は "<count>x<gpu>" または "<gpu>"("1xH200"、"A100"、"2xRTX4090"。count の既定値は 1 です。GPU 名は lium ls --gpu で受け付けられる名前を使用し、完全一致で照合されるため、"A100" が RTX A1000 を借りることはありません)で、条件に一致するノードのうち最も安価なものが借りられます。timeout=(既定値は 1 h)は実行時間とポッドの存続時間の上限を設定します。引数は pickle として送信されます(独自のバイト列を作成し、自分のポッドで読み込みます)。結果は JSON エンベロープと、allow_pickle=False で読み込む numpy 配列用の .npz サイドカーとして返されるため、ポッドが書き込んだものが自分のマシンで unpickle されることはありません。往復可能な型は、None/bool/int/float/str/bytes、これらの型を含む list/tuple/set/frozenset/dict、datetime/date/time/timedelta、Decimal、pathlib.Path、uuid.UUID、(Python オブジェクトを含まない任意の dtype の)numpy.ndarray、および numpy スカラーです。それ以外の型を返すと、ポッド上で型名を示す lium.ResultEncodingError が発生します(代わりに .tolist()、dict(x)、x.value を返してください)。送信されるのは関数自身の def だけなので、その関数内でインポートし、それ以外はすべて引数として渡してください。リモート側の例外は、その型が組み込み型であればその型で再送出されます(except ValueError が機能します。それ以外の型は名前付きの lium.RemoteExecutionError として届きます)。その原因は、リモートのトレースバック、終了コード、出力を含む lium.RemoteExecutionError です。
import lium
@lium.machine(machine="A100", requirements=["torch", "transformers", "accelerate"])
def infer(prompt: str) -> str:
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("sshleifer/tiny-gpt2")
model = AutoModelForCausalLM.from_pretrained("sshleifer/tiny-gpt2", device_map="cuda")
tokens = tokenizer(prompt, return_tensors="pt").to("cuda")
out = model.generate(**tokens, max_new_tokens=50)
return tokenizer.decode(out[0], skip_special_tokens=True)
print(infer("Who discovered penicillin?"))
keep_warm=300 を指定すると、次の呼び出しまたはスクリプトの次回実行に備えて、ポッドが 5 分間保持されます。infer.map(prompts) はすべての項目を 1 つのポッドで実行します。infer.local(...) は関数をここで実行します(local=True/LIUM_MACHINE_LOCAL=1 を指定すると、すべての呼び出しでローカル実行されます)。infer.close() はウォーム状態のポッドを削除します。進捗は stderr に出力されます(非表示にするには quiet=True を指定します)。
[lium] infer: renting 1xA100 $1.20/h (swift-fox-c8, US), removal in 1.2h
[lium] infer: pod ready in 48s
[lium] infer: preparing environment (3 package(s): torch, transformers, accelerate)
[lium] infer: environment ready in 21s
[lium] infer: running
[lium] infer: done in 96s (~$0.0320)
[lium] infer: pod removed
直接 SDK を使用する場合も、同じパターンに従います。
from lium.sdk import Lium
lium = Lium()
# the cheapest available 1×A100 with at least 32 CPUs, chosen and rented in one call
rented = lium.rent(gpu_type="A100", min_cpus=32, name="demo")
print(f"{rented.executor.huid} at ${rented.price_per_hour:.2f}/h")
ready = lium.wait_ready(rented.pod, timeout=600) # None only if still starting after 600 s
print(lium.exec(ready, command="nvidia-smi", timeout=60)["stdout"])
lium.down(ready)
ポッドが FAILED/CREATION_FAILED/STOPPED/BROKEN に達した場合、またはポッド一覧から消えた場合、wait_ready() は .pod、.status、.history、.cause(バックエンドに記録された内容。例:Container creation failed due to ... (failure_step: ssh_connect))を含む PodStartError を発生させます。これにより、停止したポッドを起動の遅いポッドと取り違えません。すべてのポーリングについて通知を受けるには、on_poll=lambda pod, status, elapsed: ... を渡します。lium up は、借りる処理全体に対して --timeout SECONDS(既定値は 900)で上限を設定します。待機中は waiting for <pod>… <STATUS> (<n> s) と出力し、時間切れになるとポッド名を示して 1 で終了します。--ready-timeout が上限を設定するのは待機時間のみです。
長時間のジョブは、呼び出し元が保持するポッドで実行します。detach=True を指定するとバックグラウンドで開始され、すぐに戻ります。ポッドは削除するまで起動したままです。ノードの名前が必要な場合は lium.ls() でノードを一覧表示します。up(wait=True) はノードを借りて、準備完了したポッドを返します。
node = lium.ls(gpu_type="A100")[0]
pod = lium.up(executor_id=node.id, name="train", wait=True)
job = lium.exec(pod, command="python train.py", detach=True) # {"pid", "log_path", "command"}
for gpu in lium.gpu_stats(pod): # parsed nvidia-smi
print(gpu.index, gpu.utilization_pct, gpu.memory_pct)
print(pod.to_dict()) # JSON-ready
# later: lium.down(pod)
処理を利用するコードより長く存続させたくない場合は、rental() で名前付きノードを借りて with ブロック内で使用し、ブロックを抜ける際に、内部で何が起きたかにかかわらずポッドを削除します。そのため、処理はブロック内で完了させてください(ここで開始したデタッチ済みのジョブも、ポッドとともに終了します)。上記の rent() は別の方法です。指定内容に基づいてノードを選び、自分が所有するポッドを渡します。
with lium.rental(executor_id=node.id, name="eval") as pod:
result = lium.exec(pod, command="python eval.py", timeout=1800)
print(result["stdout"])
lium.pod_by_name("job") は、名前、huid、または id でポッドを検索します。
サーバーやトレーニング実行は、それを開始する呼び出しよりも長く存続させる必要があります。run_background() は PID ファイル、終了コードファイル、ポッド上のログを使用して、処理をデタッチ状態で開始します(さらに .id ファイルにプロセスのブート ID と開始時刻を保存するため、status() と kill() が、ポッドの再起動後に再利用された PID をそのジョブのものとして扱うことはありません。このファイルがないジョブは gone と表示され、シグナルは送られません)。返される Job は、その処理の終了を待機する方法を備えています。
job = lium.run_background(pod, "vllm serve Qwen/Qwen3-8B --port 8000", name="vllm")
job.wait_for_port(8000, timeout=900) # raises at once, with the log tail, if vllm dies first
print(job.logs(tail=20))
# later, from another process or agent turn:
job = lium.job(pod, "vllm") # re-attach by name; job.status(), job.kill()
ジョブなしでポートをプローブするには(起動時にサービスを提供するテンプレートの場合など)、lium.wait_for_port(pod, 8000) を使用します。lium.wait_ready(pod, ready_port=8000) は、RUNNING になることとポートが利用可能になることの両方を待ちます。
マルチノードクラスター — 1 つの InfiniBand/RoCE ファブリック上にある N 個のノード全体を 1 回の注文で借り、それぞれにプライベートなオーバーレイアドレスを割り当てます。
offer = lium.clusters()[0] # fabrics with free nodes
cluster = lium.up_cluster([n.id for n in offer.cheapest(2)], name="train", wait=True)
print(cluster.master_addr) # 10.42.0.1 — MASTER_ADDR for torchrun
for pod in cluster.pods:
lium.exec(pod, command=f"torchrun {cluster.torchrun_args(pod)} --nproc_per_node 8 train.py")
open("hostfile", "w").write(cluster.hostfile()) # mpirun / DeepSpeed
lium.rm_cluster(cluster) # one DELETE /clusters/{id}; one result per member
up_cluster() は、ノードがレンタル済み、またはレンタルされている可能性があるものの、ポッド一覧にクラスター全体が表示されなかった場合に ClusterNotListedError を発生させます(.confirmed は API が注文を確認したかどうかを示し、.pod_ids と .listed は API が返したものと一覧に表示されたものを示します)。再度レンタルせず、ポッドを一覧表示してクラスターを見つけてください。wait_cluster_ready() は、メンバーの起動に失敗した場合、またはポッド一覧にメンバーが見つからない場合、直ちに PodStartError を発生させます。rm_cluster() は DELETE /clusters/{cluster_id} を1回送信します。API はすべてのメンバーを削除し、メンバーごとに1行(pod、huid、name、node_rank、success、message、error)を返します。削除に失敗したメンバーは報告され、残りのメンバーは引き続き削除されるため、そのメンバーを再試行するには再度呼び出してください。404(クラスターがすでに存在しない場合、または API にそのルートがない場合)では LiumNotFoundError が発生し、何も削除されません。ポッド単位の代替処理はありません。
API リファレンス全文:https://docs.lium.io/developers/sdk/reference
lium.ssh(pod) は、Configuration で説明されているピン留めされたホストキーのオプションと -i <key> を含む、ポッドの ssh コマンドを返します。再起動後にポッドの現在のホストとポートからコマンドを再構築するには、refresh=True を渡してください(lium.refresh_pod(pod) は ID または huid で1つのポッドを再取得します。ポッドが存在しない場合は LiumNotFoundError が発生します)。lium ps --format json と lium describe(テーブル形式および --json)には、同じコマンドが ssh_command として -i なしで表示されます(キーのパスはポッドレコードではなく SDK の設定にあります)。JSON では API の生の値が ssh_cmd として保持されます。
ドキュメント
- CLI ドキュメント: https://docs.lium.io/developers/cli/overview
- SDK ドキュメント: https://docs.lium.io/developers/sdk
- 終了コードと JSON エラーエンベロープ: docs/exit-codes.md — コマンドが失敗したときにスクリプトやエージェントが受け取る内容(
--format json、LIUM_OUTPUT=json)。 - エージェントとスクリプト: docs/agents.md — 非対話型の一連の流れ(環境変数による認証、JSON 出力、終了コード、
up → exec → rsync → rm、ポッドに関する注意点)。
バイナリリリース
- 対応するバイナリのターゲット:
darwin-amd64、darwin-arm64、linux-amd64、linux-arm64 - メンテナーは
bash scripts/build.sh [macos|linux|all]でローカルビルドできます(Linux ビルドにはDockerfile.buildを使用します) - リリースは
vX.Y.Zタグで公開される GitHub リリースです(.github/workflows/release.yml)。バージョンはタグから取得され(hatch-vcs。ツリー内のファイルは変更されません)、ワークフローは.sha256チェックサム付きの4つのバイナリをビルドし、install.sh、統合されたchecksums.txt、sdist/wheel とともにリリースへアップロードしてから、プレリリースフラグを解除します。別のジョブでは、Python ビルドが成功するとすぐに、バイナリとは独立して sdist/wheel を PyPI に公開します。アセットのアップロード前にlatestがこのリリースを指さないよう、--prereleaseを指定してリリースを作成してください。 - 変更は
changelog.d/のフラグメントとして記録します(PR ごとに1ファイル、チケット名をファイル名にします。changelog.d/README.mdを参照)。リリース時にscripts/changelog.pyでCHANGELOG.mdにまとめます。
CLI リファレンス
lium CLI では、ポッドのライフサイクル全体を操作できます。すべての項目を確認するには lium --help を実行するか、以下のリファレンスをご覧ください。
コアコマンド
lium signup- ターミナルからアカウントを作成し、API キーを保存しますlium init- 既存のアカウントの設定(API キー、SSH キー)を初期化します。ブラウザーを使えないマシンでは--api-key <key>を指定します。再ログインするには--forceを指定しますlium completion [bash|zsh|fish] [--install]- シェルのタブ補完を表示またはインストールしますlium balance- アカウント残高を表示します(機械可読形式で出力するには--format jsonを追加します)lium whoami- 使用中の API キー、その取得元、およびキーが属するアカウントを表示しますlium ls [--gpu TYPE] [--count N] [--country CODE] [--min-vram GB] [--max-price USD] [--tier spot|secure] [--format json]- 利用可能なノードを一覧表示しますlium up [NODE_ID]- ポッドを作成します(NODE_ID はlium lsに表示される HUID または UUID、もしくは行番号です。または--gpu、--count、--countryなどのフィルターを使用できます。--ttl 6hまたは--budget 12.50で上限を設定できます。--jsonを指定すると、SSH を開く代わりに起動準備ができたポッドを JSON で出力します)lium ps [--sort KEY] [--filter KEY=VALUE] [--key NAME|ID] [--watch N] [--wide] [--format json]- アクティブなポッドを一覧表示します。#列は行番号です。同じシェル内でrm/ssh/exec/scpが受け付けますが、有効なのは 10 分間で、その行に表示されたポッドが引き続き一覧にある場合に限ります。行番号は、最後に一覧表示したときの行(表示順はソートまたはフィルター適用後)です。スクリプトでは huid を使用してください。PENDING 状態のポッドについては、バックエンドの起動見込みとフェーズがテーブルの下に表示されます。表示文言はlium upの場合と同じです(eager-wolf-aa PENDING · est. ready in ~18 s (phase: pulling image))。--format jsonの行には同じテキストがeta_hintとして含まれます(バックエンドからどちらも送信されていない場合はnull)lium spend [--format json]- 時間あたりの消費額、ポッドごとの推定支出、残高、利用可能期間を表示しますlium record <pod> [--format json]- 実行環境(GPU、イメージ、ドライバー/CUDA、インターコネクト)と費用を表示します。ポッド削除後も UUID を指定すれば利用できますlium quote <node> --hours N [--gpus N] [--volume-gb N] [--backup-gb N] [--format json]- レンタル前に、請求料金に基づいてノードでのジョブの計算、ボリューム、バックアップの費用を表示しますlium describe <POD>- 1 つのポッドの完全なマニフェストを表示します。ポート、GPU、テンプレート、請求情報、最後のライフサイクルイベント(REBOOT_FAILED/BROKEN になった理由)、ノードのディスク状態が含まれます(機械可読形式で出力するには--jsonを追加します)。削除済みのポッドも ID で説明を取得できます。バックエンドに保存されているイベントと、ポッドが終了した理由が表示されますlium ssh <POD>- ポッドに SSH 接続しますlium exec <POD> <COMMAND>- ポッドでコマンドを実行します(stdout/stderr/exit_code を取得するには--jsonを指定します。-d/--detachはバックグラウンドで起動してすぐに戻ります。--max-output-bytes Nで出力上限を設定します。既定値は 64 MiB です)lium logs <POD>- ポッドのコンテナログをストリーミング表示しますlium port-forward <POD> <PORT>- ローカルポートをポッドのポートに転送しますlium scp <POD> <LOCAL_FILE> [REMOTE_PATH]- ポッドにファイルをコピーします(ポッドからダウンロードするには-dを追加します)lium rsync <POD> <LOCAL_DIR> [REMOTE_PATH]- ディレクトリをポッドに同期します(--bwlimit、--exclude、--delete、--progressを指定できます。再実行時には処理を再開します)lium cp <SRC_POD>:<PATH> <DST_POD>:<PATH>- SSH 経由でポッド間のファイルをコピーしますlium rm <POD>- ポッドを削除/停止します(スクリプトでlium psの行番号を拒否するには--name-onlyを指定します。--format jsonは削除対象と推定支出を出力します。--rating 1-5 --feedback "..."を指定すると、同じ呼び出しでノードを評価します)lium reboot <POD>- ポッドを再起動しますlium audit [--pod POD] [--since 24h] [--key ID]- アカウントのポッドに対して誰が何をいつ行ったかを表示します。レンタル、再起動、編集、削除ごとに、要求に使用されたセッションまたは API キーが記録されています(機械可読形式で出力するには--jsonを追加します)lium audit --account [--action pod.] [--source cli] [--since 7d] [--cursor <next_cursor>]- アカウント監査ログを表示します。何かを変更したすべてのリクエスト(ポッド、キー、ログイン、残高、設定、チームメンバー)について、使用したクライアントと IP が記録されています。対象は本人の IP のみで、期間は 90 日です(--jsonはnext_cursorを含むページを出力します)lium update <POD> --jupyter <PORT>- ポッドに Jupyter Notebook をインストールし、指定した内部ポートで公開します(更新できるのは--jupyterのみです。指定しない場合、コマンドはNo updates specifiedと出力します)lium templates [SEARCH] [--arch hopper|blackwell] [--format json]- CUDA ビルドと実行可能な GPU 世代を含む Docker テンプレートを一覧表示しますlium fund- ウォレットの TAO でアカウントに入金します(alpha ステークで支払うには--alpha -k <hotkey> -a <USD>を追加します。Lium が受け付ける任意のサブネットから支払うには--netuid <N>を追加します。指定しない場合はプライマリーサブネットから支払います)lium topup create -a <USD> -c <COIN> -n <NETWORK>- ステーブルコインでチャージします(lium topup currenciesで利用可能な通貨を一覧表示できます)lium topup card -a <USD> [--card <pm_id>] [--yes]- アカウントに保存されたカードにブラウザーなしで課金します。API キーにはbillingスコープが必要です(未リリース:プラットフォームのスイッチがオフです)。最初に確認を求めます。--yesを指定すると確認を省略でき、--jsonには--yesが必要です。冪等性キーを使って 1 回だけ送信します。応答が失われた場合、またはpayment_intent_idを伴わない 202 が返された場合は、キーと再実行に使う同じ金額を示して終了コード 6 で終了します(「課金された可能性があります」/「確認中です」)。キーなしでの再試行は行いません。payment_intent_idを伴う 202 は成功です(終了コード 0)。同じキーでも金額が異なる場合は新たな課金になります。3-D Secure の追加認証(URL を伴うCARD_AUTHENTICATION_REQUIRED)では、認証用 URL、トランザクション ID、同じ--idempotency-keyを使った正確な再実行方法を示して終了コード 6 で終了します。新しいキーを使うと 2 回目の支払いが開始されますlium ssh-keys list|sync- アカウントに登録されている SSH 公開鍵を一覧表示または同期しますls、ps、spend、templates、balance、describeはすべて--format json(および--json)を受け付けます。rmは--format jsonを、upは--jsonを受け付けます。コマンドが失敗すると、いずれも stderr に JSON エラーエンベロープを出力するため、スクリプトではすべてのコマンドで同じフラグを使用できます。
ボリュームコマンド
lium volumes list- すべてのボリュームを一覧表示しますlium volumes new <NAME>- 新しいボリュームを作成しますlium volumes rm <INDICES>- 直近のlium volumes一覧に表示された行番号でボリュームを削除します(1または1,3)。一覧は同じシェルから取得したもので、10 分以内のものに限られます。それ以外の場合、再度一覧を表示するよう求められます
クラスターコマンド
lium clusters- 1 つのマルチノードクラスターとして借りられる、空きノードのあるファブリック(InfiniBand/RoCE)を表示しますlium clusters up <FABRIC> --nodes N -n <NAME>- 1 つのファブリックのノードを N 台、すべて成功するかすべて失敗する形で、単一のクラスターとして借りますlium clusters ps- クラスターを表示しますlium clusters show <CLUSTER> [--hostfile | --torchrun RANK]- ランク、オーバーレイ IP、SSH 接続情報を含むメンバーと、ランチャー用の情報を表示しますlium clusters rm <CLUSTER>- 1 回の API 呼び出しですべてのメンバーを削除します(クラスターが存在しない場合は終了コード 5)
バックアップコマンド
lium bk show <POD>- ポッドのバックアップ設定を表示しますlium bk set <POD> --path <PATH>- 自動バックアップを設定しますlium bk logs <POD>- バックアップログを表示しますlium bk now <POD>- バックアップをただちに実行しますlium bk cancel --id <BACKUP_ID>- 実行中のバックアップをキャンセルし、履歴は保持しますlium bk delete --id <BACKUP_ID>- 完了したバックアップの保存データを削除しますlium bk restore <POD> --id <BACKUP_ID>- バックアップから復元しますlium bk restore-cancel --id <RESTORE_ID>- 実行中の復元をキャンセルしますlium bk rm <POD>- バックアップ設定を削除します
スケジュールコマンド
lium schedules list- 予定されている終了を一覧表示しますlium schedules rm <POD>- 予定されている終了をキャンセルします
ワークスペースコマンド
チームはワークスペースを共有し、料金はそのワークスペースの請求オーナーが支払います。API キーは 1 つのワークスペースに紐付けられているため、どのコマンドでも --workspace NAME は「NAME に保存されたキーを使用する」という意味で、それ以外の動作はありません。ワークスペースに対応していないサーバーでは、これらのコマンドはその旨を表示します(終了コード 3)。その他のすべてのコマンドの動作はこれまでどおりです。
lium workspaces [list]- このキーが操作するワークスペース(表示されるロールは、そのキーで実行されるアカウントのロールです。チームキーの場合は請求オーナーのロールです)。lium workspaces loginの実行後は、自分が所属するすべてのワークスペースと各ワークスペースでの自分のロールも表示されますlium workspaces members [WORKSPACE]- メンバー、ロール、支払い担当者lium workspaces use <WORKSPACE>- すべてのコマンドで使うデフォルトのワークスペース(~/.lium/config.ini)。LIUM_API_KEY=<a key bound to it> lium workspaces use <WORKSPACE>として実行すると、そのキーが--workspace用に保存されますlium workspaces login- 以下のセッション限定サブコマンドを使うために、一度ログインします(メールアドレス + パスワード)。API キーは不要です。保存済みのキーがない場合、lium keysはセッションだけで実行されますlium workspaces create <NAME> [--use]- ワークスペースを作成します。作成者はオーナー兼請求オーナーになりますlium workspaces invite <EMAIL> [WORKSPACE] [--role member|admin|owner]- メールで招待状を送ります(招待相手はまだアカウントを持っていなくてもかまいません)lium workspaces remove <USER_ID_OR_EMAIL> [WORKSPACE] [--yes]- メンバーを削除します。最初に確認します(オーナーと請求オーナーは削除できません。サーバーからその旨が通知されます)lium workspaces transfer-billing <USER_ID_OR_EMAIL> [WORKSPACE] [--yes]- 別のメンバーに請求を引き継ぎます(最初に確認します)lium workspaces delete [WORKSPACE] [--yes]- ワークスペースを削除します。最初に確認します(オーナーのみ実行できます。ポッドが稼働中、またはボリュームが存在する場合は拒否されます)。設定セクションも削除されますlium keys list [--workspace W]/lium keys create <NAME> [--scope read|rent|manage|billing]… [--daily-budget USD] [--monthly-budget USD] [--max-budget USD] [--pod-visibility own|account] [--workspace W] [--save]- ワークスペースごとの API キーです。--saveを指定すると、そのキーが--workspace用に保存されます。--scopeを指定しない場合、キーにはread、rent、manageが付与されます。billing(カード決済、クレジット移転、API 経由の暗号資産決済)は、明示的に指定した場合に限り、最初に警告を表示したうえで単独で付与されます。--scope billingに他のスコープを併記すると、リクエストを送信する前にここで拒否されます(終了コード 2)。予算(UTC の日単位、UTC の月単位、キーの有効期間全体)は、キーのポッドを削除し(ボリューム外のデータは失われます)、ポッドへの請求額が予算に達すると、そのキーによるレンタル、ポッドスケジュールの変更、トップアップを拒否します(budget_exceeded、終了コード 6。超過した期間が表示されます)。--pod-visibility ownを指定すると、そのキーがレンタルしたポッドのみが表示され、accountを指定するとすべてのポッドが表示されます。未指定の場合はサーバーのデフォルトが適用されます。listには、スコープ、各期間の使用額と予算、キーごとの稼働中のポッド数が表示されます。--scope billingとその金銭関連操作のルール(カード決済、クレジット移転、API 経由の暗号資産決済にはbillingを持つキーが必要です)、予算、表示範囲、ポッド数には、新しいバージョンの Lium サーバーが必要です。予算、表示範囲、またはポッド数を指定した際に、それを記録しないサーバーの場合(それぞれ個別に判定されます)、--allow-unbudgetedを指定しない限りcreateは拒否されます(終了コード 2。サーバーが上限なしで発行したキーは失効します)lium keys show <NAME|ID>/lium keys scopes- サーバーの表現による「このキーでできること」(GET /keys/scopes)、各期間の使用額と予算、そのキーのポッド、予算超過によって拒否された直近のリクエスト(GET /keys/{id}/refusals:本日の拒否件数、最新のリクエストのルート、金額、期間)をキーごとに表示します / すべてのスコープとポッド表示範囲の値、およびそれぞれで許可される操作を表示します。どちらも新しいバージョンの Lium サーバーが必要です。古いサーバーではscopesに対してnot_foundが返され、showではスコープ名のみが表示されますlium keys budget <NAME|ID> [--daily-budget USD] [--monthly-budget USD] [--max-budget USD] [--no-daily-budget] [--no-monthly-budget] [--no-max-budget]- 作成後にキーの予算を設定または解除します(PATCH /keys/{id}。1 ドル以上、1 セント単位で、日次 ≤ 月次 ≤ 上限です。指定していない予算は変更されません)。スコープとポッド表示範囲は作成時のままです。キーごとの予算に対応したサーバーが必要です(古いサーバーにはこのルートがなく、記録されていない期間の予算は拒否されます。終了コード 2)lium ps --key <NAME|ID>/lium billing history [--key <NAME|ID>] [--from YYYY-MM-DD] [--to YYYY-MM-DD] [--format json]- 1 つの API キーがレンタルしたポッドを表示します / アカウントまたは指定したキーについて、ポッドごとに台帳へ請求された金額を表示します。削除済みのポッドも含まれます(GET /billing/statement)。キーごとの絞り込みには、ポッドと請求に使用したキーを記録するサーバーが必要です。古いサーバーでは絞り込めず、どちらのコマンドもその旨を表示して、アカウント全体の数値をアカウントのものとして表示します。キー名を使うにはlium workspaces loginが必要ですが、ID では不要ですlium --workspace NAME <command>/LIUM_WORKSPACE=NAME- NAME 用に保存されたキーを使ってコマンドを 1 つ実行します(キーが保存されていない場合は拒否されます。終了コード 2)。ps、ls、up、rmは操作対象のワークスペースを表示します。そのキーが別のワークスペースで使われることが判明した場合、up/rmは拒否され(終了コード 2)、ps/lsは警告を表示します。lium workspaces …とlium keys …自体は、LIUM_API_KEY、それがなければ NAME 用に保存されたキー、さらにそれもなければ保存済みのデフォルト用キー、最後に[api] api_keyの順で使って実行されるため、不足しているキーを発行または保存できます
Configuration コマンド
lium config show- すべての設定を表示しますlium config get <KEY>- 設定値を取得しますlium config set <KEY> <VALUE>- 設定値を設定しますlium config unset <KEY>- 設定キーを削除しますlium config edit- 設定ファイルを編集しますlium config path- 設定ファイルのパスを表示しますlium config reset- すべての設定をリセットします
プロバイダーコマンド
lium provider … はプロバイダー側の CLI で、ポータルのフロントエンド(lium.io/portal)と同等の自動化機能を備えています。ポータル認証、ノードのライフサイクル管理、central-miner-server の設定、一括同期、請求、マシンリクエストの照会に対応しています。ホットキーの登録は引き続き btcli subnet register で別途行います。
すべてのサブコマンドで継承されるグループレベルのフラグ:-w/--coldkey、-k/--hotkey、--portal-url、--json、--debug、-y/--yes、--dry-run。lium config set provider.coldkey <NAME> と lium config set provider.hotkey <NAME> でウォレットの識別情報を一度だけ保存します。支出に影響するサブコマンドでは、--yes または LIUM_PROVIDER_ACK=1 が設定されていない場合、ペルソナプロンプトが表示されます。
lium provider portal {login,logout,whoami}- キャッシュされたポータル JWT を管理しますlium provider status [--netuid 51]- プロバイダーの集約スナップショット(登録、ポータルセッション、ノード、バリデーターの重み)lium provider node list|get|add|rm|update-price|update-gpu|address- ポータル上のノードのライフサイクル管理。node list [--all | --miner-hotkey HK]はデフォルトで現在のホットキーのノードを表示し、--allはすべてのプロバイダーのノードを表示しますlium provider node address <NODE_ID> <IP> <PORT>- ノードの IP とポートをその場で変更します(ID と履歴は維持されます)。ISP による IP アドレス変更後などに使用しますlium provider node min-gpu set|unset <NODE_ID> [COUNT]- レンタルのマッチングに使用する最小 GPU 数lium provider node pods <NODE_ID>- ノードで現在レンタルされている Podlium provider node machine-requests <NODE_ID>- ノードへの保留中のテナントリクエストlium provider node notice-period set <NODE_ID> --start <ISO 8601> --minutes N | --permanent [--reason TEXT]- 通知期間を開始します。最長 60 分のメンテナンス期間、または恒久的な削除を指定できますlium provider node notice-period unset <NODE_ID>- ノードの通知期間を終了しますlium provider node notify-added <NODE_ID> --request-id <REQ>- テナントのマシンリクエストが完了したことを記録しますlium provider config show|opt-in|opt-out|set-email|set-subscriptions- ポータルアカウントの設定(lium.io の central miner server の切り替えを含む)lium provider sync from-miner-server|to-miner-server- ポータルと central miner server 間でノードの状態を一括同期しますlium provider billing list [--from YYYY-MM-DD] [--to YYYY-MM-DD]- 日ごとの収益台帳(サインイン中のプロバイダー自身の明細。デフォルトは直近 30 日分、最大 90 日分)lium provider machine-request list|get- 保留中のテナントのマシンリクエスト(リクエストごとの詳細を取得できるのは、所有するノードのいずれかがバリデーターによって検証された後に限られます。それまではlistは GPU クラスと時間単位の予算帯ごとの件数を返し、getはPORTAL_FORBIDDENで終了コード 2 を返します)lium provider machine list|estimate- マシンカタログと報酬の見積もり
すべてのフラグと実行可能な例を含む完全なリファレンス:https://docs.lium.io/developers/cli/reference/provider
その他のコマンド
lium mcp- エージェントホスト向けに、stdio 経由で Lium を MCP サーバーとして提供します(pip install "lium.io[mcp]"。詳しくはエージェントホスト向け MCP サーバーを参照してください)lium theme dark|light- CLI のカラーテーマを設定します(引数は必須です。autoはありません。値は[ui] themeとして保存され、lium config get ui.themeで確認できます)lium mine- このホストをプロバイダーノードとしてセットアップしますlium mine --register <TOKEN>- 同様にセットアップし、ホストから報告された情報を使ってポータルアカウントにノードを追加し、一覧に表示されるまで待ちます(トークンはポータルの「Add Node」ページから取得します。アカウントとノードが情報を報告する対象はトークンによって決まります。-kは使用しません)sudo lium gpu-splitting setup [--device /dev/...] [--yes]- LIUM の GPU 分割用に Docker ストレージを準備しますlium gpu-splitting check [--device /dev/...]- ホストを調査し、GPU 分割の計画を表示しますlium gpu-splitting verify- Docker ストレージが LIUM の GPU 分割要件を満たしていることを確認します
コマンドの例
# Filter nodes
lium ls --gpu H100
lium ls --gpu H100 --count 8 --country US,NL --max-price 2.50
lium ls --min-vram 80 --min-cuda 12.8 --tier secure
lium ls --format json # machine-readable
# Multi-GPU jobs: only nodes whose GPUs are all on NVLink (Link column NV#), and a floor on
# the Download (Mbps) column — tensor parallelism and 700 GB checkpoints behave very
# differently on a PCIe box or a slow link that the price does not reveal
lium ls --gpu H200 --nvlink --min-download 2000
# Create pod with node index
lium up 1 --name my-pod --yes
# Create pod with filters (auto-selects best node)
lium up --gpu A100 --count 8 --name my-pod --yes
lium up --gpu H200 --country US
# Create pod with specific template
lium up 1 --template_id <TEMPLATE_ID> --yes
# Set up node bootstrap flow
lium mine --auto --hotkey <HOTKEY>
# One command from a bare host to a listed node: the portal's Add Node page prints this line with a
# one-hour token; GPU model/count, port and address are read from the host, the price is the portal base price for the model
curl -fsSL https://lium.io/mine.sh | bash -s -- --register <TOKEN>
lium mine --register <TOKEN> --wait 0 # add the node, do not wait for the validator
# Node behind CGNAT or a port-forwarding VPS: register the VPS address and forwarded port
lium mine --auto --hotkey <HOTKEY> --ip <VPS_IP> --external-port <FORWARDED_PORT> --internal-port 8080
# Provider-portal automation (same surface as the portal frontend)
lium config set provider.coldkey miner-prod # one-time: persist wallet identity
lium config set provider.hotkey miner-1
lium provider portal login # JWT exchange via hotkey signature
lium provider status # registration, portal session, nodes, weights
lium provider node list --limit 50
lium provider node add --gpu-type "NVIDIA H200 NVL" --gpu-count 8 \
--ip 203.0.113.42 --port 8080 --price 1.85 --yes
lium provider node update-price <NODE_ID> --price 2.10 --yes
lium provider node address <NODE_ID> 203.0.113.77 8080 --yes
lium provider config opt-in --yes # use lium.io's central miner server
lium provider machine estimate --gpu-type "NVIDIA H200 NVL" --gpu-count 8
lium provider --json status # JSON envelope for scripts/agents
# Inspect or configure Docker storage for GPU splitting (Ubuntu/Debian + systemd, run setup as root)
lium gpu-splitting check
sudo lium gpu-splitting setup --yes
lium gpu-splitting verify
# Create pod with volume
lium up 1 --volume id:<VOLUME_HUID>
lium up 1 --volume new:name=mydata,desc="My dataset"
# Create pod with auto-termination
lium up 1 --ttl 6h # Terminate after 6 hours
lium up 1 --budget 12.50 # Terminate once $12.50 has been spent
lium up 1 --until "today 23:00" # Terminate at 11 PM today
# Create pod with Jupyter
lium up 1 --jupyter --yes
# Fail (non-zero exit) if the pod exposes a different GPU count than requested or billed
lium up --gpu H200 --count 8 --verify-gpus --yes # also counts GPUs with nvidia-smi over SSH
lium up --gpu H200 --count 8 --verify-gpus --strict-gpus # ...and remove the pod on mismatch
# Execute commands
lium exec my-pod "nvidia-smi"
lium exec my-pod "python train.py"
# Start a long job in the background and return immediately (prints PID and log path)
lium exec my-pod -d "python train.py" # log: /workspace/logs/exec-<timestamp>-<id>.log
lium exec my-pod -d --log /workspace/train.log --script train.sh
lium exec my-pod "tail -n 200 /workspace/train.log" # exec returns output when the command exits, so read a bounded slice
# Copy files to and from pods
lium scp my-pod ./script.py # Copy to /root/script.py
lium scp 1 ./data.csv /root/data/ # Copy to specific directory
lium scp all ./config.json # Copy to all pods
lium scp 1,2,3 ./model.py /root/models/ # Copy to multiple pods
lium scp my-pod /root/output.log ./downloads -d # Download into ./downloads directory
# Reboot pods
lium reboot my-pod # Reboot a single pod
lium reboot 1,2 # Reboot pods 1 and 2 (no confirmation prompt)
lium reboot all # Reboot all active pods
lium reboot my-pod --volume-id <VOLUME_ID> # Reboot with a specific volume ID
# Sync directories to pods
lium rsync my-pod ./project # Sync to /root/project
lium rsync 1 ./data /root/datasets/ # Sync to specific directory
lium rsync all ./models # Sync to all pods
lium rsync 1,2,3 ./code /root/workspace/ # Sync to multiple pods
lium rsync my-pod ./ckpt /workspace/ckpt --bwlimit 20000 --exclude '*.tmp' --progress
# Throttled, filtered, with progress; re-run to resume
# Copy between pods directly (data never passes through your machine)
lium cp dev-pod:/workspace/src train-pod:/workspace/
lium cp 1:/workspace/ckpt/ 2:/workspace/ckpt/ --exclude '*.tmp'
# Remove multiple pods
lium rm my-pod-1 my-pod-2
lium rm all # Remove all pods
# Install Jupyter on existing pod (internal port 8888)
lium update my-pod --jupyter 8888
# Manage volumes
lium volumes list
lium volumes new mydata --desc "My dataset"
lium volumes rm 1 # row 1 of the list above (same shell, under 10 minutes old)
# Multi-node clusters
lium clusters # fabrics with free nodes
lium clusters up 1 --nodes 2 -n train --ttl 6h # 2 whole nodes of fabric #1, one order
lium clusters show train --hostfile # 10.42.0.1 slots=8 / 10.42.0.2 slots=8
lium clusters show train --torchrun 1 # --nnodes 2 --node_rank 1 --master_addr 10.42.0.1 --master_port 29500
lium clusters rm train -y
# Manage backups
lium bk show my-pod
lium bk set my-pod --path /root/data --every 24h --keep 7d
lium bk logs my-pod
lium bk now my-pod --name manual-backup
lium bk cancel --id <BACKUP_ID>
lium bk delete --id <BACKUP_ID>
lium bk restore my-pod --id <BACKUP_ID> --to /root/restore
lium bk restore-cancel --id <RESTORE_ID>
lium bk rm my-pod
# Manage schedules
lium schedules list
lium schedules rm my-pod
# Configuration management
lium config show
lium config get api.api_key
lium config set ssh.key_path /path/to/key
lium config edit
# Theme management
lium theme dark # Set to dark theme
lium theme light # Set to light theme
# Fund account with TAO
lium fund # Interactive mode
lium fund -w default -a 1.5 # Fund with specific wallet and amount
lium fund -w mywal -a 0.5 -y # Skip confirmation
# Fund account with alpha stake (-a is USD)
lium fund --alpha -k <hotkey> -a 25 # Lium's primary subnet
lium fund --alpha -k <hotkey> -a 25 --netuid 64 # Any subnet Lium accepts
lium ls --format json のフィールド
ノードごとに 1 つのオブジェクトを返します。テーブルと同じ順序で並び、名前は安定しており、test/test_ls_speed.py で固定されています。
| フィールド | 意味 |
|---|---|
index | 行番号。lium up <index> で指定します |
id, huid | ノード UUID(API が必要とする値)と、人が使う ID(lium up <huid>) |
config, gpu_type, gpu_count, machine_name | 8×H100、H100、8、NVIDIA H100 80GB HBM3 |
available_gpu_count | 現在ノードで空いている GPU 数(サーバーから報告されない場合は null)。-c でこの数以下を借ります |
price_per_gpu_hour, price_per_hour | GPU 1 基あたりの 1 時間の料金(USD)と、ノード全体の 1 時間の料金 |
country, country_code, city | 国名、ISO コード、都市 |
vram_gb, ram_gb, cpu_count | GPU ごとの VRAM(GiB)、ホスト RAM(GiB)、CPU スレッド数 |
disk_gb, disk_total_gb | ホストディスクの空き容量と総容量(GiB) |
upload_mbps, download_mbps | バックエンドの実効速度。VerifyX のダウンロード速度、または検証ツールのサイクルで計測された平均値(計測値がある場合)、それ以外はノードの最新速度テスト値 |
upload_source, download_source | measured(検証済み、または平均値)または reported(単一の速度テスト値。テーブルでは ~)。速度が不明な場合は null |
available_ports | --ports に使用できる空きポート |
docker_in_docker | sysbox ランタイム。つまり、Pod 内で docker run を実行できます |
is_pareto | ★ マーク |
max_cuda_version | ドライバーがサポートする CUDA の最大バージョン |
tier | secure または spot(回収可能) |
link, nvlink, p2p | Link 列(NV18 は GPU あたり 18 リンクの NVLink、PCIe/SYS は最も低い PCIe クラス)。すべての GPU ペアが NVLink 接続の場合は true、すべてのペアが P2P チェックに合格した場合は true。Lium がノードのトポロジーを報告するまでは null |
interconnect | ノードのトポロジーオブジェクト。ペア数とリンク数、pcie_class、p2p を含みます。一覧には matrix は含まれません(GPU x GPU テーブルは lium describe <pod> に表示されます) |
gpu_power_limited, gpu_power_limit_w, gpu_power_limit_default_w | テーブルの ↓W マークをフィールドとして表します。GPU の電力上限がカードのデフォルト値の 95 % 未満に設定されている場合は true(ピーク性能はやや低くなります)、標準の電力設定では false、プラットフォームがノードを判定できない場合は null。最も制限されている GPU の現在の電力上限とデフォルト値(ワット) |
一覧では GET /executors?view=summary を使用し、ノードあたりのデータ量は約 8.6 KB ではなく約 1 KB です。サマリービューには、link、nvlink、p2p、interconnect が参照する nvlink キーと interconnect キーが含まれています。Lium.ls(view="full") は、ExecutorInfo.specs にノードのスクレイプデータ全体を返します。
機能
- デュアルインターフェース:同じパッケージに、
liumCLI と Python SDK(lium.sdk.Lium+@lium.machineデコレーター)の両方が含まれています - パレート最適化:
lsコマンドでは、最適なノードに★印が表示されます - 柔軟な Pod 作成:ノードのインデックスを指定するか、フィルター(GPU の種類、数、国)を使って自動選択できます
- インデックス選択:コマンドでは
lsの出力に表示される番号を使用できます - 全角幅のテーブル:見やすく読みやすいターミナル出力です
- コスト追跡:
psで支出と時間単価を確認できます - 対話型セットアップ:
initコマンドで簡単に利用を開始できます - ボリューム管理:永続ストレージボリュームを作成してアタッチできます
- バックアップと復元:頻度と保持期間を設定できる自動バックアップ機能です
- 自動終了:一定時間後、または指定した時刻に Pod を終了するようスケジュールできます
- Jupyter 統合:Pod に Jupyter をワンコマンドでインストールできます
- テーマ対応:見やすさを高めるライト、ダーク、自動検出のテーマを選べます
設定
設定は ~/.lium/config.ini に保存されます。
[api]
api_key = your-api-key-here
[ssh]
key_path = /home/user/.ssh/id_ed25519
環境変数も使用できます。
export LIUM_API_KEY=your-api-key-here
LIUM_API_KEY は設定ファイルより優先されます。シェルで使用されているキーを確認するには、lium whoami(または lium balance/lium config get api.api_key)を実行します。これらのコマンドはキーのフィンガープリントと取得元(env:LIUM_API_KEY または config:~/.lium/config.ini [api] api_key)を表示し、認証エラーにも同じキーが示されます。
ワークスペースを使用している場合、lium workspaces use(実行時のキーがそのワークスペースで有効な場合)と lium keys create --save は次の内容を追加します。
[workspaces]
active = research
[workspace.research]
id = 9d8c7b6a-…
api_key = the-key-bound-to-that-workspace
# from `lium workspaces login`; LIUM_SESSION_TOKEN overrides it
[session]
token = …
キーの解決順序:明示的に --workspace/LIUM_WORKSPACE を指定すると、そのワークスペース用に保存されたキーのみが使われます(保存されていない場合は終了コード 2)。それ以外の場合は、最初に一致したものが使われます。LIUM_API_API_KEY/LIUM_API_KEY(CLI の順序に従った環境変数のキー)、[workspaces] active 用に保存されたキー、[api] api_key の順です。キーを保存すると [workspace.<name>] セクションが書き込まれます(lium keys create --save、またはそのワークスペースで有効なキーを使って実行した lium workspaces use)。lium workspaces delete はこのセクションを削除します。セクション名には小文字に変換した名前が使われます。そのため、別のワークスペースの ID がすでに保存されているセクションへの保存(同じ名前を持つ 2 つのワークスペース)は拒否されます(終了コード 2)。最初のワークスペースのキーを上書きするのではなく、そのセクションを削除するか、いずれかのワークスペース名を先に変更してください。
ブラウザーのないマシン(エージェントのサンドボックス、CI、コンテナーなど)では、lium init --api-key <key> を実行すると、キーを /users/me で検証し、モード 600 でファイルに保存して SSH キーを設定します。画面を開いたり、何かを尋ねたりすることはありません。--json は {"ok", "api_key_source", "saved_from", "env_key", "active_workspace", "config_path", "ssh_key_path"} を出力します。api_key_source は lium whoami --json が出力するものと同じ値で、次のコマンドが上記のキーの解決順序に従ってキーをどこから読み取るかを示します(env:LIUM_API_KEY、config:<path> [api] api_key、または lium workspaces use で選択した場合は [workspace.<name>] のキー。後者の場合、active_workspace にその名前が表示され、テキスト出力ではそのキーが保存したばかりのキーより優先されることを警告します)。saved_from は今回の実行でキーを取得した方法(flag、env、config、session、browser)を示します。--json を使うには --api-key またはエクスポート済みのキーが必要です。ブラウザーフローではユーザーに情報が表示されます。キーが拒否された場合は終了コード 3(invalid_api_key)、API に接続できない場合は終了コード 3(api_unreachable)、値が空の場合は終了コード 2(empty_api_key)で終了します。いずれの場合も何も保存されず、ヒントにその旨が表示されます。LIUM_WORKSPACE/-w が設定されている場合、lium init は終了コード 2 で終了します。この場合、コマンドはそのワークスペース用に保存されたキーを使って実行されますが、init はキーを書き込みません。lium keys create <name> --workspace <ws> --save を使用してください。LIUM_API_KEY(または LIUM_API_API_KEY)がすでにエクスポートされている場合、lium init はブラウザーをスキップし、SSH キーを設定して、キーが環境変数から取得されていることを伝えます。SSH のパスはファイルに書き込まれますが、キーは書き込まれません。キーもエクスポートされているときに --api-key を指定すると、その旨の警告が表示されます(JSON では env_key に示されます)。
ログインキーは期限切れになったり、取り消されたりすることがあります。そのため、保存済みのキーがある場合、lium init はまず /users/me でキーを検証します。API がキーを拒否した場合(401、またはワークスペースがなくなった、もしくは作成者がワークスペースを離れたことを示す403)は、通常のログインが実行されます(保存済みの API キーは期限切れか、取り消されています。新しいログインを開始します…)。ターミナルがない場合はブラウザーを開かず、lium init は終了コード6(saved_key_rejected)で終了します。それ以外の403(アカウントのブロック、ファイアウォールのページ)、429、5xx、または応答がない場合は、警告を表示してキーをそのまま保持します。lium init --force はキーがまだ使える場合も再度ログインし、lium init --session <ID> は保存済みのキーがある場合もセッションを交換します。保存済みのキーは、新しいログインでキーが発行された場合にのみ置き換えられます(設定ファイルを一時ファイルに書き込み、古いファイルに名前を変更して置き換えます)。そのため、ブラウザーでのログインを中止した場合や、セッションが承認されなかった場合も、古いキーは保持されます。
ポッドの SSH ホストキーは、初回使用時に ~/.lium/known_hosts/<pod-id> に固定されます(lium ssh、lium up、および SDK の exec、stream_exec、rsync)。reboot、edit、switch_template、rm は、コンテナーとそのキーが置き換えられるため、それぞれ自ら固定を解除します。後でポッドが別のキーを提示すると、接続は拒否されます。SDK は LiumHostKeyError を発生させ、lium ssh は OpenSSH 独自の「ホスト識別情報が変更されました」というメッセージを表示して停止します。プラットフォームが独自に再起動した後や、傍受があった場合は、ポッドが正当に再プロビジョニングされたのであれば、そのファイルを削除してください。フィンガープリントは ssh-keygen -lf の出力と同じ SHA256:… 形式です。LIUM_SSH_INSECURE=1 を設定すると、以前の無条件に受け入れる動作に戻ります(受け入れたキーはそれぞれ stderr に報告されます)。lium ssh は、ポッドのユーザー、アドレス、ポートから作成した引数リストを使って OpenSSH を実行します。API の接続文字列がシェルに渡されることはありません。
スクリプトとエージェント(非対話型の使用)
CLI は、表示できないプロンプトで待機することはありません。stdin がターミナルではない場合、または LIUM_NONINTERACTIVE=1 が設定されている場合、質問を表示するはずのコマンドは、文書化された既定値を使うか、すぐに終了コード2で失敗し、指定すべきフラグを示します。
export LIUM_API_KEY=... # no browser login is attempted without a terminal
lium init --api-key $KEY # or save the key once, without a browser
lium up --gpu H100 -y --no-ssh # -y: rent without the confirmation prompt
lium rm my-pod -y # -y on every destructive command; a piped rm without it exits 2 and removes nothing
lium fund -w default -a 1.5 -y # values that would be prompted for must be passed as options
エージェントホスト向け MCP サーバー
lium mcp は、stdio 経由で Lium を Model Context Protocol サーバーとして提供するため、Claude Desktop、Claude Code、Cursor などの MCP ホストは、それぞれ GPU をレンタルして使用できます。ツール:list_gpus、rent_pod、list_pods、run_command、remove_pod、get_balance。lium init で保存した API キー、または LIUM_API_KEY を使用します。
pip install "lium.io[mcp]"
{"mcpServers": {"lium": {"command": "lium", "args": ["mcp"]}}}
何もインストールせずに、uv を使う場合:
{"mcpServers": {"lium": {"command": "uvx", "args": ["--from", "lium.io[mcp]", "lium.io", "mcp"]}}}
rent_pod に dry_run: true を指定すると、まずノードの見積もり(ティア、信頼性、1時間あたりの料金、残高)が表示され、レンタルは行われません。レンタルしたポッドには、remove_pod を実行するまで1秒単位で料金が発生します。https://docs.lium.io/mcp のホスト型 MCP サーバー(キー不要、読み取り専用)は別のサービスです。ドキュメントを検索し、GPU の最新価格と空き状況を提示します。rent_pod には、search_gpus が返すノード ID を指定します。
クラッシュレポート(オプトイン、既定では無効)
有効にしない限り、CLI はテレメトリーを送信しません。
lium config set telemetry.enabled true # or: export LIUM_TELEMETRY=1
lium config set telemetry.enabled false # off again
有効にすると、予期しないエラー(バグ。Unexpected error: … と表示されます)は、例外、スタックトレース、コマンド名(lium up)、CLI のバージョン、Python のバージョン、OS、CLI の接続先として設定されている API ホスト(lium.io、または LIUM_BASE_URL)とともに、1回報告されます。API エラー、使用方法のエラー、引数、オプション値、ローカル変数は送信されません。例外メッセージに含まれる、コマンドラインで渡した値(ポッド名、パス)、ホームディレクトリのパス(macOS、Linux、Windows)、メールアドレス、API キーは除外されます。レポートは Lium の Sentry プロジェクトに送信されます。LIUM_SENTRY_DSN を指定すると別の送信先(たとえばセルフホスト可能な GlitchTip)に送信され、LIUM_SENTRY_DSN=(空)は有効になっていても送信を無効にします。DSN ではない値を指定すると、stderr に警告が1回表示され、送信は無効のままになります。コマンド自体は引き続き実行されます。
要件
- Python 3.10~3.14(
requires-python = ">=3.10, <3.15") - チェーンコマンド(
lium provider …、lium fund)にはproviderエクストラ(pip install 'lium.io[provider]')が必要です。チェーンライブラリのビルドに対応しているのは Python 3.14 未満のみです。3.14 ではインストールは警告なしで完了し、プロバイダーコマンドの実行時に CLI が制約について説明します。
開発
# Clone repository
git clone https://github.com/datura-ai/lium.git
cd lium
# Install in development mode
pip install -e .
このリポジトリは uv プロジェクト(uv.lock)です。CI では uv sync --frozen --extra dev --extra provider でインストールし、Python 3.10 と 3.12 で単体テストを実行します。
uv sync --frozen --extra dev --extra provider
uv run pytest test/ -q
.github/workflows/ci.yml(CI - Build Verification)は、すべての PR で実行されます。実行内容は、単体テスト、パッケージング入力のチェック、sdist/wheel のビルド、バイナリーターゲットのマトリックスチェック(test/test_release_binary_targets.py)、Linux amd64 バイナリーのビルドです。Linux arm64 と macOS のビルドは、パッケージング入力(pyproject.toml、uv.lock、lium.spec、lium_entry.py、Dockerfile.build、scripts/install.sh、scripts/linux_bundle_report.py、ci.yml、release.yml)が変更された場合、または手動で実行された場合にのみ実行されます。ライブ E2E(./e2e/run.sh。詳しくは e2e/README.md を参照)は、lium/、e2e/、pyproject.toml、uv.lock、ci.yml の変更時、手動実行時、および毎日のスケジュールで実行されます。ci-ok(テスト、パッケージング、wheel、ターゲットマトリックスの各ジョブをまとめたもの)と e2e-live が、main のルールセットで必須となる2つのステータスチェックです。
ライセンス
MIT ライセンスです。詳細は LICENSE ファイルを参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。