メインコンテンツへスキップ
見出し画像

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をインストール


     
     
    モノづくりが趣味。 "売ってないなら自分で作ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワーク 全部やります。 記事執筆はAI不使用。 ご連絡や利用規約はプロフィール記事参照。

    あなたへのおすすめ