高火力DOK CLIP特徴量抽出サンプル 実行記録

さくらインターネット 高火力DOKで、共有サーバ上の馬体写真30枚を入力にし、 CLIP画像特徴量をGPUで抽出して共有サーバへ戻すサンプルを実行した記録です。

結論

実行結果成功、終了コード 0
DOKプランV100 32GB
実行時間2分46秒、166秒
CLIP抽出本体30枚、15.155秒
GPU確認device=cuda, cuda_available=true
出力512次元特徴量、30枚全件成功

Object Storageは使わず、共有サーバの /data/dok_jobs をDOKタスクの入力・出力受け渡し場所として利用できることを確認しました。

作成したモジュール

ファイル役割
docker/dok_clip_sample/Dockerfile DOKタスク用の軽量Dockerイメージ定義。Python slimベースで、重いPyTorch/CUDA系はDOK起動時にpip installする。
docker/dok_clip_sample/scripts/dok_entrypoint.sh DOKタスクの入口。秘密鍵復元、共有サーバからinput取得、CLIP抽出、output返却を行う。
docker/dok_clip_sample/scripts/run_clip_extract.py open_clipで画像を512次元ベクトルに変換し、parquet/csv/jsonを出力する。
tools/prepare_dok_clip_sample_job.ps1 共有サーバにサンプル画像30枚とmanifestを作る補助ツール。
docs/dok_clip_sample_runbook.md DOKタスク作成、環境変数、実行後確認の手順書。

さくら側で用意したもの

項目設定用途
コンテナレジストリ keiba.sakuracr.jp DOKで実行するDockerイメージを保存する。
レジストリ認証情報 ユーザーIDは keiba1。パスワードは資料・Gitには保存しない。 DOKタスクがprivate registryからpullするために使用。今回は一時的にpull可能化して進行。
公開鍵管理 id_ed25519.pub を登録 手元PC/CodexからDOKタスクへSSH接続してデバッグするための公開鍵。
共有サーバ接続鍵 納品用共有鍵を SSH_PRIVATE_KEY_B64 としてタスク環境変数に渡す DOKコンテナから共有サーバ ubuntu@59.106.215.106 へrsync/sshするため。

レジストリパスワード、SSH秘密鍵そのもの、SSH_PRIVATE_KEY_B64 はGitやdocsへ保存しません。

Docker build / push

最初はPyTorch/CUDA入りの重いイメージを作成しましたが、ローカル回線から3GB超の巨大レイヤをpushする途中で broken pipe となりました。そのため、軽量イメージ方式へ切り替えています。

docker login keiba.sakuracr.jp
docker build -t keiba.sakuracr.jp/keiba-dok-clip-sample:0.2 docker/dok_clip_sample
docker push keiba.sakuracr.jp/keiba-dok-clip-sample:0.2
タグ方式結果
0.1 PyTorch/CUDA同梱、約9.65GB 3.12GBレイヤのpushで2回失敗。使用しない。
0.2 軽量Pythonイメージ、約199MB。DOK起動時にpip install。 push成功。DOK実行に使用。

タスク作成設定

名前keiba-dok-clip-sample
イメージkeiba.sakuracr.jp/keiba-dok-clip-sample:0.2
レジストリ認証情報keiba.sakuracr.jp 用の認証情報を指定。公開pullにした場合は未指定でもpull可能。
SSH有効。シェルは /bin/bash
コマンド空欄でもENTRYPOINTで動作。デバッグ時は bash -lc '/app/scripts/dok_entrypoint.sh; sleep 3600'

環境変数

JOB_ID=clip_sample_20260624
VPS_HOST=59.106.215.106
VPS_USER=ubuntu
SSH_KEY=/secrets/keiba_delivery_shared_ed25519
MODEL_NAME=ViT-B-32
PRETRAINED=laion2b_s34b_b79k
BATCH_SIZE=16
DOK_RUNTIME_INSTALL=1
SSH_PRIVATE_KEY_B64=<納品用共有秘密鍵をbase64化した値>

共有サーバ側の入出力

入力 /data/dok_jobs/clip_sample_20260624/input/
出力 /data/dok_jobs/clip_sample_20260624/output/
/data/dok_jobs/clip_sample_20260624/output/
  clip_embeddings.parquet        458,841 bytes
  clip_embeddings_preview.csv    114,136 bytes
  failed_images.csv              1 byte
  run_summary.json               533 bytes

実行結果 summary

{
  "job_id": "clip_sample_20260624",
  "model_name": "ViT-B-32",
  "pretrained": "laion2b_s34b_b79k",
  "device": "cuda",
  "cuda_available": true,
  "torch_version": "2.4.1+cu121",
  "image_count": 30,
  "success_count": 30,
  "failed_count": 0,
  "embedding_dim": 512,
  "elapsed_seconds": 15.155
}

今後の使い方