gpt-j-6b-gpu-dockerをWSL2に入れたUbuntu環境下で動作させ…【Windows11】
はじめに
小銭稼ぎの自動化を目標に、ブログ記事を自動生成を試してみたいと思い下調べをしてました。 前回はGoogleから検索結果を引っこ抜いてくるところまでやったので、引っこ抜いたあとの文書加工をするために 今はchatGPT、一昔前にはその前身であるGPT3が流行っていました。 GPT3でも十分な性能を発揮していたようで、API叩くのも良いですがローカルで開発したい思いもあるため、GPT-J-6Bを使用して文書生成を試していきます。
日本語出力できたらいいですが、精度がいいなら英語を出力させて日本語に翻訳したものを最終的に取得するような形でも良いかと。
gpt-j-6b-gpu-dockerの下準備
今回はこれを使っていきます。
幸いにも、dockerイメージがあるのでそれを動かして見るところまでやっていきます。 GPUが積んであれば動かせるとのことですが、CUDA系のインストールは結構落とし穴が多い印象ですが今回はどうでしょうか…
下準備
ここが一番たいへんかもなと思いながらやってます。
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install -y ubuntu-drivers-common
sudo ubuntu-drivers autoinstall
インストールができているかは、このコマンドで確認できる。
nvidia-smi
Githubページ上と、CUDA versionなどが異なるのが非常に気にはなるが進めていく。
Mon Dec 26 00:19:53 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.65.01 Driver Version: 516.94 CUDA Version: 11.7 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... On | 00000000:01:00.0 On | N/A |
| 43% 32C P0 20W / 160W | 1561MiB / 6144MiB | 26% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
Nvidia-Container-Toolkit
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) && \
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - && \
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list && \
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
dockerの立ち上げ
WSL2に入れたUbuntuの場合、systemctlを実行したときはうまく立ち上がらないことが稀によくある。
sudo docker run -p8080:8080 --gpus all --rm -it devforth/gpt-j-6b-gpu
エラー処置(systemdがPID 1以外に設定されている)
上記コマンドを打ち込んだのになぜか動かない場合の対処をまとめます。 当方の環境は、WSL2にUbuntu22.04(LTS)を入れた環境で動かしています。
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.
docker deamonが動いてないんちゃうか?と言うてるようなのでsystemdで立ち上げてみます。
systemctl start docker
すると、systemdがPID 1でシステムが起動されていないので操作できないと怒られます。 そもそも立ち上がってないから動かないっていうのが原因のようです。 なら次に気になるのがなんで動かないんだってばよってことです。
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
プロセス確認して、PID 1で何が動作しているのか確認します。
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1768 1096 ? Sl 00:00 0:00 /init
root 9 0.0 0.0 2128 360 ? Ss 00:00 0:00 /init
root 10 0.0 0.0 2128 372 ? S 00:00 0:00 /init
ayahumo+ 11 0.0 0.0 11464 5476 pts/0 Ss 00:00 0:00 -bash
ayahumo+ 14383 0.0 0.0 12664 1600 pts/0 R+ 00:54 0:00 ps aux
/initとなってますね。
genieをインストールする
WSL2環境下で、Systemdが使えないのを解消するために、genieというツールがある。
sudo apt install lsb-release
sudo wget -O /etc/apt/trusted.gpg.d/wsl-transdebian.gpg https://arkane-systems.github.io/wsl-transdebian/apt/wsl-transdebian.gpg
sudo chmod a+r /etc/apt/trusted.gpg.d/wsl-transdebian.gpg
sudo tee /etc/apt/sources.list.d/wsl-transdebian.list << EOF > /dev/null
deb https://arkane-systems.github.io/wsl-transdebian/apt/ $(lsb_release -cs) main
deb-src https://arkane-systems.github.io/wsl-transdebian/apt/ $(lsb_release -cs) main
EOF
sudo apt update
genieのインストール
sudo apt install -y systemd-genie
genieの立ち上げ失敗について
立ち上げコマンドはこれらしいです。
genie -s
結果として初回起動時は良く失敗します。 GenieのWiki読んで解決せいよと言われますので進めます。
genie: WARNING: systemd default target is default.target; targets other than multi-user.target may not work
genie: WARNING: if you wish to use a different target, this warning can be disabled in the config file
genie: WARNING: if you experience problems, please change the target to multi-user.target
Waiting for systemd....!!!!!!
genie: systemd did not enter running state (degraded) after 240 seconds
genie: this may be due to a problem with your systemd configuration
genie: information on problematic units is available at https://github.com/arkane-systems/genie/wiki/Systemd-units-known-to-be-problematic-under-WSL
genie: a list of failed units follows:
UNIT LOAD ACTIVE SUB DESCRIPTION
● ssh.service loaded failed failed OpenBSD Secure Shell server
● systemd-remount-fs.service loaded failed failed Remount Root and Kernel File Systems
● systemd-sysusers.service loaded failed failed Create System Users
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
3 loaded units listed.
genie: WARNING: systemd is in degraded state, issues may occur!
Systemd units known to be problematic under WSL
ssh.service loaded failed failed OpenBSD Secure Shell server
sudo ssh-keygen -A
これで解決します。SSH用の鍵を作れってことね。
genieを立ち上げてみます。
genie -s
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 173048 13048 ? Ss 01:10 0:00 systemd
他のも共連れで解決しましたね。 systemdがPID 1で動作していることがわかります。
エラー処置(error obtaining controller instance: unable to add return rule in DOCKER-ISOLATION-STAGE-1 )
再びdockerを立ち上げてもエラーが出ます。 エラー内容は変わりましたね。
sudo service docker start
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xeu docker.service" for details.
内容を確認するため、下記コマンドでログ取得します。
sudo dockerd --debug
INFO[2022-12-26T01:34:29.533451292+09:00] Starting up
DEBU[2022-12-26T01:34:29.533771727+09:00] Listener created for HTTP on unix (/var/run/docker.sock)
DEBU[2022-12-26T01:34:29.534164829+09:00] Golang's threads limit set to 172350
INFO[2022-12-26T01:34:29.534336229+09:00] parsed scheme: "unix" module=grpc
INFO[2022-12-26T01:34:29.534351213+09:00] scheme "unix" not registered, fallback to default scheme module=grpc
INFO[2022-12-26T01:34:29.534378502+09:00] ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock <nil> 0 <nil>}] <nil> <nil>} module=grpc
INFO[2022-12-26T01:34:29.534387653+09:00] ClientConn switching balancer to "pick_first" module=grpc
DEBU[2022-12-26T01:34:29.534405340+09:00] metrics API listening on /var/run/docker/metrics.sock
INFO[2022-12-26T01:34:29.535416047+09:00] parsed scheme: "unix" module=grpc
INFO[2022-12-26T01:34:29.535433025+09:00] scheme "unix" not registered, fallback to default scheme module=grpc
INFO[2022-12-26T01:34:29.535448926+09:00] ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock <nil> 0 <nil>}] <nil> <nil>} module=grpc
INFO[2022-12-26T01:34:29.535462231+09:00] ClientConn switching balancer to "pick_first" module=grpc
DEBU[2022-12-26T01:34:29.535967555+09:00] Using default logging driver json-file
DEBU[2022-12-26T01:34:29.536001213+09:00] [graphdriver] priority list: [btrfs zfs overlay2 fuse-overlayfs aufs overlay devicemapper vfs]
DEBU[2022-12-26T01:34:29.536023857+09:00] processing event stream module=libcontainerd namespace=plugins.moby
DEBU[2022-12-26T01:34:29.538406141+09:00] backingFs=extfs, projectQuotaSupported=false, indexOff="index=off,", userxattr="" storage-driver=overlay2
INFO[2022-12-26T01:34:29.538430561+09:00] [graphdriver] using prior storage driver: overlay2
DEBU[2022-12-26T01:34:29.538444450+09:00] Initialized graph driver overlay2
DEBU[2022-12-26T01:34:29.538505499+09:00] No quota support for local volumes in /var/lib/docker/volumes: Filesystem does not support, or has not enabled quotas
WARN[2022-12-26T01:34:29.540462841+09:00] Your kernel does not support cgroup blkio weight
WARN[2022-12-26T01:34:29.540479835+09:00] Your kernel does not support cgroup blkio weight_device
WARN[2022-12-26T01:34:29.540490824+09:00] Your kernel does not support cgroup blkio throttle.read_bps_device
WARN[2022-12-26T01:34:29.540492723+09:00] Your kernel does not support cgroup blkio throttle.write_bps_device
WARN[2022-12-26T01:34:29.540494268+09:00] Your kernel does not support cgroup blkio throttle.read_iops_device
WARN[2022-12-26T01:34:29.540503960+09:00] Your kernel does not support cgroup blkio throttle.write_iops_device
DEBU[2022-12-26T01:34:29.540585095+09:00] Max Concurrent Downloads: 3
DEBU[2022-12-26T01:34:29.540596820+09:00] Max Concurrent Uploads: 5
DEBU[2022-12-26T01:34:29.540598754+09:00] Max Download Attempts: 5
INFO[2022-12-26T01:34:29.540618511+09:00] Loading containers: start.
DEBU[2022-12-26T01:34:29.540646770+09:00] Option Experimental: false
DEBU[2022-12-26T01:34:29.540657061+09:00] Option DefaultDriver: bridge
DEBU[2022-12-26T01:34:29.540659706+09:00] Option DefaultNetwork: bridge
DEBU[2022-12-26T01:34:29.540669943+09:00] Network Control Plane MTU: 1500
DEBU[2022-12-26T01:34:29.540830522+09:00] processing event stream module=libcontainerd namespace=moby
DEBU[2022-12-26T01:34:29.543374911+09:00] /usr/sbin/iptables, [--wait -t filter -C FORWARD -j DOCKER-ISOLATION]
DEBU[2022-12-26T01:34:29.543994832+09:00] /usr/sbin/iptables, [--wait -t nat -D PREROUTING -m addrtype --dst-type LOCAL -j DOCKER]
DEBU[2022-12-26T01:34:29.544649117+09:00] /usr/sbin/iptables, [--wait -t nat -D OUTPUT -m addrtype --dst-type LOCAL ! --dst 127.0.0.0/8 -j DOCKER]
DEBU[2022-12-26T01:34:29.545249654+09:00] /usr/sbin/iptables, [--wait -t nat -D OUTPUT -m addrtype --dst-type LOCAL -j DOCKER]
DEBU[2022-12-26T01:34:29.545820828+09:00] /usr/sbin/iptables, [--wait -t nat -D PREROUTING]
DEBU[2022-12-26T01:34:29.546339261+09:00] /usr/sbin/iptables, [--wait -t nat -D OUTPUT]
DEBU[2022-12-26T01:34:29.546778461+09:00] /usr/sbin/iptables, [--wait -t nat -F DOCKER]
DEBU[2022-12-26T01:34:29.547196209+09:00] /usr/sbin/iptables, [--wait -t nat -X DOCKER]
DEBU[2022-12-26T01:34:29.547618706+09:00] /usr/sbin/iptables, [--wait -t filter -F DOCKER]
DEBU[2022-12-26T01:34:29.548121092+09:00] /usr/sbin/iptables, [--wait -t filter -X DOCKER]
DEBU[2022-12-26T01:34:29.548561242+09:00] /usr/sbin/iptables, [--wait -t filter -F DOCKER-ISOLATION-STAGE-1]
DEBU[2022-12-26T01:34:29.549008167+09:00] /usr/sbin/iptables, [--wait -t filter -X DOCKER-ISOLATION-STAGE-1]
DEBU[2022-12-26T01:34:29.549411104+09:00] /usr/sbin/iptables, [--wait -t filter -F DOCKER-ISOLATION-STAGE-2]
DEBU[2022-12-26T01:34:29.549824131+09:00] /usr/sbin/iptables, [--wait -t filter -X DOCKER-ISOLATION-STAGE-2]
DEBU[2022-12-26T01:34:29.550240521+09:00] /usr/sbin/iptables, [--wait -t filter -F DOCKER-ISOLATION]
DEBU[2022-12-26T01:34:29.550655615+09:00] /usr/sbin/iptables, [--wait -t filter -X DOCKER-ISOLATION]
DEBU[2022-12-26T01:34:29.551093643+09:00] /usr/sbin/iptables, [--wait -t nat -n -L DOCKER]
DEBU[2022-12-26T01:34:29.551563136+09:00] /usr/sbin/iptables, [--wait -t nat -N DOCKER]
DEBU[2022-12-26T01:34:29.552098106+09:00] /usr/sbin/iptables, [--wait -t filter -n -L DOCKER]
DEBU[2022-12-26T01:34:29.552594702+09:00] /usr/sbin/iptables, [--wait -t filter -N DOCKER]
DEBU[2022-12-26T01:34:29.553066705+09:00] /usr/sbin/iptables, [--wait -t filter -n -L DOCKER-ISOLATION-STAGE-1]
DEBU[2022-12-26T01:34:29.553514335+09:00] /usr/sbin/iptables, [--wait -t filter -N DOCKER-ISOLATION-STAGE-1]
DEBU[2022-12-26T01:34:29.553954915+09:00] /usr/sbin/iptables, [--wait -t filter -n -L DOCKER-ISOLATION-STAGE-2]
DEBU[2022-12-26T01:34:29.554464901+09:00] /usr/sbin/iptables, [--wait -t filter -N DOCKER-ISOLATION-STAGE-2]
DEBU[2022-12-26T01:34:29.554881918+09:00] /usr/sbin/iptables, [--wait -t filter -C DOCKER-ISOLATION-STAGE-1 -j RETURN]
DEBU[2022-12-26T01:34:29.555365477+09:00] /usr/sbin/iptables, [--wait -A DOCKER-ISOLATION-STAGE-1 -j RETURN]
DEBU[2022-12-26T01:34:29.716339097+09:00] daemon configured with a 15 seconds minimum shutdown timeout
DEBU[2022-12-26T01:34:29.716413652+09:00] start clean shutdown of all containers with a 15 seconds timeout...
DEBU[2022-12-26T01:34:29.716488169+09:00] found 0 orphan layers
DEBU[2022-12-26T01:34:29.717398833+09:00] Cleaning up old mountid : start.
INFO[2022-12-26T01:34:29.717628647+09:00] stopping event stream following graceful shutdown error="<nil>" module=libcontainerd namespace=moby
DEBU[2022-12-26T01:34:29.717846026+09:00] Cleaning up old mountid : done.
failed to start daemon: Error initializing network controller: error obtaining controller instance: unable to add return rule in DOCKER-ISOLATION-STAGE-1 chain: (iptables failed: iptables --wait -A DOCKER-ISOLATION-STAGE-1 -j RETURN: iptables v1.8.7 (nf_tables): RULE_APPEND failed (No such file or directory): rule in chain DOCKER-ISOLATION-STAGE-1
(exit status 4))
INFO[2022-12-26T01:34:29.718333390+09:00] stopping event stream following graceful shutdown error="context canceled" module=libcontainerd namespace=plugins.moby
ぱっと見つかるのはこのエラーです。
error obtaining controller instance: unable to add return rule in DOCKER-ISOLATION-STAGE-1
Microsoftの実装でKernelバージョンが異なるようです。
解決策としては、こちらを実施します。 入力を求められたら1を実施します。
sudo update-alternatives --config iptables
これで、無事Dockerが立ち上がれば成功です。
sudo service docker start
sudo service docker status
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-12-26 01:38:21 JST; 41s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
やったね。
gpt-j-6b-gpu-dockerの立ち上げ
これで、立ち上げることができそうです。長かった。
sudo docker run -p8080:8080 --gpus all --rm -it devforth/gpt-j-6b-gpu
立ち上がるとインストールが始まりますのでしばらく放置します。
Unable to find image 'devforth/gpt-j-6b-gpu:latest' locally
latest: Pulling from devforth/gpt-j-6b-gpu
da7391352a9b: Pull complete
14428a6d4bcd: Pull complete
2c2d948710f2: Pull complete
0ebd322634c1: Pull complete
36520dd466ac: Pull complete
fe6ccac2e64b: Pull complete
baeafe505be6: Pull complete
9a60c4a15a85: Pull complete
8141702f38d1: Pull complete
520cca2bc1c5: Pull complete
066adaf7611d: Pull complete
ad6e0b2e0d09: Pull complete
87e906a372bf: Pull complete
213cef1b9d03: Pull complete
c21a7110cb29: Pull complete
4ea96cdd206c: Pull complete
1ff80ba8f989: Pull complete
Digest: sha256:bf33688d8c8e070414172de327d2f4ed1b46a67ccb48eedcc6c2a7053979898a
Status: Downloaded newer image for devforth/gpt-j-6b-gpu:latest
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy'
nvidia-container-cli: mount error: file creation failed: /var/lib/docker/overlay2/0a9d6ec9612e5b02dac8649093fe646126c8e2b62e06f12e2d862f09f92e3d92/merged/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1: file exists: unknown.
動かない原因探しのため、下記コマンドをまずは実行。
nvidia-smi
Command 'nvidia-smi' not found, but can be installed with:
sudo apt install nvidia-utils-390 # version 390.157-0ubuntu0.22.04.1, or
sudo apt install nvidia-utils-450-server # version 450.216.04-0ubuntu0.22.04.1
sudo apt install nvidia-utils-470 # version 470.161.03-0ubuntu0.22.04.1
sudo apt install nvidia-utils-470-server # version 470.161.03-0ubuntu0.22.04.1
sudo apt install nvidia-utils-510 # version 510.108.03-0ubuntu0.22.04.1
sudo apt install nvidia-utils-515 # version 515.86.01-0ubuntu0.22.04.1
sudo apt install nvidia-utils-515-server # version 515.86.01-0ubuntu0.22.04.1
sudo apt install nvidia-utils-525 # version 525.60.11-0ubuntu0.22.04.1
sudo apt install nvidia-utils-418-server # version 418.226.00-0ubuntu4
sudo apt install nvidia-utils-510-server # version 510.47.03-0ubuntu3
何故かインストールされていないようなのでこちらを追加。
sudo apt install nvidia-utils-525
続いてまだ足りないようなのでこちらをインストール
sudo apt install nvidia-compute-utils-525
だめですね。
GPUなしで動かしてみる。
sudo docker run -p8080:8080 --rm -it devforth/gpt-j-6b-gpu
これなら動く
まとめ
GPUは駄目だったが一応備忘録として残しとくか。