見出し画像

Dockerで最新ROCmを環境を汚さずに試す ~仮想コンテナで重要ソフトを安全に試す llama-cppでLLMテスト~

こんにちはRcatです。
今回はDockerが主人公です。
今までDifyやゲームサーバーなどでなんとなく使っていただけですが、仕事で使うようになり理解が必要になったので調べたところ、"超使える"ということに今更ながら気づきましたので、ちょっと試していきたいと思います。

テーマは再インストールがだるいROCm最新版を手軽に試したいです



はじめに

利用規約

情報や作品の活用時は事前に利用規約をご確認ください。

コメントについて

利用規約のガイドラインを確認の上コメントしてください。
則っていないコメントは削除します。


概要

Dockerとは

Dockerは、Linux上で動作するコンテナ型仮想環境を提供するツールです。
この辺はいろんなところで説明されているので詳細は省きますが、OSのカーネルを共用それ以上の部分をコンテナで隔離する仮想環境のため、通常の仮想マシンに比べ圧倒的に低リソースであることが特徴です。

確かにLinuxって、カーネルだけではOSとしては使えなくて、シェルやデスクトップなどを組み合わせたUbuntuやCentOSなどのディストリビューションになって使っていますよね。

Dockerはカーネルだけ共用なので、仮想マシンのように上に積み上げるのではなく、横に広がるイメージでしょうか。
ホストOSとコンテナが横並び?みたいな感じだと思います。

メリット

ぱっと見ですがこんなメリットがありそうです

  • OSを汚さずにいろいろ試せる
    ドライバなど心臓部に近いものでなければ、コンテナ内の仮想環境はまっさらな状態にできます。
    今回やるROCmも、Radeonのドライバではないので、アップグレード前に試せるってわけですね。
    もし失敗したら戻すの大変ですし、最悪OS再インストールかもですし。

  • すぐできてすぐ消せる
    使い終わったコンテナは解体すればなくなります。
    OSをインストールするわけではないので軽いため、作るのも消すのも早い。

  • 移植に強い
    作ったコンテナのイメージを保持しておけば同じOSのほかのマシンに最短コマンド一発で環境を移植できます。

  • Docker Hubに様々なイメージがある
    基本的にコンテナのベースは何かしらのLinuxのディストリビューションです。
    それに対して何かをインストール済みにして使いやすい状態にしたものがたくさんあります。
    今回は、AMDが公式で公開しているROCmとPytorchがインストール済みのイメージを使います。
    ホストマシンにドライバさえ入っていればもう動くんですよ。

  • Windowsでも使える
    Linuxがベースなのですが、WindowsではWSLという力業でWin => Linux => Dockerという形で使えます。
    効率悪い気がしますが、一発で移植などを考えるとものによってはありかと。DBとか。

事前準備

Dockerのインストール

公式で導入手順がありますので、導入しましょう

イメージの取得

今回はこちらのAMDが公式で公開している、RCOmとPytorchがインストール済みのイメージを使います。

RCOmのバージョン及びPythonのバージョン及びUbuntuのバージョンのバリエーションでいくつかあるので好きなのを選びましょう。
私はRCOm7.1 Python3.12にしました。

公式のコマンドをコピペしてイメージをプル(落とす)します

完了したら下記コマンドを入力するとマシン内に存在するイメージを確認できます。
このイメージでかいですね。さすがROCmにPytorch入ってるやつw
まぁ今回はllama-cppなので使わないんですがw
ただ、Pytorch入ってるということはCコンパイラやgitコマンドなどがすでにあるということなので、そういうのも兼ねてこのイメージにしてます。
もしかしたらStableDiffusionとか使うかもですしね!

rcat@rcat-EVO-X2:~$ docker image ls
IMAGE                                                           ID             DISK USAGE   CONTENT SIZE   EXTRA
rocm/pytorch:rocm7.1_ubuntu24.04_py3.12_pytorch_release_2.9.1   c61158cfb7f3       31.3GB             0B

イメージからコンテナを起動する

では早速試してみます
このコマンドは、指定したイメージをベースにコンテナを作成したら、その中のシェルにルートでログインするコマンドです。
また、--rmがあるのでログアウトするとコンテナが解体されます。再利用したいときは外してください。

rcat@rcat-EVO-X2:~$ docker run --rm -it rocm/pytorch:rocm7.1_ubuntu24.04_py3.12_pytorch_release_2.9.1

なるほど、こんな感じか

いろいろ忘れてた

このままだとAIのモデルを転送できない…
ネットワークも共有できない
GPUも認識できない
というわけでコマンド変更。からの--rmも外す。

docker run -it --network=host --device=/dev/kfd --device=/dev/dri --group-add=video --ipc=host --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --shm-size 16G -v ~/dockerdir:/usr/local/bin/host rocm/pyt
orch:rocm7.1_ubuntu24.04_py3.12_pytorch_release_2.9.1

"-v ~/dockerdir:/usr/local/bin/host"を追加しました。
これは、ホストマシンのユーザーフォルダ内の"dockerdir"と、コンテナ内の"/usr/local/bin/host"をつなげるオプションです。この中はお互いにつながり同期されます。
ホストマシンでは以下の場所にデータを置きました

"--network=host --device=/dev/kfd --device=/dev/dri --group-add=video --ipc=host --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --shm-size 16G"
この辺はネットワークの共有やGPUを認識させるための設定です。
※公式に書いてあります

というわけでやり直しっと!
amd-smiと入力して認識されてればOK。ちゃんとROCm7.1です。

ホストマシンだとこう。7.0.2。共存してるww

LLMを動かしてみる

というわけでpythonの仮想環境作って、Llama-cppを入れます。

