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

[更新: 2025年12月03日]

概要

  • 本チュートリアルでは、 オブジェクトストレージコンテナレジストリ と連携して、高火力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_size1.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_size3.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から「キャンセル」をクリックして、タスクを終了してください。

タスクを終了

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

注意

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