結論
実行結果成功、終了コード 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
}
今後の使い方
- 通常運用ではVPS/共有サーバで新規画像リストを作り、DOKへ渡す。
- DOKは必要時だけ起動し、CLIP特徴量を作って共有サーバへ戻す。
- 戻したparquet/csvをDBまたは既存特徴量ファイルへ取り込む。
- 大量画像の再処理や画像特徴量の全作り直しが必要な時だけDOKを使う。