HyperAIHyperAI

Command Palette

Search for a command to run...

Bi Sheng氏が開発したコンパイラコア「AscendNPU IR」がオープンソース化されました。ファーウェイのアーキテクトであるHai Lijuan氏が、その技術的な進歩について解説し、Tritonなどの通信事業者エコシステムへのサポートを強調しています。

Featured Image

8月1日HyperAIが主催する第9回Meet AI Compiler技術サロンが予定通り開催されました。北京人工知能研究院、TileRTチーム、テンセント、ファーウェイ、智源創新といった主要企業や研究機関から招かれたゲストスピーカーが、言語表現、演算子計算、推論実行、シナリオ実装など、多岐にわたる側面からAIコンパイラの協調的な進化について詳細な議論を繰り広げました。彼らは技術的な課題、実践的な解決策、業界動向に焦点を当て、AIコンパイラ技術の反復的な発展と、その産業的価値の深化に向けて、多様なアイデアと実践的な経験を提供しました。

現場で、ファーウェイのAscendNPU IRのアーキテクトであるHai Lijuan氏は、「AscendNPU IR:オープンソースのコンパイルベース、Ascendへの多言語アクセスをサポート」というテーマで自身の見解を共有しました。彼女は、AscendNPU IRコンパイラコンポーネントの全体的な技術アーキテクチャと設計思想を体系的に紹介し、Ascend 950拡張機能向けのAscendNPU IRの新機能、技術的な反復による利点、およびエコシステムコミュニティの構築について詳細に説明しました。また、オープンソースプラットフォームの中核機能と技術的な利点を分析し、複数のフロントエンド言語への適応性を実証し、開発者に対し、AscendNPU IRを用いた使いやすく、ユーザーフレンドリーで、オープンな共同開発体験を提供しました。

ハイ・リジュアン先生は、第9回AIコンパイラーミーティングに参加しました。

HyperAIは、元の意味を変えることなく、プレゼンテーションを収集・要約しました。

WeChatの公式アカウント「HyperAI」をフォローし、「0801 AI Compiler」というキーワードで返信すると、認定講師のプレゼンテーション用PPTを入手できます。

Tritonプログラミングはなぜ効率的で使いやすいのでしょうか?

プログラミング言語として、Tritonは効率的かつユーザーフレンドリーです。では、この開発上の利点はどこから来るのでしょうか?

簡単に言うと、TritonはPythonのような構文を使用し、ブロックレベルタイルプログラミングを提供します。これにより、開発者は抽象カーネルのハードウェアメモリ、命令、パイプライン処理、その他の操作といった低レベルの詳細から解放され、オペレータ開発のハードルが下がり、開発効率が向上します。

TritonのTileプログラミングモデルは、C++などの異種プログラミング言語と比較して、従来のプログラミング言語よりも多くの利点を提供します。これにより、開発者は演算子のデータ分割にさらに注力できるようになり、テンソル演算の抽象化と論理式に集中できます。タイルレベルのプログラミング抽象化に基づき、ユーザーが管理するコア間データスケジューリングを除き、コア内メモリアクセスのマージと共有メモリの管理はコンパイラによって自動的に完了されます。

さらに重要なことに、Triton方言と公式のTriton GPUコンパイラはどちらもMLIRに基づいたマルチレベルIR抽象化を採用しており、さまざまなハードウェア向けに詳細な最適化を可能にしています。

AscendNPU IRは引き続きアーキテクチャの最適化を進めています。

AscendNPU IRは、MLIR上に構築されたAscendハードウェアのタイルレベル抽象化であり、基盤となるコンパイル最適化機能を提供します。そのアーキテクチャは下図に示されています。AscendNPU IRはLLVM IRと下位レベルでインターフェース接続し、最終的にはAscendハードウェアバイナリにコンパイルされます。Tritonなどの上位層のサードパーティ製言語やコンパイラをAscendNPU IRに統合することで、Ascendとの互換性を実現できます。

AscendNPU IRの主な技術的特徴まず、Ascend IRは、コア内のメモリやデータ転送ユニットなどのさまざまなリソースを抽象化することで、Ascendハードウェアのボトムアップ抽象化を実現します。次に、タイルレベルの抽象演算子を提供することで、基盤となるハードウェアに対する統一されたクロスアーキテクチャサポートを可能にし、A2/A3からAscend 950 SIMDおよびSIMTまでの最新のハードウェアアーキテクチャに対応します。MLIRのオープン性と拡張性に基づき、AscendNPU IRはより多くの上位レイヤー言語からのアクセスをサポートします。

