高火力DOKでLLMを動かす; オブジェクトストレージとコンテナレジストリーの連携

[更新: 2026年03月26日]

概要

  • 本チュートリアルでは、 オブジェクトストレージ や コンテナレジストリ と連携して、高火力DOK を動作させる方法を解説します。

  • Ollama を利用して、プロンプトを元に文章を出力します。

  • 今回は、さくらのクラウドのサービスを以下のように利用します。

    • オブジェクトストレージ: Hugging Face からダウンロードしたモデルの保存場所

    • コンテナレジストリー: 実行イメージの保存場所

前提

  • さくらのクラウドのユーザー登録が完了していること。

  • 本チュートリアルは、Unix系環境を想定して解説します。Windows 環境をご利用のユーザーは、 WSL2 を導入し、 WSL2 上で本チュートリアルを行うことを推奨します。

必要なツール

本チュートリアルでは、さくらのクラウドとユーザーの端末(以下「作業端末」)上での動作を想定します。 作業端末に下記のツールをインストールしてください。

ツール名

備考

Docker

作業端末上で Docker イメージを作成したり、 コンテナレジストリ へ
イメージを登録する際に利用します。

AWS CLI

オブジェクトストレージ へファイルをアップロードする際に利用します。
さくらのオブジェクトストレージの互換性の問題があるため
リンク先を参考にして正しいバージョンをインストールしてください。

jq

LLM からのプロンプトに対するレスポンスを受け取る際に使用します。
出力結果を見やすくするツールであるため、インストール必須ツールではありません。

手順

チュートリアルを開始します。

1. さくらのオブジェクトストレージにバケットを作成する

  • さくらのクラウドへログインしてください。

  • 作業するプロジェクトを選択してください。

プロジェクトを選択
  • さくらのオブジェクトストレージを選択してください。

オブジェクトストレージを選択

ヒント

さくらのオブジェクトストレージに関する操作は、さくらのオブジェクトストレージのマニュアル を参照してください。

  • さくらのオブジェクトストレージを開き、サイトを選択してください。

サイトの利用
  • 「サイトの利用開始」にて「OK」をクリックしてください。

サイトの利用開始
  • この際に、アクセスキーIDとシークレットアクセスキーが表示されますので、控えてください。「閉じる」をクリックしてください。

アクセスキーとアクセスシークレット画面
  • サイト選択時の表示されるリージョンとエンドポイントを控えてください。

リージョン・エンドポイントを確認
  • バケットを作成します。バケットを選択してください。

バケットを作成
  • バケットの追加を選択してください。

バケットの追加
  • バケットの追加にて、名前を任意の名前で入力してください。

  • 本チュートリアルでは dok-tutorial と設定した場合で解説してください。

  • 入力を行ったら「追加」をクリックして、バケットを追加してください。

バケットを作成
  • 右上の <会員ID>:<プロジェクト名> のメニューをクリックし、「ホームに戻る」をクリックしてください。

ホームに戻る

2. モデルを作業端末にダウンロードし、オブジェクトストレージにモデルを格納する

  • Hugging Face から本チュートリアルに利用するモデルを2つダウンロードしてください。

  • tinyllama-1.1b-chat-v1.0.Q8_0.gguf

  • Phi-3-mini-4k-instruct-q4.gguf

  • 上記 Hugging Face にページにアクセスした後、画面のアイコンをクリックして、モデルをダウンロードしてください。

Hugging Face ダウンロード画面-tinyllama hugging face ダウンロード画面-phi
  • 作業端末上で、ダウンロードしたファイルを保存してあるディレクトリに移動してください。

# ダウンロードしたファイルがあるフォルダーに移動
$ 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にアクセスしてください。

高火力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で設定したバケット名

  • 上記を適用した場合のスクリーンショットです。

タスク作成例1 タスク作成例2
  • すべて入力が完了したら、「作成」をクリックしてください。

タスクを作成完了
  • タスク詳細画面から、HTTP URL カラムの「詳細」をクリックしてください。

HTTP URL をクリック
  • モーダルから、オリジンURLをコピーしてください。

  • タスクの進捗具合によってはURLが表示されません。

HTTPをコピー
  • 作業端末上でターミナルを開いてください。

  • 先程のオリジン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

  • 上記を適用した場合のスクリーンショットです。すべて入力が完了したら、画面をスクロールし「作成」をクリックしてください。

タスク作成例1 タスク作成例2
  • タスク詳細画面から、HTTP のカラムの「詳細」をクリックしてください。

HTTP URL をコピー
  • モーダルから、オリジンURLをコピーしてください。

高火力DOKにログイン
  • 作業端末上でターミナルを開いてください。

  • 先程のオリジン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から「キャンセル」をクリックして、タスクを終了してください。

タスクを終了

以上で、本チュートリアルは終了です。

注意

タスクを終了しないと、時間課金が継続します。利用を終了した場合は、タスクの中断を行ってください。