10 年ぶりにサーバーを更新した。初めての AMD、初めての DDR4、初めての NVM Express!
用途
- 各種セルフホスト (Docker)
- Docker Swarm クラスターのマスターノード
- 計算実験
- VS Code Remote SSH のホストマシン
スペック
重いタスクを並列してやらせたいので最優先は CPU とメモリ。メモリはDDR4-3200 32GBx2 を、CPU は昨今のライブラリのマルチコア対応を勘案して Ryzen 9 3950X を選んだ。CPU クーラーは静音性を考えて Noctua の NH-D15 Black 。
追記: メモリ異常を起因とするシステム誤動作により、
/sbin
以下がゼロ上書きされカーネルが起動しなくなる災害が起きた。後日 ECC 付きのメモリに交換してからは、現在に至るまでメモリ関連の異常は発生していない。常時稼働するサーバーには最初から ECC メモリを選ぼう。
追記 2: 結果から言うとメモリは 64GB では足りなかった。巨大な Pandas データフレームを弄ったり、10 億レコード以上ある MongoDB を走査したりするたびに OOM が発動してしまう。最終的に 128GB まで増やす羽目になった。
追記 3: 結局 128GB でも OOM になる場面が出てきたが、スロットが埋まっていてもうこれ以上増設できないし、できたとしても Ryzen シリーズが 128GB までしかサポートしてないのでどちらにしろ詰みである。
これから機械学習/OLAP サーバーを構築しようと考えている読者は、最初から DIMM スロットが豊富な Dual-socket (CPU が 2 つ挿せる) マザーボードと、サーバー向け CPU (EPYC または Xeon)の組み合わせを検討すべきだ。サーバー向け CPU に関しては、EOL を迎えてデータセンターから放出された 5 年ほど前のモデルが eBay で安く手に入るはず。
追記 4: eBay で良いパーツを探すコツ
- 発送時期が異様に長くない (所有しているものを出品している)
- シリアル番号が写っている現物の写真がある (偽物や Engineering Sample の可能性が低い)
- 通電に加えて正常な動作確認を行っている (疑問点があれば出品者に質問を送ってしっかり言質をとっておくこと)
GPU は古いサーバーに突っ込んでいた NVIDIA GeForce GTX TITAN X (Maxwell)を流用した。VRAM が 12GB ちょっとしかないが、最大ワークロード時でも 5GB は残るので今のところ十分。
追記: 結果から言うと GPT-J や Megatron-LM を始めとした億パラメータ級のモデルを学習・推論させるには、DeepSpeed の助けがあったとしても最低 16GB の VRAM が必要だった。他の例を挙げると、Stable Diffusion の Fine-tuning には最低 30GB 前後の VRAM が必要になるし、OpenAI Whisper の large モデルを動かす際にも 13GB は見ておく必要がある。
今から GPU を買うなら、2022 年 10 月現在中古市場で 10 万前後で推移している RTX 3090 (24GB)を 2 枚買う戦略が筋が良いだろう。お金持ちなら A100 を買えば良い。
追記 2: RTX 3090 を安く仕入れることができたが、サイズが大きすぎて Meshify 2 ケースの HDD ベイに干渉してしまった。いくつか HDD を移動させることで上手く挿入できたが、かわりに 3 つ分のベイが使用できなくなった。
これからケースを買おうとしている読者は、最初から ATX ケースを通り越して Meshify 2 XL など、E-ATX/EE-ATX 対応ケースを選ぶことをおすすめする。どちらにせよそのようなケースでないと上記の Dual-socket マザーボードは挿せないし、十分な冷却環境を確保できない。
記憶装置は WD HDD 3TB 2 台と Samsung 970 EVO Plus 500GB M.2 PCIe、そして古いサーバーから引っこ抜いた Samsung 870 EVO Plus 500GB SSD 。NVMe メモリは OS とキャッシュ用、SSD/HDD はデータ用にする。
マザーボードは、X570 と比較して実装されているコンデンサーやパーツがサーバー向きだと感じたASRock B550 Taichi にした。
電源は今後 GPU を追加することを考えて Seasonic PRIME TX 850 を選んだ。実際にサーバーを稼働させながら使用電力を計測したところ、アイドル時に 180W 前後、フル稼働時でも 350W を超えない程度だった。
ケースは Fractal Design の Meshify 2 。
OS は長年付き合ってきた Ubuntu と袂を分かち、Arch Linux を選んだ。ミニマルと実用の間のバランスが取れていて好み。
Arch Linux のセットアップは個別に記事を書いた。
また、AUR (Arch User Repository)にパッケージを公開したい人向けに、Docker 自動ビルド・テストツールをGitHub で公開した。
パーツ選定時のポイント
- Disk Prices でディスクの値段チェック
- WikiChipで CPU のモデルやスペックを調査する
- PCPartPickerでパーツのコスト計算をする
- Bottleneck Calculatorで CPU と GPU の組み合わせを選び、そのうちどちらが性能のボトルネックになるか調べる
- UserBenchmarkでユーザーが投稿したベンチマーク結果を眺める
- Linux Hardware Database を見て、インストールする予定の Linux ディストリとパーツの相性をチェックする
- CPU クーラーは大口径の方が静か
- PSU は Seasonic が評判良い
- 東芝 D01 が HGST の系譜
- B550 は長期運用に向いている(らしい)
- B520 は廉価版
- TSUKUMO eX. の自作 PC コーナーのスタッフはガチ勢なので信頼できる
- 不明な部分があれば根掘り葉掘り聞く
組立ての勘所
- 少なくとも 1 年間はすべての箱・書類を取っておく(特にメモリは箱自体が保証書代わりになっている場合がある)
- 筐体は無視してまずマザボ、CPU、クーラー、(オンボードグラフィックが無い CPU なら)グラボ、そして電源を繋いで通電・動作テストをする
- MemTest86でメモリのテストを最後までやる(エラーが出たら交換依頼)
- USB ブートで OS の起動確認
- Ethernet が死んでいる場合は USB-Ethernet アダプターでまずネットを確保する
- ほとんどの場合 Linux カーネルのバージョンを上げると(デバイスドライバーも新しくなり)直る
- Arch Linux の場合:
linux-lts
が駄目ならlinux
に切り替えて試す - Ubuntu の場合: kernel.ubuntu.com から探してアップデートする(https://itsfoss.com/upgrade-linux-kernel-ubuntu/)
- Arch Linux の場合:
- 駄目ならマザボまたはアダプターメーカーからアップデートを探す
- ほとんどの場合 Linux カーネルのバージョンを上げると(デバイスドライバーも新しくなり)直る
- 安い筐体のネジは柔いことがあるため、強く押し込みながら少しずつ回す
- 山が潰れてきたらゴムシートを挟む
- すべて動いたら、Linux Hardware Database に Probe を送信して貢献する