下の図は、Ascend A2/A3 から今年リリースされた最新の Ascend 950 ハードウェアまでの AscendNPU IR コンパイル アーキテクチャの設計を示しています。左側は、昨年リリースされた AscendNPU IR アーキテクチャの最初のバージョンを示しており、主に 2 つのレイヤーで構成されています。上層はハードウェアに依存しないレイヤーである HFusion で、主に多次元融合最適化を実行します。その役割は、コミュニティ Linalg と拡張 OP に基づいており、さまざまな標準化された方言に上位接続し、データ型と OP の正規化前処理と、自動スケジュールなどの融合最適化を完了します。

ハードウェア関連レイヤーであるHIVMは、主にAscendハードウェアの高レベル抽象化を実行し、コアマッピングコンパイル、オンチップメモリマッピング、および処理ユニットマッピングを順次実行します。

最初のステップはカーネルマッピングのコンパイルです。これには、キューブカーネルとベクターカーネルが含まれます。高レベルのタイル表現はカーネルを介してマッピングされ、キューブカーネルはキューブカーネルに、ベクターカーネルはベクターカーネルに割り当てられます。これらの間のデータ通信、データ同期、および中間ワークスペースメモリ管理はすべてコンパイラによって自動的に実行され、コンパイラはCVパイプライン並列処理のための高次最適化も実行します。

次は、オンチップメモリマッピングです。 CubeコアとVectorコアはどちらも独自のオンチップメモリを備えています。Ascendハードウェア上でTensorを動作させるには、論理Tensorデータを対応する物理メモリに推論するとともに、Cube固有のフラクタル行列フォーマットを導出する必要があります。オンチップメモリの割り当てはすべてコンパイラによって自動的に処理されます。

最も低いレベルは、処理ユニットのマッピングです。パイプライン同期により、タイミングと並列処理の効率が確保されます。ベクトル化とテンソル量子化により、高性能なハードウェア命令が最終的なコンパイル最適化を完了します。

図の右側には、昨年のA2/A3から今年のAscend 950アーキテクチャへの主な変更点が示されています。上位のハードウェア非依存レイヤーHFusionはほぼ安定しており、主な拡張はハードウェア依存レイヤーHIVMによるもので、Membased SIMDからRegbased SIMDおよびSIMTのサポートへと拡張されています。従来、CV融合コンパイルは、グローバルメモリを介したCubeコアとVectorコア間の相互作用を伴っていましたが、Ascend 950では、より効率的なデータ相互作用のために、より緊密に結合したアプローチが実装されています。

全体として、新しいアーキテクチャは依然として安定した2層構造を維持しているが、アーキテクチャの変更に伴い、タイルコンパイルは大幅にアップグレードされた。

まず、ベクトルレジスタベースSIMDアーキテクチャの進化を見ていきましょう。メモリベースSIMDでは、ベクトル演算は統合バッファを使用してチップ上で実行され、命令はチップ上のメモリから直接実行されます。Ascend 950では、高速レジスタを使用して演算が実行され、レジスタ層が追加されます。バックエンドの最適化、特にベクトル演算に関しては、コンパイルプロセスが次のように変更されます。

まず、レジスタベースシステムのためのベクトル化について説明します。 テンソル演算は、ベクトル化されたパーティショニングによって固定幅レジスタ命令にマッピングされます。データはオンチップメモリからレジスタにロードされ、レジスタに基づいて計算が実行された後、データはオンチップメモリに再び格納されます。このようにして、ロード・計算・ストアのループが形成されます。

第二に、レジスタの粒度融合。 オンチップメモリへのデータのロードとアンロードを繰り返す操作は非効率的です。レジスタに基づくディープフュージョンでは、データをレジスタに格納できます。複数のTriton操作を単一のループに統合することで、ロードストレージを削減できます。そのためには、さまざまな検索アルゴリズムとコストモデルを活用して、より優れたフュージョン戦略を開発する必要があります。

第三に、AVE方言の抽象化。  AscendのユーザーフレンドリーなVectorダイアレクト拡張機能は、ハードウェアマスクの差異を隠蔽し、マスクの解析と導出を可能にします。Hardware Vector Loadは、パス内最適化機能を豊富に提供します。パス内操作を有効にすることで、複数の命令を1つの命令に結合できます。これらはすべて、Regbase SIMDダイアレクト向けに特別に設計された最適化機能です。

Ascend 950 ハードウェアは、下の図で緑色で示されているように、SIMT ユニットのサポートを追加しました。これにより、Vector コアは、純粋な SIMD、純粋な SIMT、および SIMT と SIMD を交互に実行するハイブリッド実行という 3 つの異なる演算モードを使用できます。SIMT は個別のメモリ アクセス シナリオを高速化でき、高密度演算では SIMD を利用してより積極的なベクトル最適化を行うことができます。

ベクトルSIMDまたはSIMTコンパイルを実行する前に、コンパイルプロセスでは融合解析と最適化が行われます。どのコンポーネントがSIMTに適しているかを特定し、それらを抽出して個別のSIMTおよびSIMDコンパイルを行い、最後にそれらを結合してベクトル演算全体を実行できるようにします。このプロセスでは、SIMTとSIMDの両方がモデル化され、解析されます。

アテンション型演算子と密接に関連しているのが、CVカーネルのアップグレードと変更である。 A2/A3プロセッサでは、CubeとVectorはチップ上で直接接続されておらず、チップ外のグローバルメモリを介してのみ通信できます。しかし、Ascend 950では、図中の赤色で示されているように、Cubeの結果はL0Cに格納されており、Vectorのチップ内メモリに直接コピーできます。逆に、Vectorの計算結果もCubeのチップ内メモリに直接コピーして、後続のCube計算に利用できます。要するに、コンピュータビジョンにおける緊密な連携と高速なデータ交換は、アテンション性能の最適化に大きく貢献します。

CV演算子を最適化するための重要な技術の一つが、CVパイプラインの並列処理です。Ascend AutomationのCVパイプラインは、レイテンシをより効果的に隠蔽し、CubeコアとVectorコアの演算能力を最大限に活用できます。

もう一つの重要な最適化は、自動サブタイリングです。Ascend CubeコアとVectorコアは1:2の比率で構成されており、2つのVectorコアが1つのCubeコアに対応します。コンパイラはVector演算を1:2のブロック分割で実行するため、各Vectorコアがデータの半分を同時に計算でき、計算処理が高速化されます。

コンパイラの機能一般化作業の最新バージョン

本稿では、新たにリリースされたAscendNPU IRバージョンの重要な汎化作業について紹介する。

まず、CVデータの相互作用について。 キューブ演算およびベクトル演算に関わるコア間データ相互作用は、コンパイラによって自動的に実行されます。Triton演算子によるキューブ演算およびベクトル演算は、制御フローの異なるブランチに分散される場合があり、コンパイルおよび解析プロセスが複雑になります。パターンマッチによる単純な命令挿入は実現不可能です。上記の例では、2つのブランチがそれぞれキューブ演算とベクトル演算を実行します。CVデータ相互作用は、機能の完全性を確保するために、複雑な制御フロー導出をサポートする必要があります。

新バージョンでは、InsertCVLoadStore のキーパスの解析プロセスが強化され、複雑な制御フロー全体にわたるグローバル導出を通じて CV データとの相互作用が実現されます。まず、決定論的なアンカーポイントが挿入されます。行列乗算演算は L1 に入力され、L0C に出力されます。一方、ベクトル演算は入力と出力が両方とも UB に配置されます。次に、初期アンカーポイントに基づいて、型変換演算が挿入され、制御フロー全体にわたる上方および下方への導出と伝播が実行されます。伝播後、すべてのオペランドテンソルのメモリレベルが明確に定義されます。

上記の例に示すように、Tensor は元々メモリ階層のセマンティクスを持っていません。型キャストされた Op を挿入すると、Vector コアの UB メモリに制限されます。その下には Cube コアの L1 メモリがあります。派生処理中に競合が発生し、メモリ階層が不整合になるため、データ接続を確立するために Load-Store または copy ステートメントを挿入する必要があります。処理方法は世代によって若干異なります。A2/A3 Cube および Vector では、データ接続を確立するためにグローバルメモリ Load-Store を挿入する必要がありますが、Ascend 950 ではオンチップデータコピーによってデータ接続を確立します。

第二に、マルチバッファは複雑な制御フローを強化します。 MultiBufferは、パイプライン処理と並列処理にとって不可欠な前提条件です。では、TensorをMultiBufferに変換するにはどうすればよいでしょうか?

従来のソリューションはforループのみをサポートしていました。ループの反復処理中、MultiBufferはforループの反復変数を再利用し、この反復変数に基づいてバッファスロットを回転させていました。このソリューションは、他のwhileループやネストされた制御フローをサポートできないという制約がありました。そこで、独立したバッファカウンタを導入しました。このカウンタは、分岐ループを通じた複雑な制御フローを追跡し、スロットの変更を正確に記録します。

さらに、マルチバッファ変換の一貫性を確保するために、CubeとVectorの両方が2つまたは3つのバッファを割り当てるなどのメモリ割り当て操作を同時に実行できるように、alloc操作はCubeとVectorの共通ループ層で可視である必要があります。

3つ目は、Ascend演算子の最適化と密接に関連するマルチコア変換であるAutoBlockifyです。CUDAまたはTriton演算子を作成する場合、通常はコードを多数のロジックブロックに分割し、ハードウェアスケジューリングによって実行します。Ascendは、繰り返し実行されるラウンドロビンスケジューリングに大きく依存しています。異なるロジックコアを単一のforループに統合し、ソフトウェアループスケジューリングによってパフォーマンスを最適化します。さらに、マルチバッファやパイプライン処理などの高度な最適化手法をforループ内に適用することで、初期状態でのパフォーマンスをさらに向上させることができます。

第四:CVパイプライン。例えば、FlashAttentionオペレータは、CubeとVectorという2つのコアに分散された4つのタスクを持ち、それぞれ独立して実行されます。これらのタスクは順次実行されるため、CubeとVectorでの計算は互いに待機する必要があります。コンパイル処理中にMultiBufferを使用することで、CubeとVectorが可能な限り早期に実行されるようにし、パイプラインによる並列処理の高速化効果を実現できます。

まず、C/V境界点を特定し、コードセグメントをキューブスコープとベクタースコープに正確に分割します。次に、マルチバッファを適用して、アンロール、スキュー、ダイナミックなど、さまざまな戦略モードを含むスケジューリングアルゴリズムに基づいたパイプライン並列変換を実行します。計算負荷に応じて、最適なパイプライン並列モードを選択できます。

第5回:CV 1対2の引き分け。2つのベクトルカーネルと1つのキューブカーネルが連携して、生のテンソルデータを可能な限り正確に半分に分割処理し、効率的なベクトル計算を実現します。理想的には、高次元空間で平行軸を見つけて、グローバルな分割処理を実行します。しかし、候補となる軸は転置、ブロードキャスト、縮小などの計算操作を受ける可能性があり、CV 1:2分割の複雑さが増します。

まず、グローバルな次元解析を実行して、分割に最適な軸を特定します。分割軸が決定したら、ストア操作の末尾から分割操作開始マーカーを挿入し、そこからルートノードまでバブリングアップして、最終的に完全な分割を実現します。分割できない複雑なシナリオが発生した場合は、保守的な1対1の未分割状態に戻します。

さらに、複雑なシナリオでは、単に平行軸を分割するだけではパフォーマンスが不十分な場合があります。例えば、FB8低精度アテンションアルゴリズムはベクトル負荷が高く、縮小軸の分割と縮小が必要です。2つのベクトルカーネルは直接データを交換できないため、中間縮小結果をグローバルメモリを介して交換し、二次縮小を行うことで、全体の縮小と分割を完了する必要があります。加えて、動的な形状などのシナリオでは、拡張されたCV 1:2分割手法も必要となります。

Triton-AscendとAscendNPU IRはオープンソースであり、共同開発されています。

AscendNPU IRは、Ascendコミュニティでオープンソースとして公開されました。画像内のQRコードをスキャンして、オープンソースプロジェクトをフォローしてください。AscendNPU IRコミュニティSIGの隔週ミーティングは、コミュニティ活動カレンダーに掲載されています。開発者の皆様は、毎週の議論テーマと議事録を事前にご確認ください。

Ascendコミュニティは、オープンソースのインターンシッププロジェクトとコミュニティタスクを開始し、開発者がエコシステム構築に参加できる機会を提供しています。最新のタスク状況はこちらで確認でき、タスクを申し込むことも可能です。これらのコミュニティタスクは難易度が異なりますので、ご自身の能力に合わせて選択し、ご参加ください。

オープンソースのインターンシップやコミュニティタスクは、AscendNPU IRおよびTriton-Ascendオープンソースリポジトリのホームページにあるクイックリンクからアクセスできます。タスクの申請プロセスも含まれています。各ユーザーは一度に1つのタスクのみ申請できます。コミュニティタスクは定期的に更新され、開発プロセスは常にインタラクティブかつオープンな状態を維持します。各タスクには魅力的な報酬が用意されていますので、どなたでも自由に選択できます。

Ascend開発環境をお持ちでない参加者向けに、コミュニティは無料のAscendコンピューティングプラットフォームであるHiDevLab(https://hidevlab.huawei.com/home)を提供しています。開発者は登録してコンピューティングパワーを申請でき、申請が承認されると、デフォルトで100時間の無料コンピューティング時間が割り当てられます。コミュニティタスクを受諾した開発者は、タスクの開発と検証を完了するためにコンピューティングパワーを申請できます。

ご清聴ありがとうございました!