インターン参加記 ~GPUクラスタ管理者への道~

はじめに

こんにちは!イノベーションセンターテクノロジー部門 GPU-K8s Projectに二週間、インターン参加させていただいた石本直也と申します。 大学院では、WebAssemblyに関するObservabilityについて研究をしています。

今回の職場体験型インターンシップでは「モダンなICTインフラを支える技術の検証・開発(クラウド, コンテナ or データ基盤領域)」をテーマとして以下のことに取り組みました。

  • GPU ServerのWorker Nodeとしての設定(cuda,containerd,NVIDIA Container Toolkit)
  • K8sクラスタへのGPU Worker Node追加
  • Ansibleでのセッティングの自動化

参考:職場体験型インターンシップとは?

ドコモが仕掛ける数多くの事業の中から厳選したポストにて、実務を体験していただきます。

業務体験を通じて通信/ICT業界の仕事が理解できるだけでなく、皆さん自身の成長を実感できるインターンシップとなっています。

現場受け入れ型インターンシップコース | インターンシップ情報 | NTTドコモ新卒採用

インターン先 GPU-K8s Projectについて

NTT ComのAIインフラ分野を牽引するテックリード的なプロジェクトで、ストレージ、GPUといったハードウェアからAIエンジニアが使うKubeflowといったAIプラットフォームOSSまで管理しています。

所属人数は10名以下ですが、扱う領域は広く運用効率化のためにK8s OperatorやKustomizeなどのOSSやAzure Arcなどのベンダー製品まで幅広くを検証しています。

以下の図は、社内向けAI基盤を構成している技術スタックを示した図です。

職場環境

フルリモートが主体の働き方を実現しているチームです。主なコミュニケーションツールとして、Slack, Google Meet, NeWorkを使用し、特にNeWorkの活用によってオフィスと遜色ない、場合によっては対面以上の働き方だと感じました。

その証拠に、函館からのリモートインターンシップでも二週間何も不自由なく参加でき、素直にすごいと感じました。

体験内容

一社員としてプロジェクトに配属され、実際に行われている業務内容を割り当てていただき社員の方のサポートの元で開発しました。その際、割り当てとなる業務内容に関しては、初日に自身の技術面や希望を話す機会を設けられそこで決定する流れでした。

私がAIインフラに関するGPUとK8sに関することがやりたいとお伝えしたところ、以下の2つを提示いただきました。その中で1番を選択し、GPU-K8s基盤へのworker node追加・その自動化に関するインターンシップを行いました。

  1. [インフラ構築と自動化]:GPU-K8s基盤へのworker node追加・その自動化
  2. [Go言語でのソフトウェア開発]:チームで内製開発中のK8s Operator の開発に参加

業務内容

GPU Worker Nodeの構築に関する調査、構築手順のドキュメント化

今回、Worker Nodeを追加するK8sクラスタは、実際にAIエンジニア向けに提供されているプロダクション基盤に追加する業務で、バグ等を踏み、業務使用されているK8sクラスタを壊す危険性がありました。

その際の影響を最小限に抑えるため、NVIDIA公式のインストールサイトや、Kubernetes.io docsを参考に一旦作業手順をNotionにまとめ、社員の方にご確認をいただき構築作業を開始しました。

GPU ServerのWorker Nodeとしての設定(cuda,containerd,NVIDIA Container Toolkit)

Notionにまとめた作業手順を参考に、設定するサーバにsshし構築しました。

まず、CUDAドライバーのインストール、Containerdのインストール、コンテナ上からGPU利用を可能とするNVIDIA Container Toolkitのインストールを行いました。

最後にサーバ上で、Contaienrdのコマンドを用いてコンテナ上からGPUが見えていることをテストしました。

ctr image pull docker.io/nvidia/cuda:11.6.2-base-ubuntu20.04

K8sクラスタへのGPU Worker Node追加

設定したサーバをK8sクラスタへ追加するために、Kubeadm、Kubelet、Kubectlをインストールしました。

追加するK8sクラスタにおいて、Control Planeでのトークン作成kubeadm token create --print-join-commandを行いました。そのトークンをもとにkubeadm joinを実行し、GPU Worker NodeをK8sクラスタへの追加を完了しました。

画像はメンテナンス中のもの

Ansibleでのセッティングの自動化

次世代のH100 GPUが登場する中で、今後同様の設定を複数回行うことが予想されます。その構築や運用に関わる負荷軽減のために構築手順のAnsible化を行いました。

インターン最終日までにAnsible によりKubeadm joinを除くGPU Worker Nodeに関する設定のコード化ができました。

その際の自身のAnsible知識レベルは、OSS等でAnsibleのスクリプトは実行したことがあるものの、スクリプトを書いたことはない状態でした。そのためGCPで検証用VMを立てる権限をいただき、業務時間中に実際にスクリプトを書きながら学習しました。

以下の図が、Ansibleを実行した際の出力結果となります。

