Ubuntu 22.04 LTSを本当にデスクトップとして使う〜NVIDIA GPU設定【2022年5月版】

Ubuntu、デスクトップとしても使ってます。本当に💦

Ubuntu 22.04 LTS デスクトップ版を自宅PCクラスタで使う話を連載しています。Linux使いの方でも「でも、端末はWindowsだよね?」「IT業界でスタバでドヤるならMBP(MacBookPro)だよね?」とお考えの方は多いです。本気でLinuxを普段使い出来ると思っている日本人は、未だに意外と少ないのが実態です。

MBPドヤリングはともかくとして、Excelのフル機能が使えない等の理由でWindowsを手放せないのは事実です。しかしGoogle Chromeの肥大化進化でオフィス機能のほとんどがGoogleスプレッドシートなどのWebアプリで賄えるようになった今では、本当にWindowsでなければ困る局面は非常に少ないと感じています。

私は無職になって久しい今でも気持ちだけはWeb担の端くれなので、基礎的なリテラシー維持の為にWindowsのほかMacBookPro、Chromebook、iPhone、iPad、Androidスマホ/タブレットなど一般的に使われているOSの端末は全て個人所有しています。その上で申し上げると、「モバイル用途のPCはUbuntu Linuxでほとんど困らない」との認識です。

Windows11ではインテルCore i 第7世代以前のCPUはサポート外となりました(7820HQなど例外あり)。結果、以前の中古PCやリース落ちPCが値崩れし、とてもお買い得になっています。一昨年は5万円を滅多に切らなかったフルHD&SSDノートも今では5万円を切るものがチラホラ出てきました。端末として割り切るなら個人的なイチオシは『ELITEBOOK Folio G1』です。このようなお古のノートにUbuntuを入れて再生させるわけです。

お古の👍ノートをUbuntuで再生。SSD&フルHDなら今でも快適👍

さらにディープラーニングなどの機械学習フレームワークLinuxベースで作られたものが多く、特に「CLIに慣れた方はWindowsよりLinuxの方が便利」ということも実は多いのです。

Ubuntuでディープラーニング。鬼門はGPUドライバ

とは言え、UbuntuがWindowsに及ばない点はあります。それがドライバーのインストール。周辺機器ベンダーがWindows第一でドライバーを開発しているので、Linuxでの対応は遅れがちです。特にGPUのドライバコケると画面表示出来なくなるので、LinuxでGPUを使い倒したい人の最初の鬼門となります。

そこで今回はお手軽GPUであるNVIDIA GeForce GTX 1650を搭載したゲーミングノートPC『ASUS TUF Gaming A15 FA506IH FA506IH-R5G1650AS』(AMD Ryzen5 4600H/8GB⇒32GB・SSD 512GB⇒512GB+2TB/1,920×1,080ドット (フルHD) (144Hz)/15.6インチ/フォートレス・グレイ)にUbuntu 22.04 LTSを入れた上でGPUドライバのインストールに挑戦しました。

GeForce GTX 1650搭載のゲーミングノートPC。ゲームには物足りないがディープラーニングのサンプルコードを動かす程度なら十分なGPU性能

UbuntuがGPUの存在を認識しているかどうかを確認

$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:08.1/0000:05:00.3/usb1/1-2/1-2:1.0 ==
modalias : usb:v0BDAp8812d0000dc00dsc00dp00icFFiscFFipFFin00
vendor   : Realtek Semiconductor Corp.
model    : RTL8812AU 802.11a/b/g/n/ac 2T2R DB WLAN Adapter
driver   : rtl8812au-dkms - distro free

== /sys/devices/pci0000:00/0000:00:01.1/0000:01:00.0 ==
modalias : pci:v000010DEd00001F99sv00001043sd000018BFbc03sc00i00
vendor   : NVIDIA Corporation
model    : TU117M
driver   : nvidia-driver-450-server - distro non-free
driver   : nvidia-driver-510 - distro non-free recommended
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-470 - distro non-free
driver   : nvidia-driver-510-server - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

上記のコマンドで表示された「vendor : NVIDIA Corporation model : TU117M」がGTX 1650です。ドライバは「driver : nvidia-driver-510 – distro non-free recommended」とオススメ表示が出ているので、これを入れてみます。

$ sudo apt install nvidia-driver-510
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了        
状態情報を読み取っています... 完了        
以下の追加パッケージがインストールされます:
……

インストールは10分ほどで終わるので、再起動します。

$ nvidia-smi
Thu May 12 18:47:13 2022       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.60.02    Driver Version: 510.60.02    CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| 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 Off |                  N/A |
| N/A   45C    P8     6W /  N/A |      8MiB /  4096MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1750      G   /usr/lib/xorg/Xorg                  4MiB |
+-----------------------------------------------------------------------------+

「Driver Version: 510.60.02 CUDA Version: 11.6」と表示されており、ディープラーニングで使うCUDAも無事入っていることが確認出来ました。

TensorflowでGPUの動作確認

とは言え、実際にGPUを使ってみないと正しく動いているのか分かりません。というわけで、機械学習系のフレームワークであるAnacondaをインストールして使ってみます。

$bash ./Anaconda3-2022.05-Linux-x86_64.sh
$conda update -n base conda
$conda update anaconda
$conda update -y --all
$conda install tensorflow-gpu==2.4.1

動作確認用のコードを実行してみます。

$ python
Python 3.9.12 (main, Apr  5 2022, 06:56:58) 
[GCC 7.5.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from tensorflow.python.client import device_lib
2022-05-12 18:53:47.784386: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.10.1
>>> device_lib.list_local_devices()
2022-05-12 18:53:51.799093: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  SSE4.1 SSE4.2 AVX AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-05-12 18:53:51.802081: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcuda.so.1
2022-05-12 18:53:51.831519: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:941] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2022-05-12 18:53:51.832063: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1720] Found device 0 with properties: 
pciBusID: 0000:01:00.0 name: NVIDIA GeForce GTX 1650 computeCapability: 7.5
coreClock: 1.515GHz coreCount: 14 deviceMemorySize: 3.82GiB deviceMemoryBandwidth: 178.84GiB/s
2022-05-12 18:53:51.832111: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.10.1
2022-05-12 18:53:51.849984: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcublas.so.10
2022-05-12 18:53:51.850051: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcublasLt.so.10
2022-05-12 18:53:51.860952: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcufft.so.10
2022-05-12 18:53:51.864006: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcurand.so.10
2022-05-12 18:53:51.882123: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcusolver.so.10
2022-05-12 18:53:51.885419: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcusparse.so.10
2022-05-12 18:53:51.918256: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudnn.so.7
2022-05-12 18:53:51.918459: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:941] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2022-05-12 18:53:51.918860: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:941] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2022-05-12 18:53:51.919152: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1862] Adding visible gpu devices: 0
2022-05-12 18:53:51.919358: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.10.1
2022-05-12 18:53:52.570930: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1261] Device interconnect StreamExecutor with strength 1 edge matrix:
2022-05-12 18:53:52.570970: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1267]      0 
2022-05-12 18:53:52.570977: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1280] 0:   N 
2022-05-12 18:53:52.571411: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:941] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2022-05-12 18:53:52.571620: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:941] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2022-05-12 18:53:52.571762: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:941] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2022-05-12 18:53:52.571880: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1406] Created TensorFlow device (/device:GPU:0 with 3410 MB memory) -> physical GPU (device: 0, name: NVIDIA GeForce GTX 1650, pci bus id: 0000:01:00.0, compute capability: 7.5)
2022-05-12 18:53:52.573073: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 14858614513891176676
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 3575906304
locality {
  bus_id: 1
  links {
  }
}
incarnation: 13770775266605951589
physical_device_desc: "device: 0, name: NVIDIA GeForce GTX 1650, pci bus id: 0000:01:00.0, compute capability: 7.5"
]

無事「pciBusID: 0000:01:00.0 name: NVIDIA GeForce GTX 1650 computeCapability: 7.5
coreClock: 1.515GHz coreCount: 14 deviceMemorySize: 3.82GiB deviceMemoryBandwidth: 178.84GiB/s」と表示されており、tensorflowからGPUが認識出来ていることが分かりました。

ついでにPytorchも

最近社名が変わったり株価がごにょごにょしたり何かとお騒がせなMeta Platforms社(旧称Facebook)のPyTorchも、ついでに入れてみます。

公式サイトに行くとコマンドを教えてくれるので、そのとおりに入力します。

さいきん流行りのWebでポチポチするとコマンドが出るやつ
$conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch

condaのインストールは依存関係の処理で時間がかかりますが、10分くらいで完了すると思います。

ディープラーニング超入門的な記事は食傷気味なので、Jupyter Notebookなどを使ったディープラーニングのお試しは後日、気が向いたら挑戦しようと思います。

Ubuntu 22.04 LTSのgnome-remote-desktopが自宅PCクラスタの救世主でない理由【2022年5月版】

Ubuntu 22.04 LTSから標準でリモートデスクトップ対応。しかし……

Ubuntu Linuxは、従来Windowsと異なり標準ではリモートデスクトップ(RDP)の機能がありませんでした。とは言え、Linuxでは必要なものだけ後から入れるのが当たり前なので、必要な人は自力でxrdpなどのRDPアプリを入れて普通にWindowsや他のLinux端末からRDPしていました。

私も自宅クラスタのUbuntuには全てxrdpを入れています。自宅クラスタは省スペースの弁当箱PCを並べており、少しでもコンパクトにまとめるため普段はキーボードやマウス、モニタを外しています。必要な時だけUSB稼働のモバイルモニター(HDMI/DisplayPort両対応)やタッチパッド一体型USBキーボードを繋いで保守作業を行っています。

自宅クラスタでは必要な時だけタッチパッド一体型USBキーボードをつなぐ

リモート管理は、硬派なセキュリティ重視型エンジニア様は大抵「sshでやれ」とおっしゃいます。しかし、Linux用のサーバーソフトの多くがWebブラウザ管理でかつ初期設定ではローカルでしかアクセス出来ないこともあり、sshだけで済ませるのは面倒臭いです。ストイックな方を否定する気はありませんが、少なくとも私の自宅クラスタはRDPで管理したいです。

こんなRDP大好きユーザーの救世主になる!と思われたのがUbuntu 22.04 LTSから標準搭載された『gnome-remote-desktop』です。しかし結論から言えば、これは自宅クラスタのリモート管理には使い物にならないゴミソフトです。

ダメな理由① Windowsからつながらない

Ubuntu 22.04のインストール後、真っ先に設定画面を開きremote desktopとremote controlをONに変更しました。そしてWindowsからRDPしてみると

Windowsからgnome-remote-desktopにつながらない

なんということでしょう😱同じUbuntuのRemminaからはつながるのに……。

RDPはそもそもWindows発祥のプロトコルです。にも拘わらずWindowsから繋がらないと知った瞬間「こいつ、やる気ねえな」と悟りました。

ダメな理由② ログアウトするとつながらない

さらになんと、gnome-remote-desktopは「端末にユーザーがログインしている間しかつながらない」という超絶糞仕様になっているではありませんか。ログアウトしなくても、端末からモニターケーブルを引き抜いた瞬間に切断される仕様です。

そもそも、gnome-remote-desktopは「Windows Homeを使っているような超一般人が操作で困った時に情シスが遠隔でサポートする」ような目的で作られていたのでした。Ubuntu Desktopは確かにデスクトップOSですが、わざわざセキュリティのためにログアウト状態での接続を不可にしなくても良いではないですか。これにはさすがに開発者の明確なsshも使いこなせないのにリモート管理すんなという悪意を読み取らざるを得ません。

【結論】本当の救世主はやはりxrdpだった

途方に暮れてウェブを検索しまくったところ、素晴らしいページを発見しました。

xrdp-installer-1.4.sh

xRDP – Easy install xRDP on Ubuntu 18.04,20.04,21.10,22.04 (Script Version 1.4)

The script xrdp-installer-1.4.sh can be run against all supported Ubuntu Operating System. Version 1.4 has been updated and it will detect Ubuntu 22.04 as a supported Operating system. The script has been mainly tested against Ubuntu Gnome desktop. However, the script tries to detect the Desktop interface in use and might be able to work against some other desktop interface such as Budgie, Plasma, Linux Mint, Gnome…(Best effort !)

Griffon’s IT Library

ネ申だ……😭

何が素晴らしいかというと「Ubuntu 22.04 LTSに糞なgnome-remote-desktopが標準搭載されてもxrdpへのニーズが無くならないことを百も承知で、リリース直後に速攻で対応した」という点に尽きます。

こういう素晴らしい野良ハッカーのおかげで、ぼくらは今年も快適なUbuntuライフを手軽に堪能出来そうです。めでたしめでたし🙌

Ubuntu 22.04 LTSで自宅PCクラスタを構築する【ハードウェア&初期インストール編】

まずはバラすところから

 クラウド全盛のご時世ですが、当記事では「弁当箱PCをバラす」シーンからスタートです👍

クラウドの仮想マシンはCPUやメモリ、SSDなど多彩な構成からサクッと選べて便利です。でも、クラウドからITに入った世代はCPUやメモリ、SSDが具体的にどういうモノか知らない方も多いのではないでしょうか。どうせなら、知っておいた方がいいですよね🤗

というわけで、バラしてみます。

Lenovo ThinkCentre M75q Gen2の上フタを開いたところ

PCのフタを開けるには基本的にプラスドライバーがあれば十分ですが、ドライバーのサイズがネジと合わないと力を込めても回らずネジ山を潰してしまうという恐ろしい罠があるので、精密ドライバーセットを一式、揃えておきましょう。

Lenovo ThinkCentre M75q Gen2は、HDD無しモデルを選んでも2.5インチマウンターが付属するようです。保守部品は入手に手間がかかることも多いので、この配慮はありがたいですね。というわけで早速マウンターを外します。

Lenovo ThinkCentre M75q Gen2の2.5インチマウンターを外したところ

機械が苦手な方は既にこの写真に恐怖を覚えるかも知れませんが、周辺機器の増設はレゴブロックレベルの難易度です。2.5インチマウンタではSATAケーブルがマザーボード上のコネクタから外れることがあると思いますが、ただの嵌め込み式なので落ち着いてはめ直しましょう。大丈夫です、たぶん。

2TBの2.5インチSSDをデータドライブとして増設!

今回はLenovo ThinkCentre M75q Gen2の2.5インチマウンターに、HDD(ハードディスク)ではなく2TBの2.5インチSSDを増設します。

Lenovo ThinkCentre M75q Gen2の2.5インチ SSDを装着したところ

HDDは内部でディスクが物理的に回転しているので、一般的にSSDより故障のリスクが高いと言えます。純粋なファイル保管用で一日数回しかアクセスしないような用途なら安価なHDDは今でも選択肢となり得ますが、自宅クラスタのサーバー用途では極力SSDを選びましょう

SSDはM.2 2280というガムをひと回り大きくしたサイズの規格が主流となりつつありますが、弁当箱PCではM.2 2280のスロットがひとつしかないことが多く、2台目のデータドライブは2.5インチにするのが現実的です。2.5インチ SATAはSSDとしては無駄にデカいですが、値段的にも少しお安めなので、悪い話ではありません。

なお、2.5インチはSATA3という規格で転送速度は最大6Gbpsです。M.2はSATA3とNVMeの2つの規格がありますが、主流のNVMe最大20Gbpsと高速化しています。とは言え、NVMeでも実効速度に大きな違いはなく、発熱が激しいのが現状のようです。要は「HDDではなくSSDであることが大事で、性能は大差ない」そうです。

SSDを選ぶ際にもうひとつ重要なのは「予算が許す限り大容量のものにする」ことです。というのも、SSDなどの不揮発性メモリは書き込み回数に限界があり、残り容量が少なくなると同じ領域に繰り返し書き込むため劣化しやすいと言われているからです。そういう意味でも、2022年現在では2TBの2.5インチ SATA SSDはコスパ的に悪くない選択肢と言えます。なお、今回は『SanDisk SDSSDH3 2T00』を選びました。

メモリとM.2 NVMe SSDの交換・増設

続いて、Lenovo ThinkCentre M75q Gen2の裏蓋を開きます。

Lenovo ThinkCentre M75q Gen2の裏蓋を開く

この機種のマザーボードはスロットが両面実装になっており、メモリとM.2 SSDは裏側です。まず、裏蓋をスライドしてマザーボードを露出します。

Lenovo ThinkCentre M75q Gen2の裏蓋を開くと、メモリとM.2 SSDのスロットがある

Lenovo ThinkCentre M75q Gen2の裏蓋を開くと、メモリとM.2 SSDのスロットがあります。交換を前提に最小構成で注文したので、メモリ8GB、SSD256GBとなっています。メモリは64GB、M.2 SSDはNVMe 1TBに交換しました。

メモリは64GB、M.2 SSDはNVMe 1GBに交換する

SSDを2台構成にしているのは、システムドライブ(M.2 NVMe)とデータドライブ(2.5インチSATA)を分けるためです。あとあと設定が面倒にはなりますが、大容量データを扱うためには乗り越えたい壁です。クラスタ構成が前提であれば、1台構成でも良い気がしますが……💦

なお、今回はメモリは『Transcend JM3200HSE-32G』2枚、SSDは『Western Digital WD Blue SN570 1TB』を選びました。

周辺機器を認識したかどうかBIOSでチェック

周辺機器の増設が終わったので、ふたを閉じて弁当箱PCを起動します。OSを入れる前に、まずBIOSで周辺機器を認識したかどうかをチェックします。

USBメモリを優先起動する設定にするついでに、SSDを認識したかどうかチェック

BIOS画面の『USB HDD』がUSBメモリ、『M.2 Drive 1』がM.2 SSD(WD Blue SN570 1TB)、『SATA 1』が2.5インチ SSD(SanDisk SDSSDH3 2T00)です。どちらも正しく認識しました🙌

メモリも65536MBとなり、無事3200MHzでの動作を確認

システム概要の画面で、メモリを64GB認識して3200MHzで動いていることも確認します。これで安心🙌

SSDやメモリは未だに相性問題があり、たまにではありますが交換しても動かないことはあります。PCメーカーか周辺機器メーカーの動作確認リストに載っているのが理想ですが、コスパ的になかなかそうもいきません。先人の交換履歴をウェブ検索で確認して、動いているパーツを選ぶのが次善策です。安くて動作が安定したパーツはよく使われているので、地道に検索すれば自分の目的に合ったものが見つかると思います。

Ubuntu 22.04 LTSをUSBメモリでインストールする

手ごろなUSBメモリを購入し、Ubuntu 22.04 LTSISOイメージをダウンロードして格納します。BitTorrentでもダウンロード出来るので、TransmissionなどのBitTorrentクライアントをお使いの方にはお勧めです。

UbuntuのダウンロードはBitTorrentにも対応している

ISOイメージをUSBメモリに格納して起動ドライブにするには、専用のアプリを使います。私はWindowsも使う派なので、Rufusを愛用しています。DVDに焼いてDVDドライブから起動することも可能だとは思いますが、さすがに円盤を常用する時代ではないと思います。USBメモリにもType-C化の波が押し寄せているので、Type-AとType-Cの両方のコネクタがついたUSBメモリをお勧めします。

今回は敢えてサーバー版ではなくデスクトップ版をインストールします。エンジニア的にはセキュリティ上の理由から「最小構成が常に正義」ですが、私は基本情報技術者ではあるものの硬派な本職さんではありませんので、ふだん使いのUbuntuでそのままサーバーやクラスタを管理できる利点を優先しました。おそらく鯖缶ガチ勢の皆様はUbuntuではなくRHEL系のLinuxをお使いだと思いますので、この辺は棲み分け、という感じです🤗

毎度のことながら、初回の起動がうまくいくかドキドキします……。

USBメモリからUbuntu 22.04 LTSのインストーラを起動する

今回は無事、起動しました🙌

最近はLinuxも市民権を得てきたのでPCメーカーがLinuxを公式にサポートすることも多くなってきました。もちろん最近出たばかりのOSをサポートすることはまず無いのですが、Linuxを公式にサポートしている機種の方がドライバなどを含めて安定動作する可能性が高いとは言えると思います。私はコスパがすべてですが💰

Ubuntu 22.04 LTSのインストーラが周辺機器を認識しているかを確かめる

Ubuntu 22.04 LTSのインストーラが起動したら、設定画面で周辺機器を認識しているかチェックします。BIOSが認識しているからといってOSも正しく認識できるとは限らないからです。

Ubuntu 22.04 LTSのインストーラがメモリとSSDを認識しているかチェックする

『Memory』が64GiB、『Disk Capacity』が3.0TBと表示されています。これで、ほぼ安心です🙌

SSDの初期化とパーティションの設定

インストーラを起動し、指示に従ってポチポチ進めていきます。初心者が詰まりやすいほぼ唯一の設定項目がSSDの初期化とパーティションの設定です。ディスクが1台なら言われた通りにポチポチすれば良いのですが、今回はディスクが2台なのでM.2ドライブにOSを決め打ちで入れる必要があります。

SSDの初期化とパーティションの設定は初心者のつまづきポイント

パーティションの設定にはUNIX系のOSに特有のパスという概念を理解する必要があります。すべてのデバイスやデータは『/』というルートパスの下にツリー構造でぶら下がっています。ルートパスの『/』をOS用のドライブ(/dev/nvme0n1)にマウントすることで、M.2ドライブにOSが入ります。ファイルシステムは今回『ext4』としました。

最近のPCではこれとは別に、512MB前後の『efi』パーティションを作る必要があります(無いと怒られます💦)。SATAのデータドライブ(/dev/sda)は『/data』にマウントしました(特に命名ルールはありません)。

あとはインストーラの完了を待ち、画面の指示に従ってUSBメモリを抜いて再起動すれば無事終了です。こうやって書くとまだまだ大変ですね💦 皆さんもあきらめずにがんばってください👍

Ubuntu 22.04 LTSが自宅PCクラスタの救世主な理由【2022年3月版】

自宅PCクラスタを組むなら『弁当箱PC』で決まり❕

個人データ基盤を敢えてオンプレで構築する理由』でご説明した通り、「ビッグデータを贅沢に使いたい」ならクラウドとは別にオンプレのPCクラスタが必要です。そして狭い日本の家でPCクラスタなどという仰々しいシステムを組むには超小型PCが必要です。私はサイズが分かりやすいので『弁当箱PC』と呼んでいます🤗

弁当箱PC(超小型PC)の特徴は、

  • モニタ無しで容量1リットル前後の弁当箱サイズ
  • 消費電力40W以下(CPUのTDPは35W)
  • グラフィックはGPU内蔵型(APU)

といったものです。小ささにこだわるのは、限られた面積で少しでも多くのCPUコアを動かすためです。消費電力にこだわるのは、1500Wの家庭用コンセントで安定稼働させるべく余計な機能による電力消費を抑えるためです。特に高性能GPU(グラフィック)はディープラーニング以外の用途では不要です。

弁当箱PCは本来受付やコールセンターの端末用のため、CPUやメモリの性能が全体的に抑えめです。しかしPCクラスタ用途では弁当箱サイズの範囲内で可能な限り贅沢にする必要があります。処理速度だけなら遅いPCを何台も並べるより我らがヒーロー藤井SOTAのThreadripperのように超高性能PC1台の方が強いです。PCクラスタは貧乏人の激安PC活用術分散処理データ保全の両取りを狙って敢えて複数台にしますが、個々のPCが速ければ速いに越したことはないです。具体的には、

  • CPUは最低6コア、予算が許せば8コア16スレッド
  • メモリは最低32GB、予算が許せば64GB
  • 512GB以上のSSD、予算が許せば1TB
  • USB Type-C 3.2 Gen2 10Gbpsポート推奨
  • 台数は5台以上を想定

となります。1台10万円以下に抑えたいところですが、インフレが進んだ今では10万円を超えてしまうかも知れません。予算に余裕がないならリース落ちの中古PCを拾っていくのもひとつの選択肢です。USB 3.2 Gen2推奨なのは将来的に10Gbps EthernetのハブとLANアダプターが安くなった際に10GbEで運用出来るからです。ストレージが控えめなのはクラスタの強みである「壊れたら復旧など考えずさっさと入れ替え」を想定しているからです。

2022年時点のお勧めCPUはAMD Ryzen APU

PCクラスタのCPUはIntelかAMDの2択となりますが、現時点で私はAMD Ryzen APU推しです。IntelがCPU自社製造に縛られて未だに14nmや10nmのプロセスを使っているのに対して、AMDはTSMCの最新7nmプロセスを使っており近い将来5nmも出てくるからです。CPUが微細化するほど消費電力あたりの処理性能(通称『ワッパ』)が上がるので貧乏人に優しい自宅クラスタで有利だからです。

実際に2022年3月20日時点でHPの弁当箱PCでIntelとAMDの同価格帯商品の性能を比べてみると、

  • Intel …… Core™ i5-10500T
  • AMD …… AMD Ryzen™ 5 Pro 5650GE

消費電力はどちらもTDP35Wで6コア12スレッド。CPUの総合性能(マルチスレッド)ベンチマークであるPassMark resultはAMDの19266に対してIntelは10760でAMDの方が2倍近く速いことが分かります。この差は基本的に微細化の差であり、将来的には微細化でどちらが勝つかで勝負が決まると思われます。なおbig.LITTLEという「比較的大型で高いパフォーマンスを持つCPUコア(big)と、小型で低消費電力のCPUコア(LITTLE)を組み合わせる」技術を用いた製品も出てきていますが、サーバー用途では基本的に全てのCPUコアを用いるので無意味です。

Ubuntu Linuxは無料で管理が楽なOSだが、AMD対応は遅れている

Ubuntu LinuxはWindowsと比べて巨大なアップデートで苦しむことが少なく、必要な機能を選んで入れられるのでスキルがある方には便利なOSです。サーバーが10台にもなるとアップデートの通信量も10倍になるので、貧弱な回線しか引けない貧乏人にとっては比較的アップデートが小さいUbuntuが有力な選択肢になります。

また弁当箱PCを新品で買うとリモートデスクトップのホストになれないWindows Homeが入っていることが多く、高いProを買うくらいならUbuntuに替えた方が楽で安上がりという事情もあります。

ところが、LinuxはかつてAMD対応が遅れており、私も「Ubuntu 20.04 LTSがRyzen5 4600Hノートで画面表示出来ない」など苦労がありました。しかし、Linuxの親玉リーナス・トーバルズがAMDを寄付してもらった買ったことでAMD対応が進み、UbuntuでもAMD Ryzen APUで画面表示出来るようになってきました

Ubuntu Linux 22.04 LTSは初の最新Ryzen APU対応LTSバージョン

Ubuntuは長期サポート版(LTS = Long Time Support)と無印版があり、LTSは2年ごとのリリースとなっています。サーバーとして真面目に使うならLTSが前提となるため、2022年4月21日にリリース予定のUbuntu Linux 22.04 LTSが初の最新Ryzen APU対応LTSバージョンとなります。

Ubuntu 22.04 LTSは2032年3月までのサポートなのでサーバー運用でも安心

Ryzen APUへの対応はUbuntuではなくLinuxカーネルで行われているので、

  • Linuxカーネルのどのバージョンから該当するRyzen APUに対応しているか
  • Ubuntu LTSがどのバージョンのLinuxカーネルを採用するか

の2点でお手持ちのRyzen APUでUbuntuが(素のバニラ状態で)動くかが決まります。具体的には、Linuxカーネルバージョンは

となります。なおTDP35Wモデルのうち5000番台は5300GE(4コア)、5600GE(6コア)と5700GE(8コア)、4000番台は4300GE(4コア)、4350GE(4コア)、4600GE(6コア)、4650GE(6コア)、4700GE(8コア)、4750GE(8コア)などとなります。

Ubuntuが採用するLinuxカーネルは下記となります:

  • Ubuntu 20.04 LTS …… 5.4
  • Ubuntu 20.10 …… 5.8
  • Ubuntu 21.04 …… 5.11
  • Ubuntu 21.10 …… 5.13
  • Ubuntu 22.04 LTS …… 5.15

長くなりましたが、要は「新品のRyzen弁当箱PCを買って2022年4月21日まで待ってUbuntu 22.04 LTSを入れれば動く(はず)」ということです。

なお、私は現在無職で貧乏なのでPCクラスタを全部入れ替えることなど出来ませんが、1台だけ4750GEを入手済です🤗

【OCI/GCP/AWS】メモリ1GBの無料インスタンス生活にはスワップメモリが必要

メモリ1GB無料インスタンスは太っ腹……だけど1GBでも足りない😭

 クラウドの無料インスタンスを利用している方の用途は、だいたいWordPressなどを用いた個人サイトかと思います。最近はメモリ1GBの無料VMが各社から提供されるようになり、個人サイトの運営はだいぶ楽になりました。私も、無料でこそありませんがAWS LightSailのメモリ512MBでさんざん苦労したWordPressを1GBに増やしたら安定した経験があります。

 しかし、少し欲張ったとたんにメモリ1GBでも足りなくなってしまいます。自宅にもLinuxサーバーを置いている方は、だいたいこんな感じで

メモリ32GB以上、プロセッサ8vCPUくらいはあるので、重いサーバーソフトを入れても「いきなり全く動かない」事態に直面することは無いと思います。しかしこの感覚でメモリ1GBの無料インスタンスを使うと大変なことになります……。

Logstash(ETLツール)がフリーズしまくる

 2年ほど前からツイートデータなどの蓄積・抽出にElastic Stackを使っています。全文検索エンジンのElasticsearch、データ前処理(ETL)ツールのLogstash、BIツールのKibanaが3点セットで構成されています。

 今回、このうちLogstashだけOCIの無料枠VMインスタンスに設置を試みました。というのも、自宅の回線が低速・不安定なため各種情報サービスからAPI経由で安定してデータを取得するのが難しいからです。

回線が安定したパブリッククラウドで『クラウドETL』

エンタープライズ系ツールの鬼門『JavaVM』

 ところが、データベース周りなどエンタープライズ系のツールは、複数のOSやプラットフォームで互換性を確保するため、たいていJava VM上で構成されています。まずJava VMを起動して、その上で各種アプリを起動する仕組みです。しかしこれがデカい……。

 メモリ1GBのインスタンスにLogstashをインストールして起動したところ、またたく間にメモリがすべて食いつくされてしまいました😨

こうなるともう大変。sshでのログインすら出来なくなり、モニターを見ると再起動をかけるたびにOSがフリーズしているのです😭

サーバー向けUbuntuにはスワップが初期設定されていない

 私はメモリー極小のレンタルサーバー時代からLinuxを使っていたので、てっきりクラウドのインスタンスにもスワップメモリ(メモリが足りなくなったときに、一時的にデータをディスクに退避させてメモリ不足を防ぐ仕組み)が設定されていると思い込んでいました。

 ところが、サーバー向けUbuntu Linuxのイメージは初期設定ではスワップが設定されていないのです。従って、メモリ使用量が1GBに達するとそのままOSがフリーズしてしまうことになります。

 私は泣きながら再起動して速攻でsshしてLogstashをいったん止めた上で、スワップの設定を行い、なんとかLogstashの動作を安定させることが出来ました。

スワップの設定後。2GBのスワップ領域が確保されデータの一部が退避されている

サーバーでスワップは設定するべきか?

 なぜ、Ubuntuサーバーでは初期設定でスワップが無いのでしょうか。理由はふたつ考えられます。

 第一の理由は、『速度重視』です。Webサーバーなど多数のアクセスをさばかなければならないサーバーは、常に高負荷の状態にあります。データを頻繁にディスクに退避させると、メモリとの速度差のぶんだけサーバーの処理速度が落ちてしまいます。特に業務用途では避けたいところです。

 第二の理由は、『ディスクの消耗』です。一般的にディスクはメモリーと比べて寿命が短く、頻繁にアクセスすると故障につながる恐れがあります。サービスダウンが許されない業務用途では、これも避けたいところです。

 しかし、個人用途のサーバーはめったに高負荷になりませんし、遅くても我慢すればどうにかなります。しかも、遅いと言ってもハードディスクの時代とは違い、今ではSSDなので大して遅くありません。さらに言ってしまえば、ディスクが消耗しても困るのはクラウドサービス側だけです……💦

 というわけで、

個人用途のクラウドインスタンスには遠慮なくスワップを設定しよう

というのが私の結論です。

「かわいい」ツイートってなんだろう❓🤔

実は、マーケティングのブログなんです

 このブログ、『IT&マーケティング』などと書きながら実際にはITに関することばかり書いてきました。これは、ずっとマーケティング側の仕事をやってきたために「業務としては苦手分野であるIT実務をスキルアップしたい」という動機でブログをやっているのが理由です。

 とは言え、あまりにもマーケティングから離れっぱなしなのもまずいので、今日は敢えて技術的な内容をほとんど含まないことを書いてみようと思います。

きっかけは『りんな』

 Google Colab Pro(plusでないほう)を契約したので「ぼちぼちNLP(自然言語処理のほう)でも始めるか」ということでネットを検索していたところ、出てきたのが『GPT-2』という言語モデルで構築された文章生成AI『りんな』。なんとColab Proでさくっと動いてしまうではありませんか。

 さっそく自分の愚痴アカウントの10万件のツイートデータを食わせて動かしてみたりしましたが、

かわいくないおっさんが何をつぶやいても面白くない

ことを思い知った(泣)わけです。おっさん、コンテンツにならない。

ツイートデータはなんやかやで手に入るのですが……

 俺のツイートがかわいくないなら、かわいい女子のツイートを食わせればいいじゃないか。そもそも元祖『りんな』は元女子高生AIなのだから、本来、女の子のツイートを大量に学習させてナンボです。

 そこでツイートデータ収集に至るわけですが、ツイートデータそのものはなんやかやで手に入るものです。オトナの事情で具体的な手段には敢えて触れませんが、いま私の手元には2000アカウントくらいの若年層と思しきアカウントのツイートデータが保存されています。

 しかし、この大量のツイートデータ、どれがかわいいのでしょうか❓🤔

『かわいい』の定義や判別はむずかしい

 最初は『かわいい単語』の出現頻度などでツイッターアカウントの「かわいさ」を定量化しようかと思いましたが、すぐに『おじさん構文』のことを思い出して「ダメだ😨」と気づきました。

 ツイートのかわいさは文章全体から醸し出されるものであって、かわいい単語や絵文字を多用するという安直な手段で『かわいい度』をアップすることは出来ず、むしろ「キモいツイート」になってしまうのです。

 どうやら、異なるアプローチが必要なようです。

論文と同じ『アレ』を使えないか?

 そこで思い出したのが、「Googleが初めてウェブページの価値を評価したとき、論文を引用数で評価する手法に習ってページの被リンク数を主な指標にした」という有名な逸話です。かわいいツイートをする女子力が高いアカウントには、きっとたくさんの下心に満ちた@コメントがついているに違いありません。

 とは言え、大量に収集したツイッターアカウントへの@コメントをツイッターからさらに収集するのはさすがに気が引けます。そこで代替案として現在考えているのが、「ツイート数に対する@コメントの出現比率」です。これは「コミュ力が高いアカウントなら、受け取った@コメントに対して一定比率で返信をするだろう」という仮説に基づいています。

 ただし、この方法は「一方的に@コメントを送りまくるネットナンパ男子」のアカウントも一緒に拾ってしまいそうな不安感があります。まだ集計スクリプトを組んではおりませんので、より良い方法があれば是非コメントかツイッターでご教示頂けると嬉しいです。

GCPの無料クラウドVMが性能アップするらしい(F1-Micro → E2-Micro)

突然GCPからメールが届いた

 突然GCP(Google Cloud Platform)からメールが届きました。Googleからなので「またセキュリティ警告かよ」とびっくりして開いたところ、なんと「無料枠のVM(仮想サーバー)が2021年8月1日からグレードアップするからお引越ししてね」という嬉しい内容。

 GoogleにはColab Proで月1,072円課金していますが、正直GCPには課金する魅力を感じていませんでした。今回無償のままグレードアップということで、新VMのインスタンス仕様を調べてみました。

新無料VM『E2-Micro』はメモリ1GBで「まあまあ」

 GCPの料金ページを見ると、

  • 2 つの vCPU の 12.5%
  • メモリ1GB
  • ディスクの記載なし

というわけで、メモリが1GBでOCIに並んだほかはイマイチよく分かりません。vCPUに関しては、おそらく「ご近所が空いている時は2vCPU使ってくれるが、使いすぎたり混んでいる時にはリソースを減らされる」ということだろうと思います。常時フル稼働する用途でなければ、実質的には2vCPUと考えて良さそうです。

ディスクは別枠で最大30GBのストレージをアタッチするらしい

 ディスクに関する記載がなく相変わらず初心者に不親切だなと困っていたところ、Qiitaで「標準永続ディスク ストレージは30 GB まで無料枠内」との記載をみつけました。

 どうやら、何も考えずに無料枠でVMを立ち上げると10GBのSSDが30GBの枠から割り当てられ、明示的に割り当てを30GBに変更することで30GBがフルで割り当てられるようです。「VMとは別枠だからVM側のスペックには記載がない」ということなのでしょう。

持っておいて損はなさげ

 これまでのGCPの無料枠は「お情け」「お試し」というイメージがありましたが、OCIに近いスペックになったことで「真面目に使ってみてもいいかな」という印象に変わりました。特にAWS LightSailの最安プランよりはハイスペックなので、なんとなくLightSailを使っている人は引っ越した方がシアワセになれそうです。

 おそらく、VMとストレージを別枠で確保したクラウド構造になっていることで、E2-Microへの引越しもウィザード的に簡単に出来るはずです(ですよねGoogle先生💦)。

【追記】E2-Microに移行しました

 Google先生から告知があった新無料VM開始日の8/1から、時差を考慮して1日遅れの8/2にE2-Microへ移行しました。

 基本的に作業はマウスポチポチだけですが、さすがにVMをいったん止めないとインスタンスのグレード変更は出来ませんでした。インスタンスの停止後『編集』をクリックし、『マシンの構成』から『汎用』『E2シリーズ』『マシンタイプ:e2-micro(2 vCPU、1GBメモリ)』を選び、保存。インスタンスを再起動します。

インスタンスの停止後『編集』をクリックし、『マシンの構成』から『汎用』『E2シリーズ』『マシンタイプ:e2-micro(2 vCPU、1GBメモリ)』を選び、保存。インスタンスを再起動

無事移行。ただし無料かどうかは次の請求まで不明……

 インスタンスの変更後、 e2-microのメモリが1GBになっていることを無事確認しました。apacheとPostgreSQLが動いている状態で600MB以上メモリが余っているのは嬉しいですね。

 しかし、GCPはOCIなどと違って管理画面に『無償です』といった表示は特に出ないので、次回の請求まで無料枠が適用されているかどうかは分かりません。ドキドキですね()

Google Colaboratory(Colab Pro)でkaggleデータをダウンロードする方法[備忘録]

 技術的な要素は無いのですが、忘れやすいのでコピペ出来るように記事を残しておきます。

kaggle.jsonをGoogleドライブに保存しておく

 kaggleのAccount画面でCreate New API Tokenボタンを押してkaggle.jsonをダウンロードし、Googleドライブに保存する(私の場合は’Colab Notebooks’直下)。

Colabの規定ディレクトリにkaggle.jsonをコピー

 Colabのノートブック画面でGoogleドライブに接続。

from google.colab import drive
drive.mount('/content/drive')

 ターミナルでkaggle.jsonを所定の位置に配置。ColabのターミナルではCtrl+C、Ctrl+Vでコピペ出来ないので、それぞれCtrl+InsertShift+Insertのショートカットで代用する(メニューバーの『編集』でもコピペ出来ない……)。

/content# mkdir /root/.kaggle/
/content# cp '/content/drive/MyDrive/Colab Notebooks/kaggle.json' /root/.kaggle/

kaggleコマンドでデータダウンロード

 Kaggleのコマンド自体はkaggleのサイトに表示されるので、コンペの利用条件を承諾してからコマンドをコピペするだけです。

/content# kaggle competitions download -c house-prices-advanced-regression-techniques
Warning: Looks like you're using an outdated API Version, please consider updating (server 1.5.12 / client 1.5.4)
Downloading train.csv to /content
  0%|                                                                                           | 0.00/450k [00:00<?, ?B/s]
100%|███████████████████████████████████████████████████████████████████████████████████| 450k/450k [00:00<00:00, 61.1MB/s]
Downloading sample_submission.csv to /content
  0%|                                                                                          | 0.00/31.2k [00:00<?, ?B/s]
100%|█████████████████████████████████████████████████████████████████████████████████| 31.2k/31.2k [00:00<00:00, 33.8MB/s]
Downloading test.csv to /content
  0%|                                                                                           | 0.00/441k [00:00<?, ?B/s]
100%|███████████████████████████████████████████████████████████████████████████████████| 441k/441k [00:00<00:00, 60.6MB/s]
Downloading data_description.txt to /content
  0%|                                                                                          | 0.00/13.1k [00:00<?, ?B/s]
100%|█████████████████████████████████████████████████████████████████████████████████| 13.1k/13.1k [00:00<00:00, 12.4MB/s]

Colabの操作性は初心者に優しくない

 Colabのインスタンスを立ち上げるたびに各種操作が必要なのが果てしなくだるいですね……。GoogleのColabチームは操作性の向上に消極的なようで、細かいところでストレスが蓄積します。GBレベルのデータダウンロードが厄介なのも大きな弱点です。

 AutoMLがオープンソースでも出てきており、細かいチューニングが不要な用途ではnotebookの体裁すら不要なノーコードの時代になってきています。本来はGUIでボタンぽちーで分析完了出来てしかるべきです。ちなみにお高いDataRobotや無料でもそこそこ使えるAutoAI with IBM Watson Studioでは既にGUIでAutoMLが可能です

伸びしろがある若い方なら思い切ってワークステーションを買ってみては?

 ワークステーションに50万円払える方は、買ってしまってローカルのJupyter Notebookで分析した方がシアワセになれるかも知れません。もちろんLinuxの知識が多少はあることが前提ですが。

 私が大学時代に貯金をはたいて購入したDECのパソコンは50万円しましたから、伸びしろがある方なら無駄な投資にはならないと思います。

Googleドライブの鬼仕様な『フォルダダウンロード』を回避する裏技(Piping Server)

 最近、Google Colab Pro(月1,072円)を契約したので、『NVIDIA V100』という高性能GPUで機械学習ごっこ(GPT-2,BERT等)をして遊んでいます。

 ところが、機械学習は10GB単位で鬼のようにデータを吐き出すので、Googleドライブが100GB有料契約(月250円)でもすぐ満杯になってしまいます。

 学習したモデルを即消しすれば良いのですが、様々なデータを食わせてAIの挙動を比べるような楽しいことが出来なくなってしまいます。

 そこで考えるのが学習データのバックアップ=Googleドライブからのダウンロードです。しかし、Googleドライブがまさかの変な挙動を示しましたので、注意喚起しつつ対処方法を記録しておきます。

圧縮すらされず変なファイルが落ちてくる

 Googleではフォルダをダウンロードしようとすると、一つあるいは複数のzipファイルに圧縮して送ってきます。ところが、2.5GBあるような大きなファイルは、なぜか圧縮せずzipとは別にボコボコ送りつけてくるのです😭

Googleドライブは、圧縮しきれなかったファイルだけ非圧縮で送ってくる。最悪だ

 上図のケースでは、各チェックポイントのフォルダごとに複数個作成されるoptimizer.ptというファイルが非圧縮のままボコボコ落ちて来た例です。ファイル名が重複するので『optimizer-002.pt』『optimizer-005.pt』など謎なファイル名になっています。さすがにこれは私も

「どのoptimizer.ptだよ!!」

キレ気味困惑してしまいます。課金してもデレないGoogleドライブの仕様を何とかして回避しなければなりません。

こうなったら自力で圧縮だ

 Googleドライブの圧縮機能がおかしいなら、自力で圧縮するまでです。Colab ProにはUbuntu Linuxのシェルがついてくるので、notebookにシェルコマンドを記述しなくても普通にシェル芸が使えます。そこで、まずはtar.gzでフォルダごと圧縮します。

シェル間ファイル転送の裏技『Piping Server』

 24時間で落ちるシンデレラ型インスタンス()であるColab Proで、ファイル転送だけのためにサーバーを立てたりトンネリングの設定をするのは面倒くさい。そこで思いついた対策がRyo Otaさんの『Piping Server』です。

 Piping Serverは、遠隔地のシェルのWebブラウザ(curl等)を仲介してWebブラウザ同士で直接テキストやファイルを送受信するものです。追加アプリのインストールが全く要らない、すごい……。

【送信側】 『Piping Server』は、任意のWebブラウザ間で直接ファイルを送受信できるサービス
【受信側】 『Piping Server』は、任意のWebブラウザ間で直接ファイルを送受信できるサービス

あとは、回線品質の安定を祈るのみです……(現時点でまだダウンロード中です💦)

ダウンロード中にColabのセッション切れを防ぐ

  2時間ほどダウンロードしたところで、切断されてしまいました。シェルコマンドが動いていてもColabセンセイは容赦なく未使用とみなしてセッションを切ってしまうようです。

 これはColabでは有名な問題で、既に他の方が解決策を見つけられています:

Google Colab セッション切れを防止する

【追記】Colab Serverとの通信速度が上がらない……

 その後、梅雨の合間を縫って図書館に行き、Piping ServerでColabからローカルへのダウンロードを試みました。しかし、通信速度が低く、1GB/時くらいしか出ません。図書館のネットは1時間に一回くらい切断される仕様なので、もはやファイルを分割するしかありません。

/content/drive/MyDrive/work# ls -al
total 8449838
drwx------ 2 root root       4096 Jun 19 04:41 output
drwx------ 2 root root       4096 Jun 19 04:32 output-3epochs
-rw------- 1 root root 8631501037 Jun 26 23:59 output-3epochs.tar.gz
drwx------ 2 root root       4096 Jun 18 15:37 runs
-rw------- 1 root root   21116052 Jun 18 15:34 train.txt
drwx------ 2 root root       4096 Jun 18 15:01 transformers
/content/drive/MyDrive/work# split -b 1000m -a 2 output-3epochs.tar.gz output-3epochs_p_
/content/drive/MyDrive/work# mkdir split
/content/drive/MyDrive/work# mv output-3epochs_p* split/
/content/drive/MyDrive/work# cd split
/content/drive/MyDrive/work/split# ls -al
total 8429201
-rw------- 1 root root 1048576000 Jun 29 09:08 output-3epochs_p_aa
-rw------- 1 root root 1048576000 Jun 29 09:08 output-3epochs_p_ab
-rw------- 1 root root 1048576000 Jun 29 09:08 output-3epochs_p_ac
-rw------- 1 root root 1048576000 Jun 29 09:09 output-3epochs_p_ad
-rw------- 1 root root 1048576000 Jun 29 09:09 output-3epochs_p_ae
-rw------- 1 root root 1048576000 Jun 29 09:09 output-3epochs_p_af
-rw------- 1 root root 1048576000 Jun 29 09:10 output-3epochs_p_ag
-rw------- 1 root root 1048576000 Jun 29 09:10 output-3epochs_p_ah
-rw------- 1 root root  242893037 Jun 29 09:10 output-3epochs_p_ai
/content/drive/MyDrive/work/split# cat output-3epochs_p_aa | curl -T - https://ppng.io/epochs
[ERROR] Connection on '/epochs' has been established already.
/content/drive/MyDrive/work/split# cat output-3epochs_p_aa | curl -T - https://ppng.io/epochs2
[INFO] Waiting for 1 receiver(s)...
[INFO] A receiver was connected.
[INFO] Start sending to 1 receiver(s)!
% curl https://ppng.io/epochs2 > output-3epochs_p_aa.tar.gz
% curl https://ppng.io/epochs2 > output-3epochs_p_ab.tar.gz
% curl https://ppng.io/epochs2 > output-3epochs_p_ac.tar.gz
% curl https://ppng.io/epochs2 > output-3epochs_p_ad.tar.gz
% curl https://ppng.io/epochs2 > output-3epochs_p_ae.tar.gz
% curl https://ppng.io/epochs2 > output-3epochs_p_af.tar.gz
% curl https://ppng.io/epochs2 > output-3epochs_p_ag.tar.gz
% curl https://ppng.io/epochs2 > output-3epochs_p_ah.tar.gz
% curl https://ppng.io/epochs2 > output-3epochs_p_ai.tar.gz
% cat $ output-3epochs_p_* > output-3epochs.tar.gz
% tar -zxvf output-3epochs.tar.gz

 ただのデータバックアップなのに、気が遠くなる作業です。お金持ちの方は観念してGoogleドライブに多額の納金をするのが現実的かと思います……。

 Colabはお得で面白いサービスですが、なかなか癖も強いので付き合うのは大変そうです……。

【追記】分割もダメでした……

 図書館で数日に分けて分割ダウンロードをして、ローカルでtar.gzの解凍を試みたところ

(base) masaru@MacBook-Pro-15 output-3epochs % tar -xvf output-3epochs_p_aa.tar.gz 
x output-3epochs/
x output-3epochs/checkpoint-5000/
x output-3epochs/checkpoint-5000/config.json
x output-3epochs/checkpoint-5000/pytorch_model.bin: truncated gzip input
tar: Error exit delayed from previous errors.

結局エラーが出て解凍出来ませんでした……。回線品質が劣悪でtarやPiping Serverにエラー補正がないため、ダウンロード途中でデータが壊れてしまったものと思われます。

 そんなわけで、「高速回線がないと使いこなせない」というのが、現時点での私のGoogle Colab Proへの見解です。

【追記】3分割で再試行し、ようやくダウンロード成功

 緊急事態宣言が出て図書館の人出が若干減ったので、3分割で再試行しました。

(base) masaru@MacBook-Pro-15 output-3epochs % cat output-3epochs_p_* > output-3epochs.tar.gz 
(base) masaru@MacBook-Pro-15 output-3epochs % ls -al
total 33769200
drwxr-xr-x  6 masaru  staff         192  7 29 18:15 .
drwxr-xr-x  4 masaru  staff         128  7 12 19:03 ..
-rw-r--r--  1 masaru  staff  8631501037  7 29 18:16 output-3epochs.tar.gz
-rw-r--r--  1 masaru  staff  3145728000  7 12 19:35 output-3epochs_p_aa.tar.gz
-rw-r--r--  1 masaru  staff  3145728000  7 21 19:47 output-3epochs_p_ab.tar.gz
-rw-r--r--  1 masaru  staff  2340045037  7 29 18:08 output-3epochs_p_ac.tar.gz
(base) masaru@MacBook-Pro-15 output-3epochs % tar -xvf output-3epochs.tar.gz 
x output-3epochs/
x output-3epochs/checkpoint-5000/
x output-3epochs/checkpoint-5000/config.json
x output-3epochs/checkpoint-5000/pytorch_model.bin
x output-3epochs/checkpoint-5000/tokenizer_config.json
x output-3epochs/checkpoint-5000/special_tokens_map.json
x output-3epochs/checkpoint-5000/spiece.model
x output-3epochs/checkpoint-5000/training_args.bin
x output-3epochs/checkpoint-5000/optimizer.pt
x output-3epochs/checkpoint-5000/scheduler.pt
x output-3epochs/checkpoint-5000/trainer_state.json
x output-3epochs/checkpoint-10000/
x output-3epochs/checkpoint-10000/config.json
x output-3epochs/checkpoint-10000/pytorch_model.bin
x output-3epochs/checkpoint-10000/tokenizer_config.json
x output-3epochs/checkpoint-10000/special_tokens_map.json
x output-3epochs/checkpoint-10000/spiece.model
x output-3epochs/checkpoint-10000/training_args.bin
x output-3epochs/checkpoint-10000/optimizer.pt
x output-3epochs/checkpoint-10000/scheduler.pt
x output-3epochs/checkpoint-10000/trainer_state.json
x output-3epochs/config.json
x output-3epochs/pytorch_model.bin
x output-3epochs/tokenizer_config.json
x output-3epochs/special_tokens_map.json
x output-3epochs/spiece.model
x output-3epochs/training_args.bin
x output-3epochs/train_results.json
x output-3epochs/trainer_state.json
x output-3epochs/eval_results.json
x output-3epochs/all_results.json

 ようやく無事、解凍までたどりつきました……。

Oracle Cloudの無料枠が太っ腹(ただし初心者向きではない)

AWS以外のクラウドには仮想マシンの無料枠がある

 AWSで構築したcan.ne.jpですが、維持費に毎月数ドルかかります。「AWSのメールマガジンで毎月バウチャーをもらえばホニャララ」という話もあるのですが、AWSでWebサイトを作ると初年無料を除けば基本的に有料です(2021年4月現在)。

 一方で、AWSに対して出遅れ感があるGCP(Google Compute Engine)やOCI(Oracle Cloud Infrastructure)は永年無料でWebサイトを構築出来る仮想マシン(Virtural Machine, VM)を立てられます。

 クラウドに慣れる目的もあり、GCPとOCIの双方で仮想マシンを立ててみましたが、特にオラクルのOCIが太っ腹だったのでご紹介します。

無料枠なのにAWSのLightSailよりハイスペック

 OCIの無料枠『Always Freeリソース』にはデータベースやストレージもありますが、好きなデータベースをインストールして使えるのはAlways Freeコンピュート仮想マシン(VM)インスタンスです。スペックは

  • シェイプ: VM.Standard.E2.1.Micro
  • プロセッサ: 追加のCPUリソースを使用する機能を持つ1/8 OCPU
  • メモリー: 1 GB
  • ネットワーキング: 1つのパブリックIPアドレスと最大480 Mbpsネットワーク帯域幅を持つ1つのVNICが含まれます
  • オペレーティング・システム: 次のいずれかのAlways Free対応オペレーティング・システムを選択できます:
    • Oracle Linux (Oracle Autonomous Linuxを含む)
    • Canonical Ubuntu Linux
    • CentOS Linux

1/8 OCPUってなんぞや?

 「1/8 OCPUってなんぞや?」と調べてみたところ、AMD EPYC 7551 32-Core ProcessorというCPUの1コアが割り当てられていました。最近のCPUは6コア12スレッドくらいあるので、その1コアぶんくらいでしょう。

[opc@mysql ~]$ sudo cat /proc/cpuinfo
processor	: 0
vendor_id	: AuthenticAMD
cpu family	: 23
model		: 1
model name	: AMD EPYC 7551 32-Core Processor
stepping	: 2
microcode	: 0x1000065
cpu MHz		: 1996.249
cache size	: 512 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 1
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibpb vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 nt_good virt_ssbd arat npt nrip_save
bugs		: fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips	: 3992.49
TLB size	: 1024 4K pages
clflush size	: 64
cache_alignment	: 64
address sizes	: 40 bits physical, 48 bits virtual
power management:

processor	: 1
vendor_id	: AuthenticAMD
cpu family	: 23
model		: 1
model name	: AMD EPYC 7551 32-Core Processor
stepping	: 2
microcode	: 0x1000065
cpu MHz		: 1996.249
cache size	: 512 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 1
apicid		: 1
initial apicid	: 1
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibpb vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 nt_good virt_ssbd arat npt nrip_save
bugs		: fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips	: 3992.49
TLB size	: 1024 4K pages
clflush size	: 64
cache_alignment	: 64
address sizes	: 40 bits physical, 48 bits virtual

メモリー1GBは余裕がある

 can.ne.jpが動いているAWS LightSailは最安プランではメモリが512MBしかありません。

LightSailの最安プランはメモリが512MBしかない

 OCIの仮想マシンはメモリが2倍の1GBあるので、アクセス負荷への耐性がLightSailの最安プランよりずっと高いと思われます。今から自分がWordPressのブログサイトを作るなら、少し面倒でもOCIで自分で構築すると思います。

ストレージは100GBまでいけそう

 画像をたくさん置くブログでは気になるストレージ容量ですが、「コンピュート・インスタンスをプロビジョニングする場合、インスタンスはストレージ用に50 GBのブート・ボリュームを自動的に受け取ります」との記述があり基本50GBです。

 さらに「ブロック・ボリュームを作成してアタッチすると、コンピュート・インスタンスのストレージ容量を拡張できます」「すべてのテナンシは、合計100 GBのAlways Freeブロック・ボリューム・ストレージと、5つのボリューム・バックアップを受け取ります」とあるので、ブロックボリュームをアタッチすることで100GBまで拡張出来ると思われます。

 上のLightSailプランの5倍ですね……。

やっちまった…… Oracle Linuxってなに??

 深く考えずにポチポチして仮想マシンを作ったところ、Oracle Linux 7.9という独自Linuxが入ってしまいました。Red Hat Enterprise Linuxのクローンなのでコマンド周りはCentOSに近いのですが、正直

「特に理由が無いのに、よく知らないOSは使いたくない。面倒くさい」

 というのが本音です。UbuntuやCentOSも選べるらしいので、これからOCIを始める方はOS選びに気をつけて下さい。

セキュリティ周りが面倒くさい(間違ってはいないけど)

 OCIでインスタンスを作ると、他社とは異なりデフォルトでファイアウォールが有効になっています。ファイアウォールを設定してポート開放しないとWebサイトすら公開出来ないので、初心者向きではありません。

 とは言え、セキュリティの問題はサイトを公開する以上は避けて通れないので、敢えて苦しんで設定してみるのも良いかと思います。

 また、AWSやGCPには標準で備わっている『Webブラウザ版のSSHクライアント』が無い(ような)ので、RLoginなどのSSHクライアントをインストールするかシェル版のsshを長いコマンドを打って起動する必要があります。こういった「とっつきやすさ」では、OCIはまだAWSやGCPより一歩遅れているように思います。

 オラクルのビジネスモデルを考えると、そもそも初心者やライトユーザーは見込み顧客として想定していないと思いますが……💦

【追記】ufwでポートが開かない問題、私も遭遇しました😭

 OCIでのポート開放で、「ufwを用いてポートを開放できない問題に遭遇」する問題に私も遭遇しました。

 1つ目のインスタンスにLogstashを入れたところ凄いメモリ食いでメモリ1GBでもフリーズが頻発。泣く泣く他のサーバーを落としてOCIのサイトを見ていたところ「2つのAMDコンピュートVM」との記述を発見。「Oracleどんだけ太っ腹なんだ」と思いつつ2個めを立ち上げたところ、SSLが開きません。

 セキュリティーグループを作りイングレスを設定しても無反応。「これはインスタンス内部の問題か?」と思いufwを設定するも無反応。かなり絶望的な気分で1時間くらい検索しまくったところ

結論だけ先に言っておくと、Oracle Cloud上だとufwはバグっているのでiptablesをいじってポート開放すればいいです。

Oracle Cloudでポートを開放されない問題の解決策 – viasnake.com

との超ありがたい記述が。こんなんわかんねえよ先に言っといてくれよOCIさん😭😭😭

 ……というわけでサイトの記述に従ってiptablesを直接書き換えて無事解決しました。ufwは幅広く使われているのでポート開放でドハマりしたUbuntuユーザーは少なくないはず。不具合に対処するか、せめて「ufw使うな」と公式に書いておいてほしかったです。