富士通AIチップソフトウェアスタック面接体験記:CANN・オペレータ適配・パフォーマンスチューニングの完全評価
2年のAIチップソフトウェア経験で富士通AIチップ面接、C++/CUDA/CANN基礎、オペレータ適配パイプライン、5Dデータレイアウト、パフォーマンスチューニング方法論、オペレータライブラリシステム設計を網羅
背景紹介
まず私の状況から説明します。AIチップソフトウェアスタック開発として2年の経験があります。以前は国産AIチップ企業でオペレータ適配とパフォーマンスチューニングの仕事をしており、主にC++でオペレータを書き、CANN(HuaweiのAI計算アーキテクチャ)とCUDAの開発にも関わっていました。その後、富士通AIチップソフトウェアスタックチームが採用しているのを見て、AIチップエコシステムの構築に深く関わる機会だと感じ、履歴書を提出しました。
正直なところ、面接前は期待と緊張の両方を感じていました。期待は、富士通のAIチップは日本を代表する製品であり、このようなチームで働くことは技術的成長に極めて役立つからです。緊張は、AIチップソフトウェアスタックの開発のハードルが高く、ハードウェアアーキテクチャとソフトウェア最適化の両方を理解する必要があり、面接官の追及が非常に深いことは間違いないからです。しかし幸いなことに、前の会社で実戦経験を積んでおり、オペレータ適配、パフォーマンスチューニングなどのコア業務には馴染みがありました。以下、面接プロセスを詳しく振り返ります。
面接プロセスの振り返り
一次面接:C++ + CUDA/CANN基礎
一次面接の面接官はシニアのシステムソフトウェアエンジニアでした。まずプロジェクト経験について話し、その後技術面接が始まりました。最初にC++の基礎について聞かれ、RAII原則とスマートポインタの実装を説明するよう求められました。RAIIはオブジェクトのライフサイクルを通じてリソースを管理し、構築時にリソースを取得し、破棄時にリソースを解放する。スマートポインタはRAIIの典型的な応用であると説明しました。面接官はunique_ptrの実装について追及し、簡略版を手書きするよう求めました。ムーブコンストラクタとムーブ代入を書き、コピーコンストラクタとコピー代入を削除しました。
次にテンプレートメタプログラミングについて聞かれ、SFINAEとtype_traitsの使用を説明するよう求められました。SFINAEはテンプレート引数推論が失敗した場合にエラーを出さず、他のオーバーロードを選択する仕組みであり、type_traitsはコンパイル時型判定ツールを提供すると説明しました。面接官はenable_ifを使って整数型にのみ有効な関数を実装するよう求めました。template
次に重要な部分が来ました:CUDA/CANN基礎。面接官はCUDAとCANNのプログラミングモデルを比較するよう求めました。CUDAはNVIDIAのGPUプログラミングプラットフォームで、プログラミングモデルはSIMT(単一命令マルチスレッド)で、grid/block/threadの階層構造を持つと説明しました。CANNはHuawei AscendのAI計算アーキテクチャで、プログラミングモデルはオペレータ開発+グラフコンパイルで、Ascend Cプログラミング言語とACL(Ascend Computing Language)インターフェースを持つと説明しました。面接官はAscend CとCUDA Cの違いについて追及しました。Ascend Cはよりベクトル指向のプログラミングで、1つのコアが1つのデータブロックを処理するのに対し、CUDA Cはよりスカラー指向で、1つのスレッドが1つのデータ要素を処理すると答えました。
次にAscend AIプロセッサのアーキテクチャについて聞かれ、Da Vinciアーキテクチャのコアコンポーネントを説明するよう求められました。AI Coreは計算コアで、Cube Unit(行列計算)、Vector Unit(ベクトル計算)、Scalar Unit(スカラー制御)を含む。AI CPUは制御フローとスカラー計算を担当する。DVPPは画像と動画の前処理を担当すると説明しました。面接官はCube Unitの動作原理について追及しました。シストリックアレイに似ており、効率的な行列乗算が可能で、深層学習推論のコア計算ユニットであると説明しました。
またメモリ階層についても聞かれ、GPUとAscendのメモリアーキテクチャを比較するよう求められました。GPUにはglobal memory、shared memory、registerがある。AscendにはHBM(グローバルメモリ)、L1 buffer(shared memoryに類似)、L0 buffer(registerに類似)、UB(Unified Buffer、ベクトル計算のデータバッファ)があると説明しました。一次面接は約65分で、C++とハードウェアアーキテクチャについて非常に包括的に聞かれました。
二次面接:オペレータ適配 + パフォーマンスチューニング
二次面接はオペレータ開発チームのリーダーで、オペレータ適配とパフォーマンスチューニングの実戦能力により注目していました。まずオペレータ適配のプロセスについて聞かれ、フレームワークオペレータからハードウェアオペレータまでの完全な適配パイプラインを説明するよう求められました。いくつかのステップを説明しました:フレームワークオペレータの意味と計算ロジックの分析→ハードウェア対応オペレータタイプの決定→適配コードの作成(オペレータの分割や融合が必要な場合あり)→テストケースの作成による正確性検証→パフォーマンスチューニング。
面接官はオペレータ分割のシナリオについて追及しました。一部のフレームワークオペレータはハードウェアに直接対応する実装がなく、複数のハードウェアオペレータに分割する必要があると説明しました。例えば、FlashAttentionはAscend上でmatmul + softmax + matmulの組み合わせに分割する必要がある場合があります。面接官はさらにオペレータ融合のシナリオについて聞きました。複数の連続するオペレータを1つに融合でき、中間結果のメモリ読み書きを削減できると説明しました。例えば、Conv+BN+ReLUは1つのオペレータに融合できます。
次にパフォーマンスチューニングの方法論が重点的に聞かれました。面接官は「どうやって体系的にパフォーマンスチューニングを行いますか?」と聞きました。私のチューニングプロセスを説明しました:まずプロファイリングでボトルネックを特定(計算ボトルネックかメモリボトルネックか)→ボトルネックの原因を分析→最適化戦略を選択→最適化を実施→結果を検証。面接官はプロファイリングツールの使用について詳しく説明するよう求めました。Ascendのmsprofツールについて説明し、オペレータ実行時間、メモリ帯域利用率、計算ユニット利用率などの指標を収集できると述べました。
次に具体的な最適化ケースについて聞かれました。面接官は「あるオペレータの計算利用率が30%しかない場合、どう最適化しますか?」と聞きました。考えられる原因を分析しました:メモリ帯域ボトルネック(データが計算ユニットに十分供給されていない)、オペレータタイリングが不合理(一部のコアがアイドル)、データレイアウトが不適切(メモリアクセスが非連続)。対応する最適化ソリューション:データレイアウトの最適化(NCHW→NC1HWC0)、タイリング戦略の調整、ダブルバッファリングによるレイテンシの隠蔽。
面接官はデータレイアウトに非常に興味を持ち、5DフォーマットNC1HWC0について詳しく説明するよう求めました。AscendのAI CoreはC0粒度(通常16)で行列計算を行うため、C次元をC0の倍数にアラインする必要があり、C1 = Ceil(C/C0)となると説明しました。5Dフォーマットにより、Cube Unitはデータを効率的に読み取り、非連続メモリアクセスを回避できます。
また実践シナリオ問題もありました:LLM推論タスクがAscend上でA100の60%のパフォーマンスしか達成していない場合、どう分析し最適化するか?いくつかの次元から説明しました:オペレータ適配(最適化されていないオペレータがあるか)、メモリ管理(KV Cacheのメモリ利用)、計算スケジューリング(Cube Unitを十分に活用しているか)、データレイアウト(最適なフォーマットを使用しているか)。二次面接は約70分で、最もハードコアな面接でした。
三次面接:プロジェクト深掘り + システム設計
三次面接はテクニカルディレクターで、総合的な評価でした。まず以前のオペレータ適配プロジェクトについて詳しく説明するよう求められ、背景、課題、ソリューション、結果の次元から話しました。面接官は多くの追及をしました。「最も難しかったオペレータ適配は何か?」「適配の正確性をどう検証したか?」「パフォーマンスはどれだけ向上したか?ボトルネックはどこか?」などです。
次にシステム設計問題がありました:複数のフレームワーク(PyTorch、TensorFlow、PaddlePaddle)と複数のモデルタイプ(CV、NLP、推薦)をサポートするAIチップのオペレータライブラリを設計する。いくつかのレイヤーからソリューションを設計しました:
オペレータレイヤー:統一されたオペレータインターフェースを定義し、各オペレータに参照実装(CPU)と最適化実装(NPU/GPU)を持たせる。適配レイヤー:各フレームワークの適配プラグインを書き、フレームワークオペレータをオペレータライブラリのオペレータにマッピングする。コンパイルレイヤー:オペレータ融合とグラフ最適化をサポートし、効率的な実行計画を生成する。テストレイヤー:自動化された精度検証とパフォーマンス回帰テスト。
面接官はオペレータインターフェースの設計について追及し、汎用的なオペレータ基底クラスを定義するよう求めました。OperatorBaseを設計し、入出力記述(TensorDesc)、属性(Attrs)、計算メソッド(Compute)、形状推論メソッド(InferShape)を含めました。面接官はさらに異なるフレームワーク間のオペレータ意味の違いをどう処理するかについて聞きました。統一された中間表現(IR)を定義する必要があり、フレームワークオペレータをまずIRに変換し、IRからハードウェアオペレータにマッピングすると答えました。
また分散推論の設計についても聞かれ、マルチカード推論をサポートするシステムを設計するよう求められました。モデル並列(モデルを複数のカードに分割)とデータ並列(複数のカードが異なるリクエストを処理)の2つのモードと、パイプライン並列の設計(モデルをレイヤーごとに異なるカードに分割し、パイプラインを形成)について説明しました。
最後にキャリアプランとAIチップ開発への見解について話しました。三次面接は約60分でした。全体的に、面接官は皆非常に実務的で、純粋な理論ではなく実際の仕事から出発した質問でした。
主要質問まとめ
1. RAII原則とスマートポインタの実装、unique_ptrを手書き
2. SFINAEとtype_traits、enable_ifで型制約を実装
3. CUDAとCANNのプログラミングモデルを比較
4. Ascend CとCUDA Cの違い
5. Ascend Da Vinciアーキテクチャのコアコンポーネント
6. Cube Unitの動作原理
7. GPUとAscendのメモリアーキテクチャを比較
8. 完全なオペレータ適配パイプライン
9. オペレータ分割とオペレータ融合のシナリオ
10. パフォーマンスチューニングの方法論とプロファイリングツール
11. 計算利用率が低い場合の最適化アプローチ
12. 5DデータフォーマットNC1HWC0の原理
13. Ascend上でのLLM推論パフォーマンス最適化
14. AIチップのオペレータライブラリを設計
15. オペレータインターフェースの設計と中間表現IR
16. 異なるフレームワーク間のオペレータ意味の違いをどう処理するか
17. 分散推論のシステム設計
18. モデル並列、データ並列、パイプライン並列の設計
心得とアドバイス
1. ハードウェアアーキテクチャが基礎。AIチップソフトウェアスタックに取り組むには、基盤となるハードウェアアーキテクチャと計算モデルを理解する必要があります。面接ではDa Vinciアーキテクチャのコンポーネント、Cube Unitの原理、メモリ階層について直接聞かれます。ハードウェアを理解していないと通過は困難です。
2. オペレータ適配には実戦経験が必要。ドキュメントを読むだけでは不十分です。自分でオペレータ適配の作業を行い、フレームワークオペレータからハードウェアオペレータまでの完全なパイプラインを理解している必要があります。面接では具体的な適配ケースについて聞かれます。実戦経験がないと不利になります。
3. パフォーマンスチューニングには方法論が必要。適当に試して最適化できるわけではありません。体系的なプロファイリング→分析→最適化→検証のプロセスが必要です。面接ではパフォーマンス問題のシナリオを与えられ、原因の分析と最適化ソリューションの提案が求められます。
4. 競合の違いを理解する。面接ではAscendとNVIDIAの違いについて比較されます。ハードウェアアーキテクチャ、プログラミングモデル、ソフトウェアエコシステムの次元から明確な理解が必要です。
5. AIチップエコシステムの構築に注目する。面接ではAIチップエコシステムへの見解について聞かれます。独自の思考と洞察が必要です。この分野は急速に発展しており、アイデアを持つ人がより重視されます。
FAQ
Q:Ascend開発経験なしでこのポジションの面接を受けられますか?
A:はい、ただしCUDAまたは他のAIチップの開発経験が必要です。面接官は学習能力とハードウェアプログラミングの理解を評価します。Ascend関連の知識は入社後に学べます。
Q:AscendとNVIDIAのプログラミング体験の違いは大きいですか?
A:かなり大きいです。Ascendのプログラミングモデルはよりベクトル化とデータブロック指向ですが、NVIDIAはよりスレッドレベルのプログラミングです。ただし、コアの最適化の考え方は共通しており、ハードウェアアーキテクチャを理解すれば始めるのは難しくありません。
Q:富士通AIチップチームの労働強度はどうですか?
A:面接の印象では、チームのテンポは速いです。AIコンピューティングは競争が激しく、タスクのプレッシャーは少なくありません。しかし技術的な雰囲気は良く、技術的成長に役立ちます。
Q:AIチップソフトウェアスタック開発のキャリアの見通しはどうですか?
A:非常に有望な方向性です。AIチップは急速に発展しており、ソフトウェアスタックエンジニアへの需要は高いです。この方向の技術的障壁は高く、報酬も競争力があり、その後AIシステム、チップアーキテクチャなどの方向に進むことができます。
Q:面接でアルゴリズム問題は聞かれますか?
A:いくつか聞かれますが、重点ではありません。システム設計とエンジニアリング能力がより重視されます。中程度の難易度の問題が1-2問出る可能性があり、主にプログラミングの基礎を評価します。