入れたらとりあえずインタプリタで見てみます

(venv) root@rcat-EVO-X2:/usr/local/bin# python
Python 3.12.3 (main, Aug 14 2025, 17:47:21) [GCC 13.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from llama_cpp import Llama
>>> llm = Llama(model_path='/usr/local/bin/host/gemma-3-4b-it-Q4_K_M.gguf', n_ctx=2048,n_gpu_layers=-1)


ggml_cuda_init: GGML_CUDA_FORCE_MMQ:    no
ggml_cuda_init: GGML_CUDA_FORCE_CUBLAS: no
ggml_cuda_init: found 1 ROCm devices:
  Device 0: AMD Radeon 8060S, gfx1151 (0x1151), VMM: no, Wave Size: 32
llama_model_load_from_file_impl: using device ROCm0 (AMD Radeon 8060S) - 41666 MiB free
llama_model_loader: loaded meta data with 40 key-value pairs and 444 tensors from /usr/local/bin/host/gemma-3-4b-it-Q4_K_M.gguf (version GGUF V3 (latest))
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.

省略

モデルを読み込んだら、ホストマシンで確認したところVRAMが使われています。うまくいったみたいですね。

続き

>>> stop_tokens: list = ["<|eot_id|>", "<|im_end|>","<end_of_turn>"]
>>> messages = [
... {"role": "system", "content": "あなたは親切なアシスタントです。問いかけに対して丁寧に回答します"},
... {"role": "user", "content": "こんにちわ!ねこってかわいいよね?"}
... ]
>>> output = llm.create_chat_completion(
...     messages=messages,
...     max_tokens=1024,
...     stream=False,
...     stop=stop_tokens,
... )
llama_perf_context_print:        load time =     101.74 ms
llama_perf_context_print: prompt eval time =     101.60 ms /    36 tokens (    2.82 ms per token,   354.34 tokens per second)
llama_perf_context_print:        eval time =    1656.74 ms /   103 runs   (   16.08 ms per token,    62.17 tokens per second)
llama_perf_context_print:       total time =    1936.83 ms /   139 tokens
llama_perf_context_print:    graphs reused =         99
>>> print(output["choices"][0]["message"]["content"])
こんにちは!そうですね、猫は本当に可愛いです!ふわふわの毛並みや、つぶらな瞳、そして気まぐれな仕草…見ているだけで癒されますよね。

猫について何か話したいことや、知りたいことなどありますか?例えば、

*   猫の品種について
*   猫の飼い方について
*   猫の好きな食べ物について
*   猫の面白い行動について

など、どんなことでも構いませんよ!😊

と、まぁこんな感じで無事GPUでの演算を確認しました。
Pythonの仮想環境だけではなく、ROCmなど周りを巻き込むときはかなり使えそうですね!

再利用するとき

今回は--rmを外したので、exitでログアウト後はコンテナが停止状態で残っています。
もう一度立ち上げて入るときは下記コマンドでコンテナのIDを確認しては入れます。

rcat@rcat-EVO-X2:~$ docker container ls -a
CONTAINER ID   IMAGE                                                           COMMAND       CREATED          STATUS                      PORTS     NAMES
60ca8d47a5ec   rocm/pytorch:rocm7.1_ubuntu24.04_py3.12_pytorch_release_2.9.1   "/bin/bash"   27 minutes ago   Exited (0) 17 seconds ago             goofy_knuth


rcat@rcat-EVO-X2:~$ docker start -ai  60ca8d47a5ec
root@rcat-EVO-X2:/# ls
apex-1.9.0a0+rocm7.1.0.git07c3ee53-cp312-cp312-linux_x86_64.whl  lib                opt   tmp
bin                                                              lib.usr-is-merged  proc  torch-2.9.1+rocm7.1.0.lw.git351ff442-cp312-cp312-linux_x86_64.whl
boot                                                             lib32              root  torchaudio-2.9.0+rocm7.1.0.gite3c6ee2b-cp312-cp312-linux_x86_64.whl
dev                                                              lib64              run   torchvision-0.24.0+rocm7.1.0.gitb919bd0c-cp312-cp312-linux_x86_64.whl
etc                                                              libx32             sbin  triton-3.5.1+rocm7.1.0.gita272dfa8-cp312-cp312-linux_x86_64.whl
home                                                             media              srv   usr
install                                                          mnt                sys   var
root@rcat-EVO-X2:/# cd usr/local/bin/
root@rcat-EVO-X2:/usr/local/bin# ls
host  venv

要らなくなったらdocker container rmで解体するか、その前にcommitでイメージ化しましょう。

本当ならここをDockerfile化しておくべきなんですが、今回はテストなのでスキップします。
今後はどこかのツールがDockerfileにして配布になるかもしれません。


まとめ

今回はDockerを使い、ROCmを再インストールすることなく新バージョンを試すことができました。
コンテナ型仮想環境、舐めてはいけませんね!
隔離できるということは、apacheなどのWEBサーバーは決まったフォルダを使うので、1個しか入らないのをたくさん増殖できると…。幅が広がりますね。

DBも、コンテナにしちゃえばスキーマ分けずにDB自体分けられるのか。
そして-vでつないだフォルダを物理バックアップするのがDumpより手っ取り早いと…。移行も検討ですね。

紹介にまで至れるかはわかりませんが、もっと便利なdocker composeも使っていきたいです。

それではまたお会いしましょう。


リンク集

感想投稿フォーム

コメントは公開で恥ずかしい!! Rcatだけに送りたい人向け

ミニPCにLinuxをインストール


いいなと思ったら応援しよう!

Rcat999 情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。