gpt-j-6b-gpu-dockerをWSL2に入れたUbuntu環境下で動作させ…【Windows11】

2022-12-27-00-55-33.webp
目次

はじめに

小銭稼ぎの自動化を目標に、ブログ記事を自動生成を試してみたいと思い下調べをしてました。 前回はGoogleから検索結果を引っこ抜いてくるところまでやったので、引っこ抜いたあとの文書加工をするために 今はchatGPT、一昔前にはその前身であるGPT3が流行っていました。 GPT3でも十分な性能を発揮していたようで、API叩くのも良いですがローカルで開発したい思いもあるため、GPT-J-6Bを使用して文書生成を試していきます。

日本語出力できたらいいですが、精度がいいなら英語を出力させて日本語に翻訳したものを最終的に取得するような形でも良いかと。

gpt-j-6b-gpu-dockerの下準備

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

ぱっと見つかるのはこのエラーです。

Docker refuses start

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は駄目だったが一応備忘録として残しとくか。

Related Post

> gpt-j-6b-gpu-dockerをWSL2に入れたUbuntu環境下で動作させ…【Windows11】
目指せ不労所得!令和の文豪AIが簡単に実装可能!Python✕transformersの可能性に痺れる。【GPT-2】
> gpt-j-6b-gpu-dockerをWSL2に入れたUbuntu環境下で動作させ…【Windows11】
pythonを起動しようとしたら、windows Store開くのをやめる方法【Windows 11】
> gpt-j-6b-gpu-dockerをWSL2に入れたUbuntu環境下で動作させ…【Windows11】
Programmable Search Engineを使ってみよう。
> gpt-j-6b-gpu-dockerをWSL2に入れたUbuntu環境下で動作させ…【Windows11】
EDK2を使ってメモリマップを取得してみよう
> gpt-j-6b-gpu-dockerをWSL2に入れたUbuntu環境下で動作させ…【Windows11】
EDK2を使ってブートローダを書いていこう
> gpt-j-6b-gpu-dockerをWSL2に入れたUbuntu環境下で動作させ…【Windows11】
C言語でUEFIアプリを書いてQUEMで実行してみよう

おすすめの商品

>