HarukaのNote

Linuxやプログラミング関係+旅行等の記録帳

研究室のGPUリソースをKubernetesを使って管理

kubernetesk8s)を使って,ラボのWorkStation環境を再構成したので備忘録として残します.

はじめに

私の所属するラボでは,以前からk8sGPUを管理していましたが,UbuntuのバージョンやCUDAバージョンが古くなって動作も不安定担ってきたことから,全て初期化して再設定しました.なんとか素人の私と後輩たちでも構成できたのでk8sに詳しい方なら余裕な内容となってしまうと思います.しかし,同様の記事が少なくて手こずったため紹介しようと思います.

構成

こちら(https://www.nttpc.co.jp/gpu/article/benchmark15.html)の記事に近い構成を目指します.
WS-Master

WS-Worker

  • 4台
  • ワーカーノード
  • クラスターに参加し,計算を担う
  • 各マシン,GPU x 2を搭載

WS-Masterの準備

事前に以下の準備をします.

  • Ubuntu 20.04 LTS をインストール

ポートの開放

使用するポートを事前に開放します.

$ sudo ufw enable
$ sudo ufw status
状態: アクティブ

以下のコマンドで開放するポートを設定.

$ sudo ufw allow 53
$ sudo ufw allow 6443
$ sudo ufw allow 2379:2380/tcp
$ sudo ufw allow 8285
$ sudo ufw allow 8472
$ sudo ufw allow 9153
$ sudo ufw allow 10250:10252/tcp
$ sudo reboot

確認.

sudo ufw status
状態: アクティブ
To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere                  
22/tcp                     ALLOW       Anywhere                  
53                         ALLOW       Anywhere                  
6443                       ALLOW       Anywhere                  
2379:2380/tcp              ALLOW       Anywhere                  
8285                       ALLOW       Anywhere                  
8472                       ALLOW       Anywhere                  
9153                       ALLOW       Anywhere                  
10250:10252/tcp            ALLOW       Anywhere                  
22 (v6)                    ALLOW       Anywhere (v6)             
22/tcp (v6)                ALLOW       Anywhere (v6)             
53 (v6)                    ALLOW       Anywhere (v6)             
6443 (v6)                  ALLOW       Anywhere (v6)             
2379:2380/tcp (v6)         ALLOW       Anywhere (v6)             
8285 (v6)                  ALLOW       Anywhere (v6)             
8472 (v6)                  ALLOW       Anywhere (v6)             
9153 (v6)                  ALLOW       Anywhere (v6)             
10250:10252/tcp (v6)       ALLOW       Anywhere (v6)             

Swap領域のオフ

swap領域が有るとk8sが動作しないので,オフにします.

$ sudo vim /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
# /swapfile                                 none            swap    sw              0       0

/swapもしくは/swapfileと表記のある行をコメントアウトします.

$ sudo reboot

Dockerの設定

Dockerのインストール

Dockerはk8sで動作するバージョンに指定があるため,公式を参考にインストールします.
CRIのインストール | Kubernetes

HTTPS越しのリポジトリの使用をaptに許可するために、パッケージをインストールします.

$ sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg2

Docker公式のGPG鍵を追加します.

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Dockerのaptレポジトリを追加します.

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Docker CEをインストールします.
Docker-ceがver.19代でなければ動作しなかったはずです.

$ sudo apt-get update && sudo apt-get install -y containerd.io=1.2.13-2 docker-ce=5:19.03.11~3-0~ubuntu-$(lsb_release -cs) docker-ce-cli=5:19.03.11~3-0~ubuntu-$(lsb_release -cs)
デーモンをセットアップ

以下を記載.

$ sudo vim /etc/docker/daemon.json
 {
   "exec-opts": ["native.cgroupdriver=systemd"],
   "log-driver": "json-file",
   "log-opts": {
     "max-size": "100m"
   },
   "storage-driver": "overlay2"
 }

service.dの作成.

$ sudo mkdir -p /etc/systemd/system/docker.service.d
dockerを再起動
$ sudo gpasswd -a $USER docker
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
$ sudo systemctl enable docker
情報を確認します.
$ docker version
Client: Docker Engine - Community
 Version:           19.03.11
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        42e35e61f3
 Built:             Mon Jun  1 09:12:34 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.11
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       42e35e61f3
  Built:            Mon Jun  1 09:11:07 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 nvidia:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

k8sのインストールと設定

kubeadm, kubectl, kubeletのインストール

こちら(Ubuntu 20.04LTSにkubernetes環境をkubeadmで構築する手順 | Snow System)のサイトを参考にインストールします.

$ sudo apt-get update && sudo apt-get install -y apt-transport-https
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
$ sudo apt update
$ sudo apt install -y kubeadm kubelet kubectl
クラスターを作成

kubernetesクラスタを初期化します.

$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

発行されたトークンをWorkerに共有します.
中断や失敗した場合,一時ファイルが残るのでリセットが必要です.

$ sudo kubeadm reset

一般ユーザへのkubectlコマンド開放をします.

$ sudo vim  /etc/profile
# 以下を追記
export KUBECONFIG=/etc/kubernetes/admin.conf
$ sudo chmod 644 /etc/kubernetes/admin.conf
flannelのインストール
$ sudo sysctl net.bridge.bridge-nf-call-iptables=1
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubernetes Device Pluginの有効化
$ sudo vim /etc/default/kubelet

/etc/default/kubelet

KUBELET_EXTRA_ARGS=--feature-gates=DevicePlugins=true
$ sudo systemctl daemon-reload
$ sudo systemctl restart kubelet
k8s-device-plugin

以下の公式ドキュメントを参考にインストールします.
GitHub - NVIDIA/k8s-device-plugin: NVIDIA device plugin for Kubernetes

$ kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.10.0/nvidia-device-plugin.yml


次に,ワーカーノードを設定します.

WS-Workerの準備

事前に以下の準備をします.

  • Ubuntu 20.04 LTS をインストール
  • nvidia driver 470のインストール
  • CUDA 11.4のインストール

ポートの開放

使用するポートを事前に開放します.

$ sudo ufw enable
$ sudo ufw status
状態: アクティブ

以下のコマンドで開放するポートを設定します.

$ sudo ufw allow 53
$ sudo ufw allow 8285
$ sudo ufw allow 8472
$ sudo ufw allow 9153
$ sudo ufw allow 10250
$ sudo ufw allow 30000:32767/tcp
$ sudo reboot

確認.

sudo ufw status
Status: active
To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere                  
10250                      ALLOW       Anywhere                  
53                         ALLOW       Anywhere                  
8285                       ALLOW       Anywhere                  
8472                       ALLOW       Anywhere                  
9153                       ALLOW       Anywhere                  
30000:32767/tcp            ALLOW       Anywhere                  
22 (v6)                    ALLOW       Anywhere (v6)             
10250 (v6)                 ALLOW       Anywhere (v6)             
53 (v6)                    ALLOW       Anywhere (v6)             
8285 (v6)                  ALLOW       Anywhere (v6)             
8472 (v6)                  ALLOW       Anywhere (v6)             
9153 (v6)                  ALLOW       Anywhere (v6)             
30000:32767/tcp (v6)       ALLOW       Anywhere (v6)

Swap領域のオフ

WS-Masterと同様の手順で.

Dockerの設定

WS-Masterと同様の手順で.

nvidia-docker2のインストール

DockerからGPUを使用するためのソフトウェアであるnvidia-docker2をインストールします.
これはk8s-device-pluginで使用されるため,k8s-device-pluginのインストラクションに従ってインストールします.
GitHub - NVIDIA/k8s-device-plugin: NVIDIA device plugin for Kubernetes

$ 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-docker2
$ sudo systemctl restart docker

/etc/docker/daemon.jsonに追記します.

$ sudo vim /etc/docker/daemon.json 

/etc/docker/daemon.json

 {
   "default-runtime": "nvidia",
   "runtimes": {
     "nvidia": {
       "path": "/usr/bin/nvidia-container-runtime",
       "runtimeArgs": []
     }
   },
   "exec-opts": ["native.cgroupdriver=systemd"],
   "log-driver": "json-file",
   "log-opts": {
     "max-size": "100m"
   },
   "storage-driver": "overlay2"
 }

dockerを再起動します.

$ sudo pkill -SIGHUP dockerd
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

情報を確認します.

 $ sudo nvidia-docker version
 NVIDIA Docker: 2.8.0
 Client: Docker Engine - Community
  Version:           19.03.11
  API version:       1.40
  Go version:        go1.13.10
  Git commit:        42e35e61f3
  Built:             Mon Jun  1 09:12:22 2020
  OS/Arch:           linux/amd64
  Experimental:      false
 
 Server: Docker Engine - Community
  Engine:
   Version:          19.03.11
   API version:      1.40 (minimum version 1.12)
   Go version:       go1.13.10
   Git commit:       42e35e61f3
   Built:            Mon Jun  1 09:10:54 2020
   OS/Arch:          linux/amd64
   Experimental:     false
  containerd:
   Version:          1.2.13
   GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
  nvidia:
   Version:          1.0.0-rc10
   GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
  docker-init:
   Version:          0.18.0
   GitCommit:        fec3683

dockerイメージからGPUが確認できるか確認します.
Docker Hubではnvidia/cudaのような暗黙のlatestタグがduplicatedになったため,nvidia/cuda:11.4.3-runtime-ubuntu20.04のように正しく指定する必要があります.

$ sudo docker run --rm nvidia/cuda:11.4.3-runtime-ubuntu20.04 nvidia-smi

k8sのインストールと設定

kubeadm, kubectl, kubeletのインストール

WS-Masterと同様の手順で.

クラスターに参加

WS-Masterで発行されたトークンを使用してクラスターに参加します.

$ sudo kubeadm join [IPアドレス]:6443 --token [Token] --discovery-token-ca-cert-hash [Token Hash]

エラーが起きてjoinできないときはresetをします.
途中でキャンセルした場合も一時ファイルが残るのでリセットが必要です.

$ sudo kubeadm reset

ここまでがWS-Workerでの作業となります.

Master側で確認

設定情報を確認します.

$ kubectl get nodes
    NAME             STATUS   ROLES                  AGE     VERSION
    workstation-01   Ready    compute                4d      v1.23.1
    workstation-02   Ready    compute                3d21h   v1.23.1
    workstation-03   Ready    compute                4d13h   v1.23.1
    workstation-04   Ready    compute                4d17h   v1.23.1
    ws-master        Ready    control-plane,master   4d17h   v1.23.1

workstation-01等のワーカーノードに設定したPCのホスト名が見えており,STATUSがReadyになっていると大丈夫です.





最後に,構成したクラスターの設定をWS-Masterでします.

WS-Master でクラスターの設定

node role, accelerator(GPUセレクタ)の設定

ワーカーノードに役割を付与します.
ワーカーノードのRoleをCompute(計算用)に設定

$ kubectl label nodes [worker hostname] node-role.kubernetes.io/compute=true

搭載GPUでノード選択可能に(GPU名をラベルとして設定).
gpu nameの例: nvidia-geforce-gtx1080ti, nvidia-tesla-v100

$ kubectl label nodes [worker hostname] accelerator=(gpu name)

# 例えば,
$ kubectl label nodes workstation-01 accelerator=nvidia-geforce-rtx2080ti
$ kubectl describe nodes    # role, acceleratorの確認(詳細)

Podの作成

ここは一般的なk8sの使い方に近くなるため,簡単に書きます.

WS-Masterに自身のユーザーを作成し,ログインします.

ネームスペースを作成します.

$ kubectl create ns haruka         # haruka 部分を適当なユーザー名に変更


test.yml を作成します.
test.yml

apiVersion: v1
kind: Pod
metadata:
  name: haruka-test-2080ti    # `kubectl get pod` で表示される名前
spec:
  containers:
  - name: haruka-pytorch-container    # 表示先が無い名前
    image: "nvidia/cuda:11.4.3-runtime-ubuntu20.04"   # 使用するdocker image
    resources:
      limits:
        nvidia.com/gpu: 1 # 使用するGPU枚数
    command: ["sh", "-c", "tail -f /dev/null",]  # Pod生成後,すぐ実行されるコマンド
    workingDir: /home/haruka   # Podの中に入ると最初にいる場所
  restartPolicy: OnFailure
  nodeSelector:                     # 使用するGPUの設定.記述がない場合は自動で割当られる
    accelerator: nvidia-geforce-rtx2080ti
    #accelerator: nvidia-titan-rtx
    #accelerator: nvidia-geforce-gtx1080

test.yml をapplyし,ポッドを作成します.

$ kubectl apply -n haruka -f test.yml


以下のコマンドでステータスが確認でき,RunningになるとPodの作成の成功を示します.ちなみに,PendingだとGPUリソースの空きを待っている状態です.

$ kubectl get pods -n haruka
NAME                 READY   STATUS    RESTARTS     AGE
haruka-test-2080ti   1/1     Running   1 (4d ago)   4d19h


以下のコマンドでPodに入ります.

$ kubectl exec -it -n haruka haruka-test-2080ti /bin/bash

root@haruka-test-2080ti:/home/haruka# 
root@haruka-test-2080ti:/home/haruka# nvidia-smi
Mon Jan 17 09:17:42 2022       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 495.29.05    Driver Version: 495.29.05    CUDA Version: 11.5     |
|-------------------------------+----------------------+----------------------+
| 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:86:00.0 Off |                  N/A |
| 27%   22C    P8    19W / 250W |      1MiB / 11019MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+


以下のコマンドでPodを削除します.

$ kubectl delete pod -n haruka haruka-test-2080ti
pod "haruka-test-2080ti" deleted

GPUリソースの空きを確認する便利コマンドを作成

kubectl describe nodesではリソースの空きが確認し辛いため,確認用のシェルスクリプトを作成します.

$ sudo mkdir /usr/local/command

以下のスクリプト/usr/local/command/に配置します.

$ sudo vim /usr/local/command/showgpus

/usr/local/command/showgpus

var1=($(kubectl describe nodes  |  tr -d '\000' | sed -n -e '/^Name/,/Roles/p' -e '/^Capacity/,/Allocatable/p' -e '/^Allocated resources/,/Events/p'  | grep -e Name  -e  nvidia.com  | perl -pe 's/\n//'  |  perl -pe 's/Name:/\n/g' | sed 's/nvidia.com\/gpu:\?//g'  | sed '1s/^/Node Available(GPUs)  Used(GPUs)/' | sed 's/$/ 0 0 0/'  | awk '{print $1, $2, $3}'  | column -t))
var2=($(kubectl describe nodes | grep -e accelerator= | sed -e "s/.*accelerator=//"))
var3=($(kubectl describe nodes | grep -e Hostname: | sed -e "s/.*Hostname:\s*//"))
printf "|%-15s|%-30s|%-9s|\n" "Node" "GPU" "Used"
for i in `seq 0 $((${#var2[@]}-1))`
do
printf "|%-15s|%-30s|%4d/%-4d|\n" ${var3[$i]} ${var2[$i]} ${var1[$((5+3*$i))]} ${var1[$((4+3*$i))]}
done

実行できるようにします.

$ sudo chmod 777 /usr/local/command/showgpus
$ sudo vim /etc/profile
#末尾に以下を追記
export PATH=$PATH:/usr/local/command

実行結果は以下のようになります.

$ showgpus
|Node           |GPU                           |Used     |
|workstation-01 |nvidia-rtx-a5000              |   0/2   |
|workstation-02 |nvidia-titan-rtx              |   0/2   |
|workstation-03 |nvidia-geforce-rtx2080ti      |   0/2   |
|workstation-04 |nvidia-geforce-rtx2080ti      |   1/4   | 

おわりに

お疲れさまでした.これで,複数人でGPUを利用する研究室で自動でGPUリソースが割り振られる環境が整いました.
準備に少し手間がかかりましたが,他人の学習を誤って止める危険がなくなりました.

素人には辛かったです...

Windows 11 と Manjaro をデュアルブートする際のメモ

環境

Widows側: 11(元は10だったのをアップデート)
Linux側: Manjaro

必要な手順

1. Manjaro のISOをダウンロード

2. Rufus でブートUSBの作成

3. BitLockerの回復キーを確認(https://aka.ms/recoverykey

以下の画面をスマホ等で撮影する

f:id:krulcifer-einfolk-fafnir:20211212195729p:plain
BitLocker回復キーの確認

4. UEFI設定から Secure boot を無効化

5. Manjaroをインストール(異なるドライブで実施)

6. Grubが起動するのでWindowsを選択

7. BitLockerの回復(ドライブがOSVの該当するデバイスのキーを入力)

8. Windowsの起動を確認・再起動

9. Manjaroの起動を確認

haruka0000.hatenablog.com

卒論・修論のために Ubuntu で upLaTex + VSCode をセットアップする

はじめに

UbuntuOpenSUSE Leap などの Linux で upLaTex の執筆環境を整えたいと思います。
upLaTexとは、platextex を ascii が開発した日本語用の tex です。upLaTex は Unicode に対応させた版です。
latexmk は本来複数のコマンドや bibtex のために uplatex を重ねがけするのをレシピとして実行できます。
.latexmkrc ファイルを各プロジェクトごとに配置することで、platex 等の指定があるときもコンパイル環境の切り替えが容易になります。

texlive のインストール

TeX Live - TeX Wikiの通りに、tar.gz からインストールします。
こちらのほうが、最新の Latex を使うことができます。
インストール時に指定するミラーはJaist等のミラーの方が早い印象でした。

$ wget http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz 

$ tar xvzf install-tl-unx.tar.gz

$ cd install-tl-2*

$ sudo ./install-tl -no-gui -repository http://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/tlnet/
...
Actions:
 <I> start installation to hard disk
 <H> help
 <Q> quit
Enter command: I


ABORTED INSTALLATION FOUND: installation.profile
Do you want to continue with the exact same settings as before (y/N): y

パスを追加します。

$ sudo /usr/local/texlive/????/bin/*/tlmgr path add

texlive をアップデートします。

$ sudo tlmgr update --self --all

Sampleの準備

以下のリポジトリはuplatexを使ったサンプルです。
zipをダウンロード、もしくは git clone します。

$ git clone https://github.com/haruka0000/upLaTex-Abstract-Sample.git
$ cd upLaTex-Abstract-Sample/

https://github.com/haruka0000/upLaTex-Abstract-Sample/archive/refs/heads/main.zip
github.com

.latexmkrc を準備

以下の内容で、.latexmkrcを準備します。
ダウンロードしたリポジトリに既に含まれていますが、ピリオドから始まる隠しファイルのため、有るか確認してみてください。
VSCodeであれば、隠しファイルも確認できると思います。
$latexplatex 等の他の latex に切り替えることで、コンパイラを変えることができます。

#!/usr/bin/env perl
$latex                       = 'uplatex -synctex=1 -halt-on-error -interaction=nonstopmode -file-line-error %O %S';
$latex_silent                = 'uplatex -synctex=1 -halt-on-error -interaction=nonstopmode -file-line-error %O %S';
$max_repeat                  = 6;

$bibtex                      = 'upbibtex';

$dvipdf                      = 'dvipdfmx %O -o %D %S';
$pdf_mode                    = 3;
$pvc_view_file_via_temporary = 0;

VSCodeの準備

VSCodeLaTexコンパイルの拡張を追加します。

拡張機能の追加

以下の拡張機能を追加します。

f:id:krulcifer-einfolk-fafnir:20211125220808p:plain
vscode extension

settings.jsonの編集

latexmk を使うための設定をvscodeの設定に追記します。

{
    "latex-workshop.chktex.enabled": true,
    // ビルドコマンド
    "latex-workshop.latex.tools": [
        {
            "name": "latexmk",
            "command": "latexmk",
            "args": [
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "-outdir=%OUTDIR%",
                "%DOC%"
            ],
            "env": {}
        }
    ],
    "latex-workshop.latex.clean.fileTypes": 
    [
        "*.aux", "*.bbl", "*.blg", "*.idx", "*.ind", "*.lof", "*.lot", "*.out", "*.toc", "*.acn", "*.acr", "*.alg", 
        "*.glg", "*.glo", "*.gls", "*.ist", "*.fls", "*.log", "*.fdb_latexmk", "*.synctex.gz", 
        "_minted*", "*.nav", "*.snm", "*.vrb", 
    ],
    // 以下のフォルダにPDF等を出力
    "latex-workshop.latex.outDir": "%DIR%/build",
    // Viewer関係
    "latex-workshop.view.pdf.viewer": "tab",
    "latex-workshop.view.pdf.zoom": "page-width",

    "latex-workshop.synctex.afterBuild.enabled": true,
}

実行

変更し、保存すると自動でコンパイルされると思います。
よく使うのは以下のコマンドです。

Ctrl + Alt + b コンパイル
Ctrl + Alt + v PDFをタブで開く

OpenSUSE 15.3 で NVIDIA Container Toolkit をインストール

私の普段使いはopenSUSEですので、openSUSENVIDIA Container Toolkitを使える方法を調べたので、メモとして残しておきます。

openSUSEももっと広がってくれればいいのですが…

openSUSE 15.1の手法をベースとしているので完全に動作するかはわかりませんが、私の環境ではうまくいきました。

Dockerの準備

$ sudo zypper ar https://download.opensuse.org/repositories/Virtualization:/containers/openSUSE_Leap_15.3/Virtualization:containers.repo

$ sudo zypper ref

#ここでdockerのバージョンを19.03以上を指定(openSUSE 15.1のdockerは古いらしい)
$ sudo zypper install --allow-vendor-change 'docker >= 19.03'

NVIDIA Container Toolkit をインストール

$ sudo zypper ar https://nvidia.github.io/nvidia-docker/opensuse-leap15.1/nvidia-docker.repo

$ sudo zypper ref

$ sudo zypper install -y nvidia-container-toolkit

$ sudo systemctl restart docker

動作の確認

$ sudo docker run --gpus all nvidia/cuda:10.0-base nvidia-smi

# 以下のように表示されればOK
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.57.02    Driver Version: 470.57.02    CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| 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 ...  Off  | 00000000:01:00.0  On |                  N/A |
| 35%   45C    P0    44W / 260W |    732MiB / 11016MiB |      2%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

以下のサイトを参考にさせていただきました。
www.programmersought.com

Windows10の機能のみでHEIF画像をJPGに変換する方法

はじめに

HEIF(HEIC)とは

iOSで用いられている高圧縮な画像フォーマットです.
Windowsではそのまま見ることが難しくなっています.

そのHIEC画像をMicrosoftが提供する機能のみ(他社のソフト無し)で変換する方法を紹介します.

HEIF 画像拡張機能のインストール

はじめに,これだけはインストールします.
以下のリンクを開き,入手をクリックしてください.
www.microsoft.com

f:id:krulcifer-einfolk-fafnir:20210708175030j:plain
ポップアップ

ストアを開き,インストールを押すと,機能が追加されます.

f:id:krulcifer-einfolk-fafnir:20210708175001p:plain
ストア

起動になるとインストール完了です.

Microsoft公式のWindows拡張機能のため,もしかしたらすでにインストールされているかもしれません.

HEICをJPGに変換

この時点で,以下のように画像が見える様になっていると思います.
この画像は友人の犬です.私はiOSユーザではないので,画像を借りました.

f:id:krulcifer-einfolk-fafnir:20210708174332p:plain
HEIC

画像を開く

Windowsの画像ビューワーで写真を開きます.
特に変更してなければ,ダブルクリックで開けます.

そして,上のペンマークから編集を選択します.

f:id:krulcifer-einfolk-fafnir:20210708175938p:plain
画像を開く

編集モードに入るので,ここで,コピーを保存を押します.

f:id:krulcifer-einfolk-fafnir:20210708180053p:plain
編集ページ

既定でJPGになっているので,JPG形式でそのまま保存します.

f:id:krulcifer-einfolk-fafnir:20210708180213p:plain
保存

JPGに保存することができました.

f:id:krulcifer-einfolk-fafnir:20210708180303p:plain
結果

最後に

他社ソフトを使わないHEIFの変換方法を紹介しました.
このためだけに海外のソフトやフリーソフトをインストールするのは,手間であり,セキュリティ的にも避けたいと思っている方の参考になれば幸いです.

OpenSUSE で chrome-remote-desktop host を自動起動

OpenSUSE Tumbleweed で Chrome-remote-desktopを動かすことができたので、方法を残しておきます。

Google Chrome のインストール

事前にChromeブラウザをインストールします。

#リポジトリ追加
$ wget https://dl.google.com/linux/linux_signing_key.pub

$ sudo rpm --import linux_signing_key.pub

$ sudo zypper ar http://dl.google.com/linux/chrome/rpm/stable/x86_64 Google-Chrome

#リポジトリ更新
$ sudo zypper ref

$ sudo zypper in google-chrome-stable

Alienrpm を作成

Alienは .deb を .rpm に変換してくれるソフトです。
今後、公式が rpm で配布してくれるといいのですが…
https://remotedesktop.google.com/access/にアクセスし、.Deb インストーラーをダウンロードします。

Alien のインストール

# リポジトリ追加(Tumbleweed の場合)
$ sudo zypper addrepo https://download.opensuse.org/repositories/system:packagemanager/openSUSE_Tumbleweed/system:packagemanager.repo

# リポジトリ追加(Leap 15.3 の場合)
$ sudo zypper addrepo https://download.opensuse.org/repositories/system:packagemanager/openSUSE_Leap_15.3/system:packagemanager.repo


#リポジトリ更新
$ sudo zypper ref

# 必要ソフトとAlienのインストール
$ sudo zypper in python-devel python-xml python2-pip python-psutil xdpyinfo alien

$ pip2 install --user psutil

rpm のビルド

sudo alien -r --scripts chrome-remote-desktop_current_amd64.deb

rpm インストール

$ sudo zypper in ./chrome-remote-desktop-89.0.4389.45-2.x86_64.rpm 
$ sudo chmod +s /opt/google/chrome-remote-desktop/user-session

セットアップ

pam 権限を変更します。
元あったコードはコメントアウトします。

sudo vim /etc/pam.d/chrome-remote-desktop 
/etc/pam.d/chrome-remote-desktop
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

#@include common-auth
#@include common-account
#@include common-password
#session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close
#session required pam_limits.so
#@include common-session
#session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
#session required pam_env.so readenv=1
#session required pam_env.so readenv=1 user_readenv=1 envfile=/etc/default/locale

# 以下を追加
auth required pam_permit.so
account required pam_permit.so
password required pam_permit.so
session required pam_permit.so
session optional pam_umask.so

Groupに追加

$ sudo groupadd chrome-remote-desktop

$ sudo usermod -aG chrome-remote-desktop [USER]

Native-messaging-hosts ディレクトリへのシンボリックリンク作成

$ sudo ln -s /etc/opt/chrome/native-messaging-hosts/ /etc/chromium/

sessionの設定をします。ここではリモート環境下で利用するデスクトップ環境を決めます。

$ vim ~/.chrome-remote-desktop-session
# You will have to uncomment one of the following lines for CRD to work
# Remove the # and select ctrl-X to finish.
# 
export $(dbus-launch)
# デスクトップはcinnamonを選択
# exec startxfce4
# exec cinnamon-session-cinnamon
exec cinnamon-session-cinnamon2d

事前にデスクトップ環境を入れてなければ、インストールが必要です。

$ sudo zypper in cinnamon (もしくは xfce4)

画面解像度を指定します。

$ mkdir ~/.config/chrome-remote-desktop
$ vim ~/.config/chrome-remote-desktop/Size
~/.config/chrome-remote-desktop/Size
1920x1080

自動起動daemon)の設定

$ systemctl --user enable chrome-remote-desktop
$ systemctl --user start chrome-remote-desktop

ブラウザから起動

https://remotedesktop.google.com/access/にアクセスし、セットアップします。
次回からopenSUSEを再起動すると自動で起動されると思います。

最後に

Linux OSではOpenSUSEが好きなのですが、これまではChrome-remote-desktopが使えず、研究室での作業PCにはManjaroを使っていました。しかし、この度ManjaroでCRDがなぜか起動できなくなって、これを機にOpenSUSEでの方法を調べて見ました。
なんとかうまくいってよかったです。最近の情報が少なかったので、OpenSUSEが好きな人の参考になれば幸いです。

ソアラ(SC430)の専用シートカバーがアメリカから到着!

はじめに

私が今乗っているトヨタ ソアラは2001年製で古いです。そして、シート形状も独特なため、日本ではフィットするシートカバーがありません。

そこで、海外のWEBサイトから探してみました。

購入サイト

購入したのは以下のサイトです。
www.seatcoversunlimited.com

複数の素材とカラーから選ぶことができます。
今回は、ソアラの海外での販売ブランドに合わせて、車種をLEXUS SC、年代を2002年に設定しました。

f:id:krulcifer-einfolk-fafnir:20210411153508p:plain
seat covers unlimited

シート素材

いくつかの素材の説明を訳してみました。概要は www.DeepL.com/Translator(無料版)で翻訳し、修正しました。今回、私はベロア調の Vel-Quilt のネイビーを選択しました。

Neo-Sport(ネオプレン)

ネオプレン製シートカバーはネオスポーツと呼ばれていますが、これはスポーツマンの最良の友であり、水やこぼれが内装に浸透して車の再販価値に悪影響を及ぼすのを防ぐためです。これらのカバーは実際にはNeo-Supremeと呼ばれ、多くの場合、ネオプレンの上にカットされているので、ほとんどのネオプレンのように太陽の下でフェードしません。SUVのシートカバーとして最適です。

Leatherette(合皮)

多くの車のオーナーは、本革シートの外観を愛していますが、その高いコストに制限されています。これらのカバーは本革に比べて数分の一のコストで、同じ外観と感触を持っています。レザーレットは車のインテリアをスタイリッシュにし、高額なコストをかけずに本革シートのような高級感を提供します。当社の素材は高品質のビニールで製造されており、何年も使用できるように作られています。また、汚れや水に強く、破れにくいのも特徴です。

Dorchester

ドーチェスターの生地は摩耗性に優れています。トラックのに最適で、ヘビーデューティーな業務用として最も人気のある生地です。この生地は厚手で、背面に追加されたフォームにより、ほとんど壊れません。トラックやバン、タクシーなどのハードな使用でも、この生地を擦り切れません。汚れてしまうかもしれませんが、それだけです。汚れても、それだけです。私たちの椅子張りスタイルの生地はすべて、スプレー式のファブリッククリーナーやカーペットクリーナーで掃除でき、その後は掃除機で吸い取るだけです。多くのフォード、シボレー、ダッジのフリートは、このシートカバーによる保護の恩恵を受けています。厚手の生地を使用しているため、Scottsdaleのようなカバーと比べてシートにフィットしない場合がありますのでご了承ください。

Scottsdale

スコッツデールのシートカバーは、当社が最初に製造した椅子張りスタイルのカバーのひとつです。この生地は最も丈夫な生地で、市場を変えたいと思ったからです。そして、その生地にフォーム生地の裏地を貼り付けて縫い合わせ、シートに装着しました。私たちは、また新しいカーシートカバーのトレンドを始めました。私たちは常に最先端を走っているように見えますが、さらにこのカバーは少なくとも8年は持ちました。もともとスコッツデールは、シボレー・トラックのオリジナル内装材として製造された生地で、その名前はシボレー・スコッツデール・ピックアップに由来しています。残念ながら、シボレー、フォード、ダッジなどのメーカーでは、このような丈夫な生地はもう使われていませんが、ご心配なく!どんな車やトラック、SUVのシートカバーとしても、素晴らしい仕上がりになります。何年経ってもベストセラーの一つです。スコッツデールのシートカバーの生地は、耐久性のあるナイロン・ポリエステル・ポリプロピレンの混合素材で、裏地にはフォーム生地を使用しており、取り付け後の外観を向上させています。スコッツデールのシートカバーはトラックのシートカバーとしても最適で、現在市販されている他のどの生地よりも耐久性に優れています。

Vel-Quilt

Vel-Quiltは、他の生地に見られるような内部の模様やデザインがなく、シンプルな色であるため、シートカバーに最適です。無地を好む人や、自動車の内装に柄のないシートカバーが必要な人もいるでしょう。ベルキルトはそのための生地です。この生地は10色あり、最新の車に似合うだけでなく、多くの古い車やトラック、クラシックモデルのインテリアにもマッチします。古いモデルの内装には、グリーンやレッド、ブルーなどが使われていることが多いのですが、現在のモデルはグレーやタンになっています。ヴェルキルトなら、どんなインテリアカラーにも対応できそうです。年式、メーカー、モデルを入力して、その可能性をチェックしてみてください。

Sheepskin(シープスキン)

シープスキンがシートカバーの中のキャデラック(最上級)と呼ばれるのには、理由があります。

  1. 想像以上に快適な乗り心地です。運転席にいても助手席にいても、まるで宙に浮いているかのようです。
  2. シープスキンシートカバーは、背中やお尻に空気を循環させることができます。
  3. キャデラックのシートカバー、メルセデスのシートカバー、BMWのシートカバーなどに最適です。どんな車にも似合いますので、ご安心ください。
  4. この1インチのシープスキンペレットは、どんなインテリアにも合うように12色から選べます。

購入方法に関して

PayPalを使うのが最も簡単です。
サイトからオーダーに進みます。
執筆時はフロントとリア込みで$384.80です。今はヘッドレストとアームレスト込みのセットがあるんですね…
欲しかったです。

f:id:krulcifer-einfolk-fafnir:20210411160952p:plain
オーダー

購入に進みます。CHECKOUTを押して、PayPalを選択します。
住所や連絡先も記載します。
ただこの時点で送料は含まれていません。

f:id:krulcifer-einfolk-fafnir:20210411161932p:plain
購入画面

最後に請求書がもらえるので保存しておきます。

送料に関して

海外発送に関しては言及のないショップなので、メールで問い合わせをします。
以下の内容を送信しました。
order numberには、先ほどの請求書から控えた番号を記載します。
これで、先方がある程度送料を見積もってくれます。

To: Seat Cover Info <info@seatcoversunlimited.com>
Title: Additional information regarding your product

Dear Sir or Madam,

My name is [名前] and I am writing you from Japan.
I have a question regarding your online shop.
I visited your webpage (https://www.seatcoversunlimited.com/) and I am interested in purchasing the custom seat cover for [車種(英名)].
Is it possible to purchase it from Japan?

order number: XXXXXXX
Customer Name: [名前]
Phone: [電話番号]
Email: [メールアドレス]

I look forward to hearing from you soon.
Yours sincerely,

[名前]

以下のように「問題ないです!更新された請求書です。送料は$74.95、PayPalでの支払いでいいでしょうか。」と返信が来ました。送料込みの請求書PDFが添付されているので、確認します。

Yes absolutely! Here is your updated order. The shipping fee came out to $74.95, can we request payment through PayPal on that?

Thank you!

以下のように返信します。「確認しました。PayPalでいいのでどうやって払うか教えてください。」

Thank you very much. I checked.
I accept the order and I can pay through PayPal. Please tell me how to pay an additional fee through that.

「財務部に連絡しました。財務部が支払いメールを送ります。受け取り次第、支払いを証明する書類を提出してください。」

I have reached out to our financial department to send a request for payment. Please provide proof of payment once you receive it. 

以下のようにメールでPayPalの支払いリクエストが届きます。

f:id:krulcifer-einfolk-fafnir:20210411164918p:plain
PayPalメール
合計金額

本体 42197.17 円
送料 8219.02 円
合計 50416.19 円
と約 5 万円でした。専用設計のシートカバーとしては結構安いと思います。
フロントだけならもっと安くなると思います。

シートカバーを取り付け

1月の中旬に注文して、3月末には届きました。
取り付けには詳細なマニュアルがついているので問題ありませんでした。

外観

意外と軽い素材ですが表面の質感は、一般的な純正のベロア生地の質感と遜色なく、安っぽくありませんでした。
また、最初は少し表面が浮いていたものの、座っているうちに馴染み、今はフィットしています。

色は、どうしてもこの青色がサイトで綺麗に見えて選んだのですが、周りの人から見るとミスマッチかもしれません。私は満足しています。やはり、ヘッドレストは欲しかったと感じます。
f:id:krulcifer-einfolk-fafnir:20210411151842j:plain

背面はシートを外さないと取り付けが難しいので、隙間に挟み込むようにして取り付けました。結構固く挟まったので大丈夫かと…
シートを倒すレバーように切り込みも入っています。
f:id:krulcifer-einfolk-fafnir:20210411160034j:plain
f:id:krulcifer-einfolk-fafnir:20210411160352j:plain

最後に

今回購入した商品は個人的には大変満足のいくものでした。
アメリカには、こういった個人向けのカスタムサービスがたくさんあるのは、最新版向けの商品在庫しか対応していない日本と比べて、うらやましく感じました。
そして、値段もそれほど高くない。

大きいものなので、送料も妥当な範囲だと思います。

中古車なので、本革シートがどうしても傷んでいて、気になっていたのが改善できてよかったです。

今回、個人的にすごく満足し、感動したので、ブログに載せる形で紹介させていただきました。