高火力DOKでLLMを動かす; オブジェクトストレージとコンテナレジストリの連携
[更新: 2025年12月03日]
概要
本チュートリアルでは、 オブジェクトストレージ や コンテナレジストリ と連携して、高火力DOK を動作させる方法を解説します。
Ollama を利用して、プロンプトを元に文章を出力します。
今回は、さくらのクラウドのサービスを以下のように利用します。
オブジェクトストレージ: Hugging Face からダウンロードしたモデルの保存場所
コンテナレジストリ: 実行イメージの保存場所
前提
さくらのクラウドのユーザー登録が完了していること。
本チュートリアルは、Unix系環境を想定して解説します。Windows 環境をご利用のユーザーは、 WSL2 を導入し、 WSL2 上で本チュートリアルを行うことを推奨します。
必要なツール
本チュートリアルでは、さくらのクラウドとユーザーの端末(以下「作業端末」)上での動作を想定します。 作業端末に下記のツールをインストールしてください。
ツール名 |
備考 |
作業端末上で Docker イメージを作成したり、 コンテナレジストリ へ
イメージを登録する際に利用します。
|
|
LLM からのプロンプトに対するレスポンスを受け取る際に使用します。
出力結果を見やすくするツールであるため、インストール必須ツールではありません。
|
手順
チュートリアルを開始します。
1. さくらのオブジェクトストレージにバケットを作成する
さくらのクラウドへログインしてください。
作業するプロジェクトを選択してください。
さくらのオブジェクトストレージを選択してください。
ヒント
さくらのオブジェクトストレージに関する操作は、さくらのオブジェクトストレージのマニュアル を参照してください。
さくらのオブジェクトストレージを開き、サイトを選択してください。
「サイトの利用開始」にて「OK」をクリックしてください。
この際に、アクセスキーIDとシークレットアクセスキーが表示されますので、控えてください。「閉じる」をクリックしてください。
サイト選択時の表示されるリージョンとエンドポイントを控えてください。
バケットを作成します。バケットを選択してください。
バケットの追加を選択してください。
バケットの追加にて、名前を任意の名前で入力してください。
本チュートリアルでは
dok-tutorialと設定した場合で解説してください。入力を行ったら「追加」をクリックして、バケットを追加してください。
右上の
<会員ID>:<プロジェクト名>のメニューをクリックし、「ホームに戻る」をクリックしてください。
2. モデルを作業端末にダウンロードし、オブジェクトストレージにモデルを格納する
Hugging Face から本チュートリアルに利用するモデルを2つダウンロードしてください。
上記 Hugging Face にページにアクセスした後、画面のアイコンをクリックして、モデルをダウンロードしてください。
作業端末上で、ダウンロードしたファイルを保存してあるディレクトリに移動してください。
# ダウンロードしたファイルがあるフォルダに移動
$ cd /path/to/Download
2つのモデルをさくらのオブジェクトストレージへアップロードしてください。
AWS_ACCESS_KEY_IDに 手順1のアクセスキーID、AWS_SECRET_ACCESS_KEYに手順1のシークレットアクセスキー、--endpoint-urlに手順1のエンドポイント、AWS_DEFAULT_REGIONに手順1のリージョンを設定してください(通常はjp-north-1です)。
# オブジェクトストレージにアップロード(tinyllama)
$ AWS_ACCESS_KEY_ID="***********" AWS_SECRET_ACCESS_KEY="*******" AWS_DEFAULT_REGION="jp-north-1" \
aws --endpoint-url="https://{エンドポイント}" s3 cp ./tinyllama-1.1b-chat-v1.0.Q8_0.gguf s3://dok-tutorial
# オブジェクトストレージにアップロード(phi)
$ AWS_ACCESS_KEY_ID="***********" AWS_SECRET_ACCESS_KEY="*******" AWS_DEFAULT_REGION="jp-north-1" \
aws --endpoint-url="https://{エンドポイント}" s3 cp ./Phi-3-mini-4k-instruct-q4.gguf s3://dok-tutorial
3. コンテナレジストリの作成
さくらのクラウドをクリックしてください。
グローバルのプルダウンから「コンテナレジストリ」をクリックしてください。
ヒント
コンテナレジストリに関する操作は、コンテナレジストリのマニュアル を参照してください。
右上の「追加」をクリックしてください。
コンテナレジストリ追加画面で下記のパラメータを入力し、「作成」をクリックしてください。
項目 |
値 |
コンテナレジストリ名 |
任意のレジストリ名 |
公開設定 |
Pull のみ |
画像は例です。
操作確認のモーダルにて、「作成」をクリックしてください。
作成が完了するまで待機します。成功したら「閉じる」をクリックしてください。
作成を完了したら、再びメニューのコンテナレジストリをクリックしてください。
先程作成したコンテレジストリをダブルクリックしてください。
「ユーザー」タブをクリックしてください。
右下の「追加」をクリックします。
ユーザー名・パスワードはともに任意です。ユーザー権限設定は「All」を選択し、「追加」をクリックしてください。
作成が完了できたら、コンテナレジストリ上での設定は完了です。
4. イメージをビルドしてコンテナレジストリに登録
作業端末上で作業を行います。
次のファイルを
Dockerfileというファイル名で保存してください。
FROM ollama/ollama:latest
ENTRYPOINT ["/entrypoint.sh"]
# AWS CLI を追加
RUN apt-get update && apt-get install -y unzip curl && \
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.22.35.zip" -o "awscliv2.zip" && \
unzip awscliv2.zip && ./aws/install && \
rm -rf awscliv2.zip aws/ /var/lib/apt/lists/*
# モデル格納ディレクトリ
WORKDIR /model
# 環境変数(実行時に上書き可能)
ENV MODEL_NAME=tinyllama
ENV S3_BUCKET=dok-tutorial
ENV AWS_DEFAULT_REGION=jp-north-1
ENV MODEL_KEY=tinyllama-1.1b-chat-v1.0.Q8_0.gguf
ENV TEMPERATURE=0.7
ENV NUM_CTX=4096
ENV TEMPLATE='{{ .Prompt }}'
# 起動スクリプトを追加
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
EXPOSE 11434
CMD ["serve"]
次のファイルを entrypoint.sh というファイル名で保存してください。
#!/bin/bash
set -e
echo "Starting Ollama container"
echo "Downloading model from S3: s3://${S3_BUCKET}/${MODEL_KEY}"
aws s3 cp s3://${S3_BUCKET}/${MODEL_KEY} /model/model.gguf
# Debug info
echo "AWS Region: ${AWS_DEFAULT_REGION}"
[ -n "$AWS_ENDPOINT_URL" ] && echo "Custom S3 endpoint: ${AWS_ENDPOINT_URL}"
# Prepare AWS CLI options
AWS_OPTS=""
[ -n "$AWS_ENDPOINT_URL" ] && AWS_OPTS="--endpoint-url ${AWS_ENDPOINT_URL}"
# Download model
aws $AWS_OPTS s3 cp s3://${S3_BUCKET}/${MODEL_KEY} /model/model.gguf
echo "Creating Modelfile dynamically..."
cat <<EOF > /model/Modelfile
FROM /model/model.gguf
TEMPLATE """${TEMPLATE}"""
PARAMETER temperature ${TEMPERATURE}
PARAMETER num_ctx ${NUM_CTX}
EOF
echo "Modelfile created:"
cat /model/Modelfile
# --- 既存の ollama serve が動いていたら kill ---
if pgrep -x ollama >/dev/null; then
echo "Existing ollama process found. Killing..."
pkill -9 ollama || true
sleep 2
else
echo "No existing ollama process running."
fi
# --- バックグラウンドで一時サーバー起動して create ---
echo "Starting Ollama server temporarily..."
ollama serve > /tmp/ollama.log 2>&1 &
sleep 3
echo "Registering model '${MODEL_NAME}' with Ollama..."
ollama create "${MODEL_NAME}" -f /model/Modelfile || true
# --- 一時サーバーをkillしてから本番サーバーを起動 ---
echo "🧹 Stopping temporary Ollama server..."
pkill -9 ollama || true
sleep 2
echo "Launching Ollama server in foreground..."
exec ollama serve
作業ディレクトリーのファイル構成は以下の状態であることを確認してください。
$ ls
Dockerfile entrypoint.sh
Docker を利用し、コンテナレジストリにログインしてください。
ユーザー名、パスワードは、手順3で設定したユーザー名とパスワードをそれぞれ入力してください。
$ docker login {手順3で設定したコンテナレジストリのホスト名}
Username: {手順3で設定したユーザー名}
Password: {手順3で設定したパスワード}
Login Succeeded
下記のコマンドを実行して、イメージをビルドしてコンテナレジストリへpushしてください。
下記の例ではコンテナレジストリ名は、dok-tutorial、イメージ名は ollama-dynamic、バージョンは latest と想定してください。
# イメージをビルド
$ docker buildx build --platform linux/amd64 -t {手順3で作成したコンテナレジストリ}/{イメージ名}:{バージョン} --push .
# コマンド例
$ docker buildx build --platform linux/amd64 -t dok-tutorial.sakuracr.jp/ollama-dynamic:latest --push .
5. 高火力DOKで TinyLlama を動作させる
以降の手順では、高火力DOKの管理画面で行います。
さくらのクラウドにログインして、プロジェクトを選択し、高火力DOKにアクセスしてください。
約款同意画面が出る場合は、約款同意いただける場合は、内容確認後に同意を選択してください。
レジストリー認証情報 にアクセスしてください。
レジストリー認証情報 の「新規登録」をクリックしてください。
手順3で作成したコンテナレジストリを「ホスト名」に入力、手順3で作成したユーザー名・パスワードをそれぞれ入力し、「登録」をクリックしてください。
「タスク」をクリックしてください。
「新規作成」をクリックしてください。
下図のようにタスクの新規作成を行ってください。
項目 |
値 |
名称 |
任意 |
イメージ |
手順4で作成したイメージ名 |
レジストリー認証情報 |
プルダウンから先程登録したレジストリー認証情報を選択 |
HTTP |
スイッチを有効 |
ポート |
11434 |
パス |
/ |
プラン |
V100(32GB) |
最大実行時間 |
未指定 |
環境変数は「追加」をクリックして、下記の値を入力してください。
名称 |
値 |
AWS_ACCESS_KEY_ID |
手順1でサイトの利用開始時に控えたアクセスキーID |
AWS_SECRET_ACCESS_KEY |
手順1でサイトの利用開始時に控えたシークレットアクセスキー |
AWS_DEFAULT_REGION |
手順1で参照したリージョン |
AWS_ENDPOINT_URL |
手順1で参照した エンドポイントの先頭に https:// を付与した文字列
例として石狩第一ゾーンの場合 https://s3.isk01.sakurastorage.jp です
|
S3_BUCKET |
手順1で設定したバケット名 |
上記を適用した場合のスクリーンショットです。
すべて入力が完了したら、「作成」をクリックしてください。
タスク詳細画面から、HTTP URL カラムの「詳細」をクリックしてください。
モーダルから、オリジンURLをコピーしてください。
タスクの進捗具合によってはURLが表示されません。
作業端末上でターミナルを開いてください。
先程のオリジンURLの末尾に api/tags をつけて実行してください。
Ollama のモデル読み込みが完了していない段階だと、結果が取得できませんが、正常に起動が完了すると、下のような結果が取得できます。
jq をインストールしていない場合は、インストールもしくは実行コマンドを変更してください。
このときに、parameter_size が 1.1B となっていることが確認できます。
$ curl {オリジンURL}/api/tags | jq .
{
"models": [
{
"name": "tinyllama:latest",
"model": "tinyllama:latest",
"modified_at": "2025-11-11T01:38:45.063074306Z",
"size": 1170782123,
"digest": "54deb394255ac3a0409f84e14aefa7e340f1042ca35850a60007b9520ff9f132",
"details": {
"parent_model": "",
"format": "gguf",
"family": "llama",
"families": [
"llama"
],
"parameter_size": "1.1B",
"quantization_level": "Q8_0"
}
}
]
}
最後に、Ollama にプロンプトをリクエストしてください。
プロンプトに応じた文章を出力されます。
レスポンスは一例であり、プロンプトが同じでも結果は毎回異なります。
$ curl {オリジンURL}/api/generate -d '{"model":"tinyllama", "prompt": "hello, how are you?"}' \
| jq -r .response | tr -d '\n'
JEN: Hi there! I'm doing well. How about you?KAREN: I'm good, thanks. So, have you been keeping busy lately?
# 中略
タスク詳細画面から「中断」をクリックして、タスクを終了させます。
注意
タスクを終了しないと、時間課金が継続します。利用を終了した場合は、タスクの中断を行ってください。
【付録】モデルを Phi-3 に変更して高火力DOKで動作させる
手順5と異なるモデルを利用して、高火力DOK上で Ollama を動作させます。
タスク作成時に環境変数を変更するだけで、実行するモデルを変更することが可能です。
手順5で実行していたタスクをクリックしてください。
「コピーして新規作成」をクリックしてください。
下図のようにタスクの新規作成を行ってください。
ここまでは 手順5 と同様です。
項目 |
値 |
名称 |
任意 |
イメージ |
手順4で作成したイメージ名 |
レジストリー認証情報 |
プルダウンから先程登録したレジストリー認証情報を選択 |
HTTP |
スイッチを有効 |
ポート |
11434 |
パス |
/ |
プラン |
V100(32GB) |
最大実行時間 |
未指定 |
環境変数は「追加」をクリックして、下記の値を入力してください。
MODEL_KEY,MODEL_NAMEを変更してください。一部環境変数が追加されることに注意してください。
名称 |
値 |
AWS_ACCESS_KEY_ID |
手順1でサイトの利用開始時に控えたアクセスキーID |
AWS_SECRET_ACCESS_KEY |
手順1でサイトの利用開始時に控えたシークレットアクセスキー |
AWS_DEFAULT_REGION |
手順1で参照したリージョン |
AWS_ENDPOINT_URL |
手順1で参照した エンドポイントの先頭に https:// を付与した文字列
例として石狩第一ゾーンの場合 https://s3.isk01.sakurastorage.jp です
|
S3_BUCKET |
手順1で設定したバケット名 |
MODEL_KEY |
Phi-3-mini-4k-instruct-q4.gguf |
MODEL_NAME |
phi:latest |
上記を適用した場合のスクリーンショットです。すべて入力が完了したら、画面をスクロールし「作成」をクリックしてください。
タスク詳細画面から、HTTP のカラムの「詳細」をクリックしてください。
モーダルから、オリジンURLをコピーしてください。
作業端末上でターミナルを開いてください。
先程のオリジンURLに api/tags をつけて実行してください。
このときに、parameter_size が 3.8B となっており、手順5のモデルと変更されていることがわかります。
$ curl {オリジンURL}/api/tags | jq .
{
"models": [
{
"name": "phi:latest",
"model": "phi:latest",
"modified_at": "2025-11-11T01:31:21.772112795Z",
"size": 2393231630,
"digest": "f168d4be17db4740107957914b24acd785f33099d936ee21d0125c07de32e507",
"details": {
"parent_model": "",
"format": "gguf",
"family": "phi3",
"families": [
"phi3"
],
"parameter_size": "3.8B",
"quantization_level": "Q4_K_M"
}
}
]
}
最後に、タスク上の Ollama にプロンプトを投げて、文章を出力してください。
この際に、手順5とリクエストボディが異なっていることに注意してください。
$ curl {httpのオリジンURL}/api/generate -d '{"model": "phi:latest", "prompt": "hello, how are you?"}' \
| jq -r .response | tr -d '\n'
fine. i enjoy coding in c++ and learning new things about it.
高火力DOKから「キャンセル」をクリックして、タスクを終了してください。
以上で、本チュートリアルは終了です。
注意
タスクを終了しないと、時間課金が継続します。利用を終了した場合は、タスクの中断を行ってください。