一部shellスクリプトによる実行を挟んでいるため、全てokでなくchangeになるものが発生しているのですが、冪等性(何回設定スクリプトを実行しても同じ結果となる)は担保できました。

学んだこと、感じたこと

私がこのインターンシップを経験して、学びその過程で感じたことは、大きく分けて3つありました。

基盤運用を効率化する技術について

GPUが乗った状態の素のUbuntuOSに対して、GPUやK8sに関する設定を実施し、Ansibleによる設定の自動化までを経験したことで、実際に触った技術以外の運用技術もその役割や利用するメリットを理解できました。

Ansibleに関してはチームリポジトリへのプルリクエスト段階で、Ansibleのご経験がある社員の方からコードレビューをいただきました。自分では気づけない我流かつ荒削りになっていた部分や、よりわかりやすいディレクトリ構造や変数の使い方を学べとても良い貴重な経験になりました。

以下の図のように、運用効率化技術(AnsibleやK8s Operator)のAI基盤における使い分けについて実際に検証を通して学びました。

  • Ansible:Linux、K8s
  • K8s Operator:K8s、OSS on K8s(e.g Prometheus、Kubeflow)

AI処理に関する専用ハードウェアの重要性について

DGX A100サーバを用いて検証する中で、nvidia-smiで見た消費電力がGeForceシリーズと比べて大差がないことに疑問を感じました。そこで検証に使用しているnodeのGPU性能について知るために、NVIDIA製GPUのベンチマークについて調べてみることしました。

YouTubeの NVIDIA A100とRTX 3090のベンチマーク動画が大変参考になり、特に機械学習(ResNet50)に関する計算において、エンタープライズGPUとコンシューマGPU間で目に見えてわかる電力効率差があることにはかなり驚きました。

このことからPreferred Networks社が、MN-Coreと呼ばれる独自のハードウェアアクセラレータを開発し、計算機クラスタを構築する意図について理解できました。

参考:NVIDIA REFUSED To Send Us This - NVIDIA A100 NVIDIA A100とRTX3090のベンチマーク評価

参考:MN-Core 深層学習の学習フェーズに最適化した専用ハードウェア

その他 (Sphinxを用いてネットワーク図の作成)

大学プロジェクト活動でのドキュメントが更新されてなくて苦しんだ経験があり、それの打開策になると感じました。

スライド等で図を作成するのではなくSphinxでアーキテクチャ図を作成することで保守性をあげることができると思うので、ぜひ取り入れていきたいです。

参考:Sphinx 図を含めたドキュメントをコード管理を可能とするツール

今後取り組みたいこと・学習指針

AIモデルとハードウェア処理の関係性調査

エンタープライズGPUとコンシューマGPUでは明らかに計算特性が異なることを知り、これと機械学習モデルの関係性が気になりました。機械学習モデルの推論や学習においてモデル内部の計算処理等を追うことでの適切なハードウェアを選択できるようになりたいです。

ソフトウェアレベルでのAI処理の効率化技術調査

これまで大規模言語モデルでは、そのモデルサイズと重みの大きさからA100やA6000のような大容量のVRAMを積んだGPUが必須とされてきました。しかしFlexGenの登場によって、コンシューマGPU(2023年4月時点で多くとも24GBのVRAMを搭載)でも大規模モデルを動かすことが可能となりました。今後上記を可能とするモデル処理に関するアーキテクチャについても調査し、ハードウェアとソフトウェアの両面からAI処理を効率化を行えるエンジニアになれるよう頑張ります。

参考:FlexGen 限られた GPU メモリで大規模な言語モデルを実行するための高スループット生成エンジン

AI処理に関するハードウェアアクセラレータの調査

Preferred Networks社のMN-Core以外にも、SONYのIMX500といったCMOSセンサにAI推論機能を搭載したものが開発されています。ハードウェアアクセラレータはエッジAIの実現・普及に向けて欠かせない技術だと考えており、その検証も機会があればやっていきたいです。

参考:IMX500 世界初のAI処理機能を搭載したイメージセンサー

最後に

今回のインターンシップでは、実際にGPU基盤構築と自動化を通して実際の GPU運用効率化手法や更なるインフラ系の技術分野とその運用技術について知り、専門性を高めることができました。また、共同運営されているハイブリッドクラウドチームの方から、検証中の技術に関してお聞きし、OSSだけでなくAzure Arcといったより大規模な管理手法の理解も深まりました。 個人では触ることができない技術群で、そんな貴重機会をいただけたGPU-K8s Projectの皆さんに感謝でいっぱいです。 紀本さん、他にも業務を抱えている中でメンターとして二週間付きっきりでサポートしていただきありがとうございます!とても気さくに対応していただき、こんなこと聞いていいんだろうかと悩むことなく業務の体験・技術検証に集中できました。

GPU-K8s Projectの皆さん、上長としてサポートしてくださった松田さん、メンターとしてサポートしていただいた紀本さん、二週間本当にありがとうございました。

© NTT Communications Corporation All Rights Reserved.