はじめに
これはあくあたん工房GWアドベントカレンダー1日目の記事です.
しがないM2が悲惨なラボ計算機環境をどうにかしたいとあがいている様子です.過度な期待はしないでください.
なおこれは,かなり恵まれた環境で,かなり恵まれた学生が,さらに高望みしているだけの記事です.未だにPCの起動ディスクがHDDだとか,メモリが4GBしかないとか,そういう世界の話はしません.タスクとしては主に軽い深層学習がメインで,MPIを使ってマルチノードで大規模演算!みたいなことはしていません.
理想
プログラムを書いたら,
ワンクリックで,
いいかんじに強いマシンと沢山のGPUで超高速に計算をして,
クラウドにデータをバックアップして,
AIに論文を書いて欲しい!!!!!!!!!頼む!!!!!!!!
はい.最後の一つはともかく,研究者にとって
- 計算機上で行う計算自体はあまり意味がない(場合による)
- できればその部分で時間を取られたくない
- 抽象化された計算機が自分のプログラムを勝手にいいかんじにしてほしい
というのは共通の悩み・願望だと思っています.書いたプログラムをシュッとシームレスに動かす,それだけで良いのですが,現実はなかなかに非常だったりします.そもそも物理マシンがある時点で管理しないといけないですしね.
現実
多くの研究室では,予算の都合上一人一台高スペックなワークステーションを割り当てるのは難しいのではないでしょうか?せいぜい研究室に数台,それなりのスペックのものを用意して共通で使用することが多いのでは.弊研究室もその分に漏れず,それなりのワークステーションをサーバとしてみんながsshで接続し,計算を回しています*1.
ユーザこそ後述するLDAPにとって統一された管理を実現していましたが,各マシンの内部の管理は各代の有識者が思い思いに環境を作っており,完全にカオス.CUDAのバージョンもNVIDIA DriverのバージョンもPythonのバージョンも違う,誰もノウハウを残していないので思い思いに計算を回している,逆に謎の遺産によってなぜか動いている,誰がどのマシンを使っているか分からない…etc トラブルが起こったときに場当たり的に解決している状況が続いていては,再発して当たり前です.いちいちその復旧に追われ,研究がままならなくなっては本末転倒…
他にもハードの問題としてそもそもマシンが古くてよく壊れる,起動しなくなる,動いても遅い,などなど…問題は山積みです.
これはお金のない研究室の都合なのですが,
- 一度に買える計算機の台数が少ない
- しかし数が足りないために毎年購入
→ スペック,CPU・GPUアーキテクチャが全く異なるPCが何台も存在
- 年によって使える予算に差
- 潤沢な年だけマシンのスペックが上がる
→ 特定のマシンに計算が集中
など,管理の問題だけでなく予算の都合による構造的な問題も存在します*2.
加えて研究室のWebサイトやメールなど研究に直接は関与しないサービスを動かすマシンも存在します.この管理も教員や学生がやっており,時間が無駄に……
これらを踏まえ,まずはこれまでの研究室の計算機環境を見ていきます.
今までの環境
M1からこの研究室に来たのですが,既に環境としてはそれなりに整っているという印象でした.もちろん多数の不安定要素がありましたが,日常のオペレーションについては問題なく,みんなそれなりにやっているという感じでした.しかし,
- どう考えても古すぎるラボの中心となるMac mini
- 使いもしないのにWindowsが入っている計算サーバたち
- システムSSDの空き容量が20GB程度しかない
- ディスプレイにつなぎもしないのにDesktop OSが入っている計算サーバたち
- 昔は繋いでいたらしいが,サーバとして使っているのにChromeとかLibre Officeとか入ってて邪魔
- 完全に粗大ゴミと化している古い計算マシンたち
- 初期構築以降の環境構築方法を誰も残していないので思い思いにインストールされているCUDAとNVIDIA Driver
- 怪しすぎるセキュリティ
などなど,課題は山積みでした.前から早くこのMac miniから乗り換えたいよねという話はしていたのですが,やはりなかなか難しく,腰が重かったことは言うまでもないでしょう.しかし僕ももうM2になってしまう,出来る人間が出来るうちにやらないと手遅れになる,という危機感から,春先より気合いを入れて移行を始めました.
新しい環境への移行にあたって
完璧を目指すことは最初から諦めていました.そんなにスキルレベル高くないです.しかし,自分は卒業してしまう身なのでどうにかノウハウだけは残す必要があります.オレオレシェルスクリプトを残すよりはという気持ちで,今回はAnsibleを利用しました.また,
- 完全自動化は諦める
- ぶっ壊れない環境を作るのでは無く,ぶっ壊れた環境を躊躇無く消し飛ばしてできるだけ早く復旧できるようにする
- 全て自力で解決しようとしない
のようなポリシーでPlaybookを組み,無理なところはおとなしく手動オペレーションでいいやという気持ちになることで,自分の中のハードルを下げています.
結果から言うと
- OSのインストール・IPアドレスの固定までは手動(逆に言うとそれ以降は全て自動化)
- 計算用マシンについては途中トラブってもOSのインストール含め概ね30分〜1時間以内に復旧できる
- 金でなんとかなるものはなんとかした(NASを買った)
という感じです.かなり頑張った.
新しい環境
まず,ストレージ周りを全てNASに押し付けて解決を図りました.自分で頑張ってRAID組んで壊れたら復旧させて…とか面倒臭いので,ここはお金で解決*3.
これまでのMac Miniの代わりに,計算以外のタスクを担うサーバとして富士通のPRIMERGY TX1320M3を購入してもらいました.4コアXeon,16GBメモリ,1TB HDD×2(RAID1)でまぁ困らないくらいのスペックかなと*4.これに
- OpenLDAP
- ユーザ情報の統一管理.LinuxのPAMから参照してログイン・メール等からも利用
- ユーザの作成等もAnsibleでPlayBook化.かなり無理矢理
- https://galaxy.ansible.com/pddg/ldap_server
- Postfix/Dovecot
- IMAPS/POP3S/SMTPSを吐くメールサーバ
- https://galaxy.ansible.com/pddg/dovecot
- https://galaxy.ansible.com/pddg/postfix
- apt-cacher-ng
apt install
高速化のためのキャッシュサーバ.- クライアント側もセットアップ.HTTPSの通信は無視.
- https://galaxy.ansible.com/pddg/apt_cacher_ng
- Nginx + Certbot + MySQL + PHP(WordPress)
ac.jp
もLet's Encryptなんだっていう驚きが少しあった- 元はApacheでしたが好きじゃないのでNginxに
- https://galaxy.ansible.com/nginxinc/nginx
- certbotは自作Role.MySQLも自作RoleでDockerコンテナとしてデプロイ.要望があればオープンにします.
- AutoFS
- NFSのマウントに使用.自作Role.
- SSHD
- Docker
- Docker registry + Portus
- DockerHubのミラー用プロキシとして使用してサーバごとのpullを高速化したい
- 間に合わなかったのでGW中にやりたい
- Avahi-daemon
- systemd-resolved + systemd-networkdでmDNSがうまく有効にならない…
など,その他いろいろ細かい設定をするRoleを書いて実行しています.当然OpenLDAPもPostfixもDovecotも触ったことないので一から調べました.未だにOpenLDAPはよくわからない.続いて計算機も
- Docker
- 上に同じく
- NVIDIA Driver + nvidia-docker2
- 自作Role.
- Ansibleの
reboot
モジュールを使ってドライバのインストールは全て自動
- Neovim
- 趣味と実益を兼ねています
- https://galaxy.ansible.com/pddg/neovim
- AutoFS
- GPUデバッグコンテナ
- Dockerでの実行に慣れていない人,Dockerfileを書く前にGPUで動くかの簡易チェックをしたい人等に公開している,SSHログインできるコンテナ.
- LDAPの設定をホストからマウントしてLDAPユーザでログイン出来るように
- GitHub - pddg/sel-gpu-debug-container: Interactive CUDA container image for debugging
- Sigularity
- DockerではPermissionの問題がある(プロセスがrootとして動作する)
- まだちゃんと試せてないので未導入
という感じで整備.まだSingularityの導入で変わるかも知れませんが,基本的にはユーザの善意を信じて大きくパーミッションを与え,Dockerでの実行をサポートしています*5.nvidia-docker2は容易にCUDAのバージョンを切り替えることが出来るので,他人とバージョンが違っても安心なのがとても良いですね.Dockerの学習コストは少し高いですが,クライアントマシンとサーバマシンで環境を統一してデバッグできるので,メリットは十分大きいと考えています.
ワンクリックでサーバ上で実行!とはいきませんが,
- ローカルで開発
- ローカルでDockerfileを書いて実行を試す
- サーバ上でイメージをビルド
- コンテナを作ってデータセットをマウントし実行
で,少なくとも環境構築の手間はかなり省かれたかなと.
監視
業務用のサーバでもないのに,監視なんて必要なのか?という話なのですが,あった方がいいと個人的には思っています.ディスクの空き容量,CPU・GPU・メモリの使用状況等,いちいち自分で確認しに行くよりもWebUIから確認,自動でアラートするなどやっておいて損することは無いと思います.余っていた古いXeonマシンがあったのでこいつでいいやと突っ込むことに.監視ソリューションのOSSとしては
他に一部無料枠として
等がありますが,
等の理由から,Prometheus + Grafana + Alert ManagerをDockerを用いてデプロイしています(全てAnsibleでプロビジョニング).各サーバに
- Node Exporter:ホストの様々なメトリックを取得
- cAdvisor:Dockerコンテナに関するメトリクスの取得
- DCGM Exporter:GPUがある場合に導入.GPUに関するメトリクスが取れる
等を入れ,監視サーバから叩いています.各ホストに関するメトリクスを簡単にまとめてダッシュボードを作成.以下の様な感じで提供しています.どのサーバがどういったスペックなのかもここで確認できる様になっています.
アラートも設定しており,例えば10分以上ダウンしていればSlackに通知が来ます.
アラートはもっと拡充していきたいなと考えていますが,優先度が低いのでまだ後回しになっています.誰か手伝って.
情報共有・記録
これはステマですが,弊研究室はWikiシステムとしてesa.ioを導入しました.
そもそもサークルでアカデミックプラン*8を知って使い始めたのですが,使いやすい,デザインが見やすい等かなり良いです.これまではMDWiki.jsを使用していたのですが,
- Gitでcommit・pushしないといけない
- PushしたときにWeb上に自動で反映させる独自hookが大抵上手く動かない
- 上記2点も相まって誰も使ってくれない
- これ本体に認証システムがないのでApacheで特定のパス以下にLDAPを用いたベーシック認証を加えていたが,Nginxだと自前ビルドが必要で面倒臭い.
などの問題があったため,思い切って先生に提案しました.目に見えて利用率は上がりました.みんなもっと気軽に自分の知見書いて欲しいですね.
他にやりたいこと
使用中であることの明示
現在どのマシンをどのくらい使うか,他の作業との共存の可否,使い終わったか等をSlackで自己申告する様にしています.あんまりいけてないので,Alert Managerでイイカンジにならないか考えているのですが,
- Dockerを使うと基本的にプロセスはrootで動く
- 使用ユーザの特定が難しい
- Dockerコンテナ名は指定しない限りランダムになる
- コンテナ名で通知しても分からない
- 「使用している」の基準の設け方が難しい
等があり,自動化出来ていません.誰か上手いやり方を知っている人は教えて頂きたい.
自動ジョブ実行システム
現状,何か計算を実行するのはユーザの手動に頼っています.そのため,
Aさん「今日一日使います」
Bさん「あ,じゃあそのあと使わせてください(あ,じゃあ明日やるかぁ…)」
みたいな場合があり得ます.空くのは分かっていても,わざわざ終わるかどうかを監視して終わったらすぐ実行するなんて面倒なこと,締め切り間際でもしない限りやりませんよね?これを
Aさん「今ジョブ投入しました.今日中に終わると思います」
Bさん「その次投入してありまーす(明日の朝には終わってるかな?)」
みたいにできると,日中にひたすら結果待ちをする時間を省けて幸せになれるんじゃ無いかと思っています.ただ,こういうのやったことないのでどうやれば良いのか全く分かっていません.どうやるんだ…?
今後の課題
Ansibleをちゃんと使える後継者を育成することが一番大変そうです.とは言ってもそんなに難しいことはしていないので,ドキュメントをある程度残していくだけで十分(向こう数年くらいは)運用できると思っています.
理想に近づくために
共用計算マシンの整備
まずお金が足りません.重い計算を行うのに,スペックは圧倒的に足りていません.もっとスペックで殴れれば色んなことを試せるんですが,GPUメモリが全然足りていません.これについてはそもそも研究室単位で頑張ることが間違いだと思っていて,学部・大学単位で設備を揃える必要があると思っています.生物系だとたとえば質量分析器や電子顕微鏡等,高価な機材はその学部単位で所有し,各研究室が共同で使用していました.情報工学でもそろそろまともな共有マシン群が欲しい……せめてTesla K80とかが数枚載ったマシンが数台あると大分変わると思うんですが……(チラッチラッ
大学側での提供サービスの拡充
研究室Web・メール等は大学側で吸収してくれないかな……と思っています.どちらも別に研究室単位で管理する必要ないですよね?よくガバガバセキュリティでスパムの踏み台にされてる話を聞きますよ?
SMTPはリレーサーバが(おそらくスパム対策で)提供されているのですが,そもそも自分でPostfixの運用をしたくない……
更にLDAPも,大学側がActive Directoryとかで提供してくれると楽になるのにとつらい気持ちになっています.うちではWindowsマシンが一台もない,Mac等は個人が使うのでID統一の必要が無いという条件があるのでOpenLDAPで事足りていますが,Windowsを使う研究室では無理でしょう.あくまで自分の研究室が恵まれているために可能な構成だと思います.
クラウド利用は?
Google Colaboratoryは神.ただし軽いタスクに限る.
大学の予算の使い方の仕様上,従量課金制というのがとてつもなく相性が悪いです.産総研のABCIみたいな一定ポイント買い切り制ならまだ良いかも知れませんが,そもそもラボ内のマシンで四苦八苦している人がクラウドのインスタンスでどうのこうのなんて,理解出来ると思いますか?
無料でトライアンドエラーできるのがオンプレの良いところなのですが,これにお金がかかるとなって,結局「みんな怖がって使わない→クラウドインスタンスがエリクサー化」するのも嫌です.やっぱり学内共用計算マシンと,その使用方法講座みたいなのを実施するのがベストなんじゃないかなぁと.
まとめ
- 大学の計算機環境は様々な事情でレガシーの塊のところも多く,管理者がどんどん変わっていくのでカオス
- 弊研究室では古い環境を一新してAnsibleで全て整備した
- 今後求められるスペックに一研究室で対応するのは大変,大学・学部での共用計算資源で大規模な計算もできるようにしてほしい
お金が欲しいですね.
他の研究室でのプラクティスとか全然聞かないんですけど,みんな一体どうしてるんでしょう?実はみんなOpenLDAPもADも完全に理解してて,分かってないのは僕だけとか?もうみんなKubernetesで機械学習基盤組んでて,ラボメンみんなマニフェスト書けるとか?こういうの入れると良いよとか,こういうフローオススメだよとか,無限に募集しています.よろしくお願いします.
では,明日は弊サー期待の新入生が書いてくれるっぽいので楽しみにしています.ヨロシクネー!
*1:なお,弊研究室は一人一台MacBookが支給され,これをクライアントとして用いています
*2:買えているだけマシという話もある
*3:なお,ここでQNAPを選択したのは完全に失敗でした.NAS上のホームディレクトリとNFSで配信する他のサーバで利用するためのホームディレクトリを一致させると,AFP等でNASにログインしたとき,ホームディレクトリのパーミッションが777に書き換えられ,公開鍵でのsshがPermissionのエラーで弾かれるようになります. https://forum.qnap.com/viewtopic.php?t=123842
*5:sudoできるユーザは限られています.dockerグループにデフォルトで所属させ,sudo無しでの実行をサポートしているだけ
*7:弊研究室は全てSlack経由で連絡を取り合っています