ドキュメント

Docker クイックスタート

Docker クイックスタート

ホストに Python や PyTorch をインストールせずに SDK を実行します。CPU のクイックスタートでは 8 GB のメモリと 10 GB の空きディスクを用意し、Docker Engine か Docker Desktop、および Compose v2 以降を入れてください。

リポジトリのルートから:

docker compose run --build --rm laya

これはチェックアウトをビルドし、CPU 上でサンプルリクエスト を実行して、choice、score、noul を含む JSON を出力します。最初のリクエストで、選ばれた公開 の Hugging Face チェックポイントをダウンロードします。アカウントは不要です。初回のダウンロード には数分を見込んでください。重みは名前付きボリュームに残ります。以降の実行は docker compose run --rm laya を使います。

予測と信頼度は、自分のワークロードで評価する必要があります。 ベンチマークの制限 を参照して ください。

ARM64 ホスト、DGX Spark、Apple Silicon については、 ARM64 と DGX Spark のコンテナ を参照してください。

NVIDIA GPU / CUDA

互換性のある NVIDIA ドライバをインストールし、 NVIDIA Container Toolkit で Docker を設定します。GPU イメージは PyTorch CUDA 12.8 の wheel を使います。GPU の計算能力と ドライバを PyTorch の対応ビルド と照らし合わせて確認 してください。古いカードは別のビルドが必要なことがあります。CUDA のレイヤーには追加のディスク 容量を見込んでください。必要な VRAM は、チェックポイント、バッチサイズ、入力長に依存します。

docker compose -f compose.yaml -f compose.cuda.yaml run --build --rm laya

この override は GPU 0 を選び、既定で LAYA_DEVICE=cuda になります。LAYA_GPU_ID を別の ホストインデックスまたは UUID に設定してください。その GPU はコンテナ内でデバイス 0 として 見えます。重みをダウンロードせずにアクセスを確認できます:

docker compose -f compose.yaml -f compose.cuda.yaml run --rm laya python -c \
  'import torch; assert torch.cuda.is_available(); print(torch.cuda.get_device_name(0)); print(torch.ones(1, device="cuda").cpu())'

サンプルは、チェックポイントを読み込む前に利用できない CUDA を拒否します。Laya はメモリや推論の エラーの後でも CPU にフォールバックすることがあるので、その警告を確認してください。CPU と CUDA の構成を切り替えるときは再ビルドしてください。

イメージは TORCH_DISABLE_NATIVE_JIT=1 を設定します。これがないと PyTorch 2.14 は一部の eager CUDA 演算を Triton カーネルに置き換え、初回の推論時にそれらをコンパイルします。それには slim イメージが持たない C コンパイラが必要で、コンテナはヘルシーと報告したうえで毎リクエストが失敗 します(#365)。標準のカーネルは同じ答えを同じレイテンシで返します。ベアメタルのインストールで predict が Failed to find C compiler で失敗する場合も、同じ変数を設定してください。

これは Compose の GPU 予約 を使います。 Windows には Docker Desktop が対応する WSL2 の GPU 設定が必要です。Apple MPS、AMD/ROCm、Intel GPU のコンテナはこのクイックスタートの対象外です。別のバックエンドを構成して検証しない限り、CPU を使ってください。

設定

Compose の変数は、シェル、ローカルの .env ファイル、またはサービスの environment ブロック で設定します。.env にシークレットをコミットしないでください。実行時の変数は docker run -e でも使えます。Compose 専用の設定は下で示します。

変数 既定値 目的
LAYA_DEVICE cpu / cuda ベース / GPU 構成が選ぶデバイス
LAYA_CUDA_AMP 未設定(チェックポイントの amp_dtype) CUDA フォワードで fp16 か bf16 か。見た目だけの話ではない:README のしきい値の節では、fp16 が 1 つも argmax を反転させない同値集合で、bf16 が 864 個中 3 個を反転させると測定されている
LAYA_CPU_AMP 未設定 bf16 で CPU フォワードが bf16 になる。それ以外の値は fp32 のまま
LAYA_MODEL auto Router の別名:auto、english、multilingual、typed-decisions
LAYA_MODEL_PATH 未設定 コンテナ内の互換チェックポイントのパス
LAYA_REVISION 未設定 すべてのチェックポイントのダウンロードに使う Hub の commit、branch、tag。または reviewed で laya/revisions.py のレビュー済み SHA。revision= 引数は引き続き優先される
LAYA_REQUEST_FILE 同梱のリクエスト コンテナ内の JSON リクエストのパス
OMP_NUM_THREADS 4 CPU スレッド数。使用可能なコア数の範囲に収めてください
HF_TOKEN / HF_TOKEN_FILE 未設定 任意の Hugging Face 資格情報
LAYA_API_KEY / LAYA_API_KEY_FILE 未設定 laya-serve のみ: Authorization: Bearer <key> を必須にする
LAYA_PORT 8000 laya-serve のみ: コンテナポート、およびそのために公開するホストポート
HF_HUB_OFFLINE 0 1 はキャッシュ済みのチェックポイントだけを使う
HF_HOME /home/laya/.cache/huggingface キャッシュパス。下のマウント要件を参照
LAYA_CACHE_VOLUME プロジェクトのモデルキャッシュ Compose のみ: 名前付きキャッシュボリューム
LAYA_GPU_ID 0 Compose のみ: NVIDIA のデバイスインデックスまたは UUID
LAYA_TORCH_INDEX cpu / cu128 / cu130 Compose ビルド: PyTorch の wheel インデックス
LAYA_TORCH_VERSION 2.14.0 Compose ビルド: 固定する PyTorch のバージョン

Compose は実行時の変数を転送しますが、HF_HOME は除きます —— これは固定のキャッシュマウントと 足並みを揃えたままです。また LAYA_MPS_AMP_MIN_ROWS(MPS の行数ゲート)も除きます。ここにある どのイメージもそこに到達できず、ここにあるどのコンテナも MPS を選べないからです。docker run や 自分の Compose ファイルで HF_HOME を上書きする場合は、UID 10001 が書き込める対応するマウントを 用意してください。直接の Docker ビルドは --build-arg TORCH_INDEX=cu128 で PyTorch を選びます。 実行時の -e はインストール済みの wheel を変えられません。

LAYA_MODEL=english OMP_NUM_THREADS=2 docker compose run --build --rm laya

docker build -t laya:local .
docker run --rm -e LAYA_MODEL=english -e OMP_NUM_THREADS=2 \
  -v laya-model-cache:/home/laya/.cache/huggingface laya:local

自分のリクエストを使う場合:

docker compose run --rm --volume "$PWD/request.json:/inputs/request.json:ro" \
  --env LAYA_REQUEST_FILE=/inputs/request.json laya

リクエスト、チェックポイント、シークレットファイルのマウントを含む、コメント付きの構成については、 compose.example.yml を参照してください:

docker compose -f compose.yaml -f compose.example.yml run --build --rm laya

NVIDIA GPU では run の前に -f compose.cuda.yaml を追加します。この例は compose.yaml の override なので、キャッシュとイメージの設定は 1 か所に収まります。

シークレットファイル

HF_TOKEN_FILE は起動時にマウントされた UTF-8 ファイルを読み、前後の空白を取り除き、 HF_TOKEN より優先されます。読めない、空、または不正なファイルは、中身を出力せずに起動を止め ます。ファイルは UID 10001 から読めなければなりません。_FILE は対応するシークレットにだけ 当てはまり、すべての設定に当てはまるわけではありません。

HF_TOKEN_PATH がチェックアウトの外にある既存のホストファイルを指す場合:

docker compose run --rm --volume "$HF_TOKEN_PATH:/run/secrets/hf_token:ro" \
  --env HF_TOKEN_FILE=/run/secrets/hf_token laya

Docker のシークレットや Kubernetes の Secret ボリュームでも同じファイルを供給できます。値は起動 時にプロセスの環境に読み込まれます。ファイルを変えたら再起動してください。token をビルド引数に 使ったり、イメージに焼き込んだりしないでください。公開チェックポイントに token は不要です。

ファインチューニング済みチェックポイント

このイメージは推論を実行します。ファインチューニングはその外で行います —— ファインチューニング用ノートブック は Kaggle の無料の 2xT4 GPU 上でループ全体を回し、このイメージが提供できるチェックポイントを エクスポートします。学習インターフェースについての背景と未解決の問いは #4 と #26 にあります。

LAYA_CHECKPOINT_PATH に、rl_agent_config.json、model.safetensors、および対応する tokenizer ファイルを含むホストの絶対ディレクトリを指定します:

docker compose run --rm --volume "$LAYA_CHECKPOINT_PATH:/models/custom" \
  --env LAYA_MODEL_PATH=/models/custom laya

ローダーが tokenizer の設定を更新することがあるので、UID 10001 が書き込める作業用コピーを 使ってください。LoRA アダプタだけでは完全なチェックポイントになりません。LAYA_MODEL_PATH を 設定するときは LAYA_MODEL=auto のままにしてください。明示的な別名とローカルパスは同時に使え ません。ローカルパスの応答は Agent からのもので、Router の routing メタデータはありません。 これらの設定は CUDA の override とも併用できます。ファインチューニング済みチェックポイントは、 それに頼る前にホールドアウトした例で評価してください。

開発と後片付け

docker compose run --rm laya python で Python プロンプトを開きます。重みをダウンロードせずに、 既存のルーティング・criteria のチェックとシークレットファイルのテストを自分のチェックアウトに 対して実行するには:

docker compose run --rm --volume "$PWD:/workspace:ro" --workdir /workspace laya \
  sh -ec 'python tests/test_router.py; python tests/test_criteria.py; python tests/test_docker_entrypoint.py'

ソースや同梱のサンプルを変えた後は --build で再ビルドします。イメージは UID/GID 10001 として 実行されます。新しい名前付きボリュームはイメージのキャッシュディレクトリの所有権を引き継ぎます。 ホストのディレクトリはその UID から書き込める必要があります。tokenizer の互換性更新のために、 モデルキャッシュは書き込み可能に保ってください。

--rm は完了したコンテナを削除します。docker compose down はキャッシュを残します。 ダウンロード済みの重みを削除するには、同じ Compose ファイルと LAYA_CACHE_VOLUME 設定を 使って docker compose down --volumes を実行します。次回のリクエストで再度ダウンロードされ ます。別のプロジェクトと共有しているキャッシュは削除しないでください。

HTTP での提供

イメージは laya-serve を同梱しているので、ワンショットのクイックスタートを実行する同じビルド が、Jev 互換の API を提供できます。compose.http.yaml はそれを 2 つ目のサービスとして追加し、 laya はそのままにします:

docker compose -f compose.yaml -f compose.http.yaml up --build laya-serve
curl -s localhost:8000/health
curl -s localhost:8000/v1/systemone -H 'content-type: application/json' \
  --data @examples/docker/request.json

NVIDIA では、CUDA の override を追加します。laya-serve は別のサービスで、laya への override は決してそこに届かないため、この override はビルド引数とデバイス予約を laya-serve 向けに 繰り返します:

docker compose -f compose.yaml -f compose.http.yaml -f compose.cuda.yaml up --build laya-serve

up はサービスをフォアグラウンドで動かし続けます。-d でデタッチします。重みはクイックスタート と同じ名前付きの model-cache ボリュームに入るので、クイックスタートを実行した後の提供は、 チェックポイントがすでにディスク上にある状態で始まります。停止は docker compose ... down で、 同じ Compose ファイルを使います。

ポートは 127.0.0.1 でのみ公開されます。API は LAYA_API_KEY を設定するまで認証がないので、 LAYA_BIND_ADDRESS=0.0.0.0 で公開する前にキーを設定し、リモートのクライアントには前面に TLS リバースプロキシを置いてください。/health はどちらの場合も認証を必要としません。

サービスには /health のヘルスチェックがあります。サーバーは待ち受けを始める前にプリロード するので、LAYA_PRELOAD=1 ならヘルシーなコンテナはチェックポイントが読み込み済みです。 docker compose ... up -d --wait laya-serve はヘルシーになると戻ります。

/health は device を、常駐チェックポイントが実際に計算しているデバイスとして報告します。 これは LAYA_DEVICE が要求したものとは限りません。得られない GPU を求めるチェックポイントは、 黙って CPU にフォールバックし、それでも正しく答えます。checkpoint_devices は読み込み済みの各 チェックポイントを名指しし、device_is_preference は何も常駐していない間だけ true です。これに より、GPU を静かに失ったデプロイは、自分の構成をそのまま繰り返すのではなく、そう報告します。

サーバー設定

これらは laya-serve サービスにのみ当てはまります。

変数 既定値 効果
LAYA_HOST 0.0.0.0 コンテナ内のバインドアドレス
LAYA_PORT 8000 コンテナポート、およびそのために公開するホストポート
LAYA_BIND_ADDRESS 127.0.0.1 ポートを公開するホストアドレス
LAYA_PRELOAD 0 1 は初回リクエスト時ではなく起動時にすべてのチェックポイントを構築
LAYA_MODELS (すべて) プリロードするカンマ区切りの一覧:english,multilingual,typed-decisions
LAYA_THREADS OMP_NUM_THREADS torch の演算内スレッド数を制限。物理コア数以下に保ってください
LAYA_AUTO_TASK 0 1 は router が typed-decisions に自動的に到達できるようにする
LAYA_MAX_LOADED 2 常駐させるチェックポイント。LAYA_AUTO_TASK は 3 つ目を必要時に到達可能にし、ルーティングが選ぶ数より低い上限は切り替えごとに 1 つを再構築させる
LAYA_MAX_CONCURRENT 16 同時に受け入れるリクエスト数。以降のものは 503 を受け取る(解析できない値、または正でない値は 16 にフォールバックする)
LAYA_LOG_LEVEL info uvicorn のログレベル
LAYA_API_KEY (なし) 設定すると Authorization: Bearer <key> を必須にする
LAYA_ROOT_PATH (空) リバースプロキシの背後で FastAPI が使う公開 URL プレフィックス。プロキシは転送前にそれを取り除くべき
LAYA_MAX_TOKEN_BUDGET 8192 リクエストごとの max_len と head_max_len の上書きに対する上限
LAYA_SHA256_DIGESTS (なし) チェックポイントを解析する前に検査する JSON ダイジェスト:すべてのチェックポイントに {artifact: digest}、またはチェックポイントごとに {model: {artifact: digest}}。セキュリティ を参照

たとえば、API を /laya の下で公開するときは LAYA_ROOT_PATH=/laya を設定します。プロキシは コンテナへ転送する前にそのプレフィックスを取り除く必要があります。この設定は FastAPI が生成する URL を更新するもので、内部の /health や /v1/systemone のルートは変えません。

LAYA_PRELOAD の既定は、ここではパッケージの既定である 1 ではなく 0 です。プリロードすると 初回起動で 3 つすべてのチェックポイントをダウンロードするからです。長時間動かすデプロイでは 1 に設定し、最初のリクエストがビルドのコストを払わないようにしてください。

LAYA_PORT は公開するホストポートとサーバーがバインドするポートの両方を設定するので、この 2 つ がずれることはありません。サービスを移すには 1 か所を変えるだけです:

LAYA_PORT=9000 docker compose -f compose.yaml -f compose.http.yaml up --build laya-serve

ファイルからのベアラートークン

LAYA_API_KEY_FILE は起動時に 1 度読まれ、LAYA_API_KEY に移され、サーバーが exec する前に _FILE 変数が削除されます。キーを環境に置くより、こちらを優先してください:

docker compose -f compose.yaml -f compose.http.yaml run --rm \
  --volume "$PWD/laya_api_key:/run/secrets/laya_api_key:ro" \
  -e LAYA_API_KEY_FILE=/run/secrets/laya_api_key \
  --service-ports laya-serve