lightning-deployments について
lightning-deployments は、Lightning AI 上のデプロイを作成・運用するスキルです。コンテナや HuggingFace モデルを提供する開発者向けに、CLI と Python SDK の操作、スケーリング、リリース、認証上の注意点を扱います。
主な機能
- 01Docker イメージ、Studio 環境、HuggingFace モデルのデプロイ
- 02デプロイとリリースの管理
- 03レプリカ数の調整とゼロへのスケール
- 04ログ、環境変数、シークレットの管理
- 05CLI または Python SDK での操作
活用シーン
- 01コンテナイメージを HTTPS サービスとして公開
- 02vLLM で HuggingFace モデル API を提供
- 03需要に応じたレプリカ数の調整
- 04サービスイメージのローリング更新
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ lightning-ai/ skills --skill lightning-deploymentsインストール後、Claude Code で/lightning-deploymentsを入力して読み込まれたか確認します。
詳細
Lightning AI デプロイメント
デプロイメントは、自動スケーリングに対応した HTTPS エンドポイントの背後で、コンテナ(または HuggingFace モデル用に自動ビルドされた vLLM サーバー)を実行します。ソースは相互に排他的です。--image(Docker)、--model(HuggingFace ID、GPU が必要)、または --studio(Studio の環境をデプロイ)を指定します。
セットアップと認証
export DEBUG=0 LIGHTNING_DEBUG=0 # an inherited DEBUG=1 logs the Authorization header; set this in every new shell
# Use the Lightning AI CLI from the current env; install or upgrade it there if it's missing or older than 2026.9.18
v=$(lightning --version 2>/dev/null | sed -n 's/^Lightning CLI version //p')
[ -n "$v" ] && [ "$(printf '%s\n' 2026.9.18 "$v" | sort -V | head -1)" = 2026.9.18 ] \
|| uv pip install -U lightning-sdk || python3 -m pip install -U lightning-sdk
lightning --version # must print "Lightning CLI version …"; if not, see the table below
lightning login # browser flow; or headless:
export LIGHTNING_API_KEY=... LIGHTNING_USER_ID=... # USER_ID optional: with it Basic auth, without it the key is a Bearer token
これはエージェントの現在の環境(プロジェクトの venv、conda env など)を使用し、必要に応じてそこにインストールします。その後は、どこでも通常の lightning … を呼び出してください。セットアップがスムーズに進まない場合:
| 症状 | 対処法 |
|---|---|
有効な環境がない、externally-managed-environment が発生する、またはプロジェクト独自のピン留めバージョンと競合する | 個別にインストールします:uv tool install lightning-sdk(または pipx install lightning-sdk)。PATH にない場合は "$(uv tool dir --bin)/lightning" を呼び出します |
インストール後も Lightning CLI version の行が表示されない | 別の lightning(PyTorch Lightning のもの)または無効な環境が先に見つかっています:command -v lightning を確認し、環境を有効にするか、その環境の bin/lightning を呼び出します |
No such command、No such option または unexpected extra argument | CLI が古すぎます:command -v lightning が示す場所でアップグレードします(uv pip install -U lightning-sdk または uv tool upgrade lightning-sdk) |
| インストールがブロックされる(読み取り専用の環境またはホームディレクトリ、エージェントのサンドボックス) | 各コマンドを UV_CACHE_DIR="${TMPDIR:-/tmp}/uv" UV_TOOL_DIR="${TMPDIR:-/tmp}/uv-tools" uvx lightning-sdk … として実行します |
エージェントのサンドボックス内でのみ、lightning --version を含むすべての呼び出しで SSL/CA エラーが発生する | **/*.pem の読み取り拒否ルールによって certifi の cacert.pem が隠されています。そのパスだけを許可してください。サンドボックスは無効にしないでください |
エージェントのサンドボックス内でのみ NameResolutionError が発生する | lightning api も失敗する場合は、ユーザーに lightning.ai と *.lightning.ai を許可するよう依頼します(/sandbox)。studio/job コマンドまたは SDK のみが失敗する場合、それらはサンドボックスプロキシを経由しません。そのコマンドだけをサンドボックスの外で実行します。バックグラウンドのポーラーも同じ理由で、エラーを表示せずに失敗します |
上記のインストールにより、その環境で lightning_sdk もインポート可能になるため、Python のスニペットはその環境の python で実行できます。CLI が uv tool または uvx のフォールバックから提供されている場合は、単発のスクリプトを uv run --with lightning-sdk python script.py で実行します。ユーザーのプロジェクトに残るコードの場合は、先に確認してから、プロジェクト独自のツール(uv add、poetry add)で lightning-sdk を依存関係として宣言します。
組織とチームスペースの解決(最初に実施)
デプロイメントは、組織またはユーザーが所有するチームスペースに作成されます。決して推測しないでください。 明示的な --teamspace owner/teamspace(Python では teamspace="owner/teamspace"。個別の org=/user= 引数は非推奨です)、環境変数 LIGHTNING_ORG / LIGHTNING_TEAMSPACE、または設定のデフォルト(lightning config get teamspace)を使用します。いずれも設定されていない場合は、選択肢を一覧表示し、どの組織/チームスペースを使用するかユーザーに確認します:
lightning api /v1/memberships | jq -r '.memberships[] | [.ownerType, .name, .projectId] | @tsv'
選択内容を保存します:lightning config set teamspace <owner>/<teamspace>。
スコープ付き API キーを使う場合(ユーザーに確認できないエージェントの場合):--teamspace には所有者の slug が必要ですが、/v1/memberships で取得できるのは所有者の ID のみです。また、同じチームスペースが 2 回(同じ projectId を持つ organization 行と user 行として)表示される場合があります。チームスペースが 1 つだけ一覧表示されている場合に限り続行し、組織の行を優先して、ownerType を使って所有者を解決します(jq が必要です):
M=$(lightning api /v1/memberships)
if [ "$(printf "%s" "$M" | jq '[.memberships[].projectId] | unique | length')" != 1 ]; then
echo "several teamspaces: ask the user which one" >&2
else
ROW=$(printf "%s" "$M" | jq -c '(.memberships | map(select(.ownerType=="organization"))) + .memberships | .[0]')
TS=$(printf "%s" "$ROW" | jq -r .name); OID=$(printf "%s" "$ROW" | jq -r .ownerId)
if [ "$(printf "%s" "$ROW" | jq -r .ownerType)" = organization ]; then
OWNER=$(lightning api "/v1/orgs/$OID" | jq -r .name)
else # a personal teamspace; the search is fuzzy, so match the id exactly
OWNER=$(lightning api /v1/users/search -X GET -f "query=$OID" \
| jq -r --arg id "$OID" '.users[] | select(.id==$id) | .username')
fi
lightning config set teamspace "$OWNER/$TS" # or pass --teamspace "$OWNER/$TS" each time
fi
CLI リファレンス
サブコマンド:create、list、inspect、update、delete、logs(および logs download)、reload-weights、env / secret(稼働中のデプロイに対する list / set / delete)。stop はありません。update --min-replicas 0 --max-replicas 0 でレプリカ数をゼロにしてください。
# container deployment (a --port is required for non-model deployments)
lightning deployment create my-api --teamspace owner/teamspace \
--image nginx:latest --machine CPU --port 80 --replicas 1 --api-key-auth
# HuggingFace model via vLLM (GPU machine required; port defaults to 8000)
lightning deployment create llama --teamspace owner/teamspace \
--model meta-llama/Llama-3.1-8B-Instruct --machine L40S \
[--hf-token-secret <secret-name>] [--tensor-parallel-size 2] [--max-model-len 8192] \
[--quantization fp8] [--dtype bfloat16] [--dry-run] [--force]
# cloud account — if you pass none, the SDK picks one (config `cloud-account`, then
# LIGHTNING_CLUSTER_ID, then the teamspace's default binding) and prints which on stderr.
# Other deployments in the same teamspace may sit on a different account, which
# `deployment list` shows in its last column; match it with --cloud when relevant.
lightning deployment create ... --cloud gcp-lightning-public-prod
# autoscaling / env / secrets
lightning deployment create ... \
--min-replicas 0 --max-replicas 4 --autoscale-metric GPU --autoscale-threshold 90 \
-e KEY=VALUE --secret MY_LIGHTNING_SECRET --interruptible # check the spot price first (below)
# endpoint auth: mutually exclusive; OMITTING ALL THREE MAKES THE ENDPOINT PUBLIC (confirm that's intended)
--api-key-auth # require a Lightning USER API key (Bearer)
--basic-auth USER:PASS
--token-auth TOKEN # any bearer string you choose
# operate
lightning deployment list --teamspace owner/teamspace [--all] [--sort-by state]
lightning deployment inspect my-api --teamspace owner/teamspace # full JSON incl. endpoint URLs
lightning deployment logs my-api --teamspace owner/teamspace [-f] [--tail 100] [--timestamps]
lightning deployment logs my-api --teamspace owner/teamspace --query timeout --severity error # filter server-side
lightning deployment logs my-api --teamspace owner/teamspace --since 30m --until 5m # window (replicas merged + labelled)
lightning deployment update my-api --teamspace owner/teamspace --max-replicas 8
lightning deployment update my-api --teamspace owner/teamspace --min-replicas 0 --max-replicas 0 # "stop"
lightning deployment update my-api --teamspace owner/teamspace --image myimg:v2 [--max-surge 1] [--max-unavailable 0] # new release, rolling update
lightning deployment reload-weights llama --teamspace owner/teamspace # hot-reload BYOM weights
lightning deployment delete my-api --teamspace owner/teamspace --yes
lightning auth whoamiの結果に応じて認証フラグを選択してください。呼び出し元がuserの場合は--api-key-auth、scoped-api-keyの場合は--token-authを使います。--api-key-authが受け付けるのは Lightning の user キーのみです(userApiKey: trueとしてシリアライズされます)。scoped-key の呼び出し元は、レプリカが稼働して課金が発生している間、すべてのリクエストで 401 を受け取ります。scoped key、CI ジョブ、エージェントからエンドポイントを呼び出す場合は、--token-auth <token>を使用してください。各自の Lightning ログインを使う人間が呼び出す場合は、--api-key-authを使用してください。--interruptibleを使っても必ず安くなるとは限らないため、指定する前に価格を確認してください。 SKU やクラウドによっては、スポットのほうがオンデマンドより高く、作成時にも警告されません。アクセラレーターカタログから両方の料金を取得し(lightning-cost-estimationスキルを参照)、min(cost, spotPrice)を選択してください。- イメージ、コマンド、env、エントリーポイント、パスマッピング、ヘルスチェック、クラウドアカウント、スポット設定、数量、最大実行時間を変更すると新しいリリースが作成されます。マシンのみを切り替えた場合は作成されません。 CLI はローリングアップデートを自動的に追加します。SDK では、リリース戦略が渡されておらず、保存済みの戦略もない場合、
RuntimeErrorが発生します。
Python SDK
from lightning_sdk import Deployment, Machine
from lightning_sdk.api.deployment_api import (
ApiKeyAuth, BasicAuth, TokenAuth, AutoScaleConfig, Env, Secret,
RollingUpdateReleaseStrategy, HttpHealthCheck,
)
dep = Deployment("my-api", teamspace="my-org/my-teamspace") # owner/teamspace, same as the CLI
dep.start(
image="nginx:latest",
machine=Machine.CPU,
ports=[80], # REQUIRED for non-model deployments; a LIST, not an int
autoscale=AutoScaleConfig(min_replicas=0, max_replicas=4, metric="CPU", threshold=90),
env=[Env("MODE", "prod"), Secret("HF_TOKEN")], # or a plain dict for env vars
auth=ApiKeyAuth(), # None => PUBLIC endpoint
health_check=HttpHealthCheck(path="/health", port=80),
spot=False, # True = interruptible replicas
)
print(dep.urls) # endpoint URL(s); no .status property — use replica counts
print(dep.running_replicas, dep.pending_replicas, dep.failing_replicas)
r = dep.get(path="/health") # convenience HTTP; auto-auths only for ApiKeyAuth
# a new release needs a release strategy (see the release rule under CLI reference)
dep.update(image="nginx:1.27", release_strategy=RollingUpdateReleaseStrategy(max_surge=1, max_unavailable=0))
dep.update(min_replicas=1, max_replicas=8) # scaling: no new release, no strategy needed
dep.stop() # scales to 0; blocks until replicas reach 0
SDK を使用した HuggingFace モデルのサービング:dep.start(model="meta-llama/...", machine=Machine.L40S, ports=[8000], hf_token_secret="...")。image / studio は None である必要があります。それでも ports は指定してください。
dep.delete() はデプロイを削除しません。 dep.get() / dep.post() と同様に、これは HTTP ヘルパーであり、デプロイされたサービスのエンドポイントに HTTP DELETE リクエストを送信します。デプロイのリソースを削除するには、lightning deployment delete NAME --yes または未加工の API を使用してください。
プライベートコンテナーイメージ
レジストリ認証情報が必要なイメージを使うデプロイでは、V1JobSpec.image_secret_ref に、teamspace 内の SECRET_TYPE_DOCKER_REGISTRY シークレットの名前を設定する必要があります。CLI も Deployment.start() も image_secret_ref を公開しておらず、これがないとサーバーは不透明な 500 エラーでイメージを拒否します。 エラーにはイメージ名も不足している認証情報も表示されません:
Exception: The jobs_service_create_deployment_with_http_info request failed to reach the server, response: 500.
SDK でサポートされるまでは、作成リクエストにこのフィールドをパッチしてください:
from lightning_sdk.lightning_cloud.openapi.api import jobs_service_api
_create = jobs_service_api.JobsServiceApi.jobs_service_create_deployment_with_http_info
def _with_image_secret(self, body, project_id, **kwargs):
if getattr(body, "spec", None) is not None:
body.spec.image_secret_ref = "MY_REGISTRY_SECRET"
return _create(self, body, project_id, **kwargs)
jobs_service_api.JobsServiceApi.jobs_service_create_deployment_with_http_info = _with_image_secret
teamspace のシークレットとその種類を一覧表示するには、次を実行してください:
PROJECT_ID=$(lightning api /v1/memberships | jq -r '.memberships[] | select(.name=="<teamspace>") | .projectId')
lightning api "/v1/projects/${PROJECT_ID}/secrets" | jq -r '.secrets[] | "\(.name) \(.type)"'
この 500 の原因を診断するには、ほかの引数は同一のまま、公開イメージ(nginx:latest)で再試行してください。 その作成が成功する場合、変数はイメージであり、マシン、ポート、レプリカ数、クラウドアカウントではありません。
ワークフローの例
このスキルが対応するプロンプト:「この docker イメージを API の背後でデプロイして」、「lightning で Llama 3.1 8B をサーブして」、「夜間にデプロイのスケールを下げて」、「新しいイメージバージョンをロールアウトして」。
コンテナーをデプロイし、応答を確認してから、クリーンアップします。 確認には、ソースの Studio 内のアプリではなく、deployment inspect から取得したエンドポイント URL を使用してください。Studio で確認できるのはイメージです。サービスを確認できるのはエンドポイントだけです。
lightning auth whoami # pick the auth flag from this (see the auth rule under CLI reference)
lightning deployment create hello-api --teamspace my-org/my-teamspace \
--image nginx:latest --machine CPU --port 80 --min-replicas 0 --max-replicas 1 --api-key-auth
lightning deployment inspect hello-api --teamspace my-org/my-teamspace # JSON: status, endpoint URL
URL=<endpoint URL from the inspect output above>
curl -s -o /dev/null -w '%{http_code}\n' -H "Authorization: Bearer $LIGHTNING_API_KEY" "$URL/" # verify the ENDPOINT, not the Studio
from lightning_sdk import Deployment
dep = Deployment("hello-api", teamspace="my-org/my-teamspace")
print(dep.urls) # e.g. ['https://80-dep-<id>-d.cloudspaces.litng.ai'] — available even while scaled to zero
print(dep.get(path="/").status_code) # sends the caller's Lightning API key for ApiKeyAuth
lightning deployment delete hello-api --teamspace my-org/my-teamspace --yes
オープンウェイトの LLM をサーブします(vLLM、サーバー側でビルドするため Dockerfile は不要):
lightning deployment create qwen-served --teamspace my-org/my-teamspace \
--model Qwen/Qwen2.5-7B-Instruct --machine L40S --min-replicas 0 --max-replicas 1 --api-key-auth --dry-run
# review the model spec it prints, then re-run without --dry-run; if the real create reports
# unacknowledged warnings, re-run with --ack <code> (repeatable) or --force
lightning deployment logs qwen-served --teamspace my-org/my-teamspace -f # watch it come up
エンドポイントはポート 8000 で OpenAI 互換 API を提供します。任意の OpenAI クライアントの base_url を dep.urls[0] に設定してください。
運用:スケール、更新、ロールバック、トラフィックコストの管理:
lightning deployment update hello-api --teamspace my-org/my-teamspace --min-replicas 1 --max-replicas 4 # keep warm
lightning deployment update hello-api --teamspace my-org/my-teamspace --min-replicas 0 --max-replicas 0 # stop (scale to zero)
lightning deployment update hello-api --teamspace my-org/my-teamspace --image nginx:1.27 # new release, rolling by default
未加工 API の代替手段
PROJECT_ID=$(lightning api /v1/memberships | jq -r '.memberships[] | select(.name=="<teamspace>") | .projectId' | head -1)
lightning api "/v1/projects/${PROJECT_ID}/deployments" -q '.deployments[].name' # plain GET; -f/-F without -X would send a POST
lightning api "/v1/projects/${PROJECT_ID}/deployments/${DEPLOYMENT_ID}"
lightning api "/v1/projects/${PROJECT_ID}/deployments/${DEPLOYMENT_ID}" -X DELETE
注意点
- デプロイメントはレプリカが起動している間、課金されます。作成前に必ずユーザーに費用を確認してください。 GPU マシンを使う場合、
--min-replicas >= 1(継続的に課金されます)を設定する場合、また請求額の上限を決める--max-replicasを引き上げる場合は、事前に明確な許可を得てください。まずlightning-cost-estimationスキルでマシンの料金を確認してください。 - デプロイメントの検証には、ソース Studio 内のアプリではなく、
deployment inspectで確認できる公開 URL を使ってください。 Studio で確認できるのはイメージだけです。サービスを確認できるのはエンドポイントのみです。レプリカが正常と表示され、通常どおり課金されていても、デプロイメントがすべてのリクエストに 401 を返すことがあります。 min_replicas=0ならレプリカ数がゼロの間は課金されず、次のリクエストは失敗せずにコールドスタートを待ちます。 エッジはレプリカの準備が整うまで接続を維持し(GPU イメージでは約 6 分)、その後、通常の 200 を返します。503 を返したり接続を拒否したりすることはないため、タイムアウトが短く設定されていないクライアントは待ち続けます。min_replicas >= 1は継続的に課金されるため、この費用をユーザーに伝えてください。- スケール・トゥ・ゼロのアイドル時間とヘルスチェックは SDK でのみ設定できます。
AutoScaleConfig(idle_threshold_seconds=...)とHttpHealthCheck(path=..., port=...)に対応するdeployment create/updateフラグはありません(--health-check-path/--readiness-probeはありません)。CLI ではデフォルトのアイドル時間が適用され、起動中でも準備が整っていないレプリカにトラフィックが届くのを防ぐ手段はありません。 - 既存のデプロイメントに対する
Deployment.start()は、エラーにならずに更新/再起動として処理されます。 名前の競合があってもエラーは発生しません。 - ポートの指定が誤っていても、どのポートかはエラーに表示されません。 モデル以外のデプロイメントでポートが指定されていない場合は
ValueErrorが発生します。SDK でportsに int を指定すると、SDK 内部からTypeError: 'int' object is not iterableが発生しますが、エラーにはportsへの言及がありません。 metricを指定せずにAutoScaleConfigを使うと、start()の時点で後からエラーが発生します。ValueError: The autoscaling metric is required. Currently supported metrics are ['GPU', 'CPU', 'RPM']が発生し、トレースバックが示すのは設定オブジェクトではなくstart()です。必ずmetric=を渡してください。deployment inspectでSecret("NAME")のnameが空でも、バグではありません。{"from_secret": "NAME", "name": "", "value": ""}と表示されます。プラットフォームが参照先を解決し、シークレット名を環境変数名として設定します。- デプロイメントのログはチームスペースへのアクセス権を持つ人なら誰でも読めるため、起動時に実際のシークレットを出力しないでください。 環境変数を出力するコンテナは、シークレットの値を
deployment logsに漏えいさせます。 Deployment deletedと表示されても、デプロイメントが「消えた」とは限りません。 最大約 2.5 分間、デプロイメントの一覧に残ることがあります。deployment list(およびlist --all)に、古いレプリカ数とdeletedAt: Noneを伴ってPENDINGと表示される場合があります。削除失敗と判断したり、削除完了の確認のためにlistを繰り返し実行したりしないでください。数分経過してもまだ残っている場合に限り、deleteを再実行してください。削除は取り消せない操作であり、--yesを指定しない限り CLI で確認が求められるため、事前にユーザーの許可を得てください。-fを付けないdeployment logsは、出力がないままハングして戻らないことがあります。 スクリプトで上限付きの読み取り(--tail 25、--followなし)を行う場合は、個別にタイムアウトを設定してください。-fは動作します。deployment inspectのtotal_costはデプロイメントの存続期間中ずっと0.0のままです。チームスペースのクレジット残高で費用を確認してください。 ジョブとは異なり、課金/使用量エンドポイントを使ってもデプロイメントの費用は確認できません。実行前後のクレジット残高の差を確認してください。このフィールドは連続する呼び出し間で、浮動小数点の完全な精度と小数第 2 位への丸めの間で変化するため、丸め誤差が無視できる程度になる長さの期間を取ってください。--dry-runはサーバーを呼び出さないため、未確認の警告に関するエラーは表示されません。 実際の--modelによる作成では、Deployment has unacknowledged warnings: ... Re-run with --ack <code> (repeatable) or --force.というエラーが発生することがあります。ドライランで表示されるのは、設定したモデル仕様(served_model_name、weight_source、および指定した vLLM フラグ)のみで、マシン、イメージの種類、レプリカ設定は表示されません。--modelで不透明な403が返された場合は、アカウントでこの機能が制限されているため、--imageに切り替えてください。 エラーはException: The jobs_service_create_deployment_with_http_info request failed to reach the server, response: 403.で、サーバーからのメッセージはありません。LIGHTNING_DEBUG=1を設定するとトレースバックは追加されますが、理由は表示されません。これは引数の誤りではなく利用資格の問題なので、モデル ID やフラグのデバッグは不要です。利用資格が不要な vLLM コンテナイメージを直接デプロイしてください(--image)。teamspace="owner/teamspace"とorg=/user=の両方を渡すとValueErrorが発生します。org=/user=のみを渡すとDeprecationWarningが表示されます。2026.7.31 より古い SDK では、両方を指定すると "Teamspace owner/name does not exist" というエラーが発生していました。指定を分けずにアップグレードしてください。