10 年ぶりにサーバーを更新した。初めての AMD、初めての DDR4、初めての NVM Express!

用途

  • 各種セルフホスト (Docker)
  • Docker Swarm / K8s のマスター
  • 計算実験
  • VS Code Remote SSH のホストマシン
  • VPN 他

スペック

重いタスクを並列してやらせたいので最優先は CPU とメモリ。メモリはDDR4-3200 32GBx2 を、CPU は昨今のライブラリのマルチコア対応を勘案して Ryzen 9 3950X を選んだ。CPU クーラーは静音性を考えて Noctua の NH-D15 Black

結果から言うとメモリは 64GB では足りなかった。巨大な Pandas データフレームを並列処理したり、DeepSpeed でモデルの重みをオフロードするたびに OOM が発動してしまう。最終的に 128GB まで増やす羽目になった。

追記: メモリ異常を起因とするシステム誤動作により、/sbin 以下がゼロ上書きされカーネルが起動しなくなる災害が起きた。後日 ECC 付きのメモリに交換してからは、現在に至るまでメモリ関連の異常は発生していない。常時稼働するサーバーには最初から ECC メモリを選ぼう。

追記: 結局 128GB でも OOM になる場面が出てきたが、もうこれ以上増設できない。最初から DIMM を 8 枚挿せるマザーボードを選ぶべきだった。

GPU は古いサーバーに突っ込んでいた NVIDIA GeForce GTX TITAN X (Maxwell)を流用した。グラフィックメモリが 12GB ちょっとしかないが、最大ワークロード時でも 5GB は残るので今のところ十分。

結果から言うと GPT-J や Megatron-LM を始めとした億パラメータ級のモデルを学習・推論させるには、DeepSpeed の助けがあったとしても最低 16GB の VRAM が必要だった。

記憶装置は 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 で公開した。

パーツ選定時のポイント

  • 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 カーネルのバージョンを上げると(デバイスドライバーも新しくなり)直る
    • 駄目ならマザボまたはアダプターメーカーからアップデートを探す
  • 安い筐体のネジは柔いことがあるため、強く押し込みながら少しずつ回す
    • 山が潰れてきたらゴムシートを挟む
  • すべて動いたら、Linux Hardware Database に Probe を送信して貢献