Hashibami.net logo
ルート権限がない大学のGPUサーバーでAIモデルを動かす【備忘録】のカバー画像

ルート権限がない大学のGPUサーバーでAIモデルを動かす【備忘録】

2025/12/22公開

大学のGPUサーバーでコンテナを動かした時の備忘録です

大学でNVIDIA A100が4基入った素晴らしいGPUサーバーを借りられるんですが、以下の制約があります

  • root権限がない(sudoが使えない)
  • aptも使えない
  • dockerは入ってるのになぜか使えない
  • pipも使えない

この状況でどうにかText-to-speechモデルであるT5gemma-TTSをコンテナ上で動かすまでの備忘録です

半分大学の後輩に向けて書いてます
あくまでこの環境での備忘録なので、動かなかったら勘弁してください
(もしくはコメントで補足お願いします♡)

ちなみに筆者のスキルはこんな感じです

  • Docker: まあ使える
  • Podman: 使ったことない

podmanを導入する

前述した通り、Dockerが使えないのでPodmanを使用します

podmanはdockerの親戚みたいなので、ほぼDockerみたいなもの(要出典)です

大きな違いとしては

  • デーモンレス: プロセスレベルでコンテナを動かせる
  • ルートレス可能:ユーザー権限で動かせる(制約あり)
  • docker compose的なのがない:一応追加でインストールすることで利用可能

があります

特にpodman composeはpipでインストールできますが、今回はpipが使えません。そのためdocker composeとpodmanを無理やり繋ぎ込む方法をとります

インストール

早速入れていきましょう。パッケージマネージャーは使えないので、自力で入れます

podmanのlinux向けビルドが有志によって配布されているので、これを入れます

https://github.com/mgoltzsche/podman-static

mkdir -p ~/opt/podman
cd ~/opt/podman
curl -LO https://github.com/mgoltzsche/podman-static/releases/download/v5.7.1/podman-linux-amd64.tar.gz
tar -xvf podman-linux-amd64.tar.gz

そんでもって、以下を.bashrcの末尾に追加します

export PATH="$HOME/opt/podman/podman-linux-amd64/usr/local/bin:$PATH"
export PATH="$HOME/opt/podman/podman-linux-amd64/usr/local/lib/podman:$PATH"

source ~/.bashrcしてpodman --versionが動けばおっけー

設定ファイルを追加

~/.config/containersにファイルを3つ追加します

containers.conf

$HOMEの部分は絶対パスで

[engine]
conmon_path = ["ここに$HOME/opt/podman/podman-linux-amd64/usr/local/lib/podman/conmon"]
helper_binaries_dir = ["ここに$HOME/opt/podman/podman-linux-amd64/usr/local/lib/podman"]

registries.conf

これを入れないとpostgresみたいなshort_nameが使えない

unqualified-search-registries = ["docker.io"]

policy.json

{
  "default": [
    {
        "type": "insecureAcceptAnything"
    }
  ]
}

これで

podman system migrate
podman info | grep rootless

を実行してrootlessがtrueになってれば多分OK

rootlessがtrueになっている

テスト

hello-worldでテストしてみる

podman run --rm hello-world

hello-worldが成功した画像 動いた〜

GPUを使う

このサーバーにはCDIが設定されてないので、コンテナ実行時に手動でGPUを注入する必要がある

ここら辺は理解が浅いので間違ってたらゴメンなさい

nvidia-smiをコンテナ内で動かしてみる

$ ls /dev | grep nvidia
nvidia-caps
nvidia-modeset
nvidia-uvm
nvidia-uvm-tools
nvidia0
nvidia1
nvidia2
nvidia3
nvidiactl

こんな感じでデバイスが出てくるのでnvidia-caps以外をpodman runの引数に指定する

$ podman run --rm \
    --device /dev/nvidia0 \
    --device /dev/nvidia1 \
    --device /dev/nvidia2 \
    --device /dev/nvidia3 \
    --device /dev/nvidiactl \
    --device /dev/nvidia-uvm \
    --device /dev/nvidia-uvm-tools \
    --device /dev/nvidia-modeset \
    -v /usr/lib/x86_64-linux-gnu:/hostlib:ro \
    -v /usr/bin/nvidia-smi:/usr/bin/nvidia-smi:ro \
    -e LD_LIBRARY_PATH=/hostlib \
    nvidia/cuda:12.1.1-devel-ubuntu22.04  \
    nvidia-smi \

これを実行するとコンテナ内でnvidia-smiを実行できた

Docker composeを使いたい

冒頭の通り、podman-composeは使えない(インストールできない)ので、最初から入っているdocker composeを代用する

まず、podmanにDockerのフリをさせます
もう一つSSHを開いて↓を実行する

$ podman system service --time=0 unix:///tmp/podman.sock

その後、元のシェルで

$ export DOCKER_HOST=unix:///tmp/podman.sock
$ docker compose ls

環境変数でDOCKER_HOSTを指定することで、composeがアクセスするソケットを指定できる

T5Gemma-TTSを動かす

ここはモデルによって変わるので、あくまで参考程度に

T5Gemma-TTSはcomposeを用意してくれているので、それをupするだけで実行できる

git clone https://github.com/Aratako/T5Gemma-TTS.git
cd T5Gemma-TTS

.envにHF_TOKEN=<HuggingFaceのトークン>を入れる

事前にイメージをビルド

なぜかcompose upでビルドが失敗したので、事前にイメージをビルドしてそれを指定する

podman build -t t5gemma-tts:local .

composeを動かす

このままでは動かない(deviceとか指定しなければいけない)ので、docker-compose.ymlを改造した

改造内容は

  • build消してさっきビルドしたイメージを指定する
  • network_modeをhostにした
  • なぜかvolumeを使うとエラーが出たので、hf_cacheをバインドに変えた
  • devices, volumes, environmentにGPUを注入した(nvidia-smiは多分いらない、一応入れてる)
services:
  t5gemma-tts:
    image: localhost/t5gemma-tts:local
    ports:
      - "${PORT:-7860}:7860"
    network_mode: host
    devices:
      - /dev/nvidia0
      - /dev/nvidia1
      - /dev/nvidia2
      - /dev/nvidia3
      - /dev/nvidiactl
      - /dev/nvidia-uvm
      - /dev/nvidia-uvm-tools
      - /dev/nvidia-modeset
    volumes:
      - /usr/lib/x86_64-linux-gnu:/hostlib:ro
      - /usr/bin/nvidia-smi:/usr/bin/nvidia-smi:ro
      # Persist HuggingFace cache to avoid re-downloading models
      - ./hf_cache:/app/.cache/huggingface
    environment:
      - HF_TOKEN=${HF_TOKEN:-}
      - LD_LIBRARY_PATH=/hostlib
      - PODMAN_IGNORE_CGROUPSV1_WARNING=1
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    # Override default command if MODEL_DIR is set
    command: >
      python inference_gradio.py
      --model_dir ${MODEL_DIR:-Aratako/T5Gemma-TTS-2b-2b}
      --port 7860
      ${EXTRA_ARGS:-}

これでdocker compose upする

compose upしたスクショ

動いた!
WebUIにアクセスするには適当に別のSSH開いてポートフォワーディングすればOK

$ ssh -L 7860:localhost:7860 ...

まとめ

ルート権限がない大学のGPUサーバーでpodmanを利用してコンテナ・composeを動かすことに成功した

環境によるのであくまで参考程度に…
間違いがあればコメントにお願いします!



コメント

関連記事