運用環境でもハイパフォーマンスな AI
ディープラーニング ・ モデルの最適化を容易に
ディープラーニング向け Habana* Gaudi2* プロセッサー

Issue

50
2022

目次

注目記事

The Parallel Universe2

編集者からのメッセージ3

運用環境でもハイパフォーマンスな AI

6

ディープラーニング ・ モデルの最適化を容易に

19

ディープラーニング向け Habana* Gaudi2* プロセッサー

23

インテル® ニューラル ・ コンプレッサーによる PyTorch* 推論の高速化

29

インテル® AI アナリティクス ・ ツールキット、 MLflow*、 AWS* を使用した MLOps* 環境の構築

持続可能な AI、 一度に 1 つのモデルを最適化

高効率の Gaudi* アーキテクチャーがさらに進化

精度を損なわずに AI 推論をスピードアップ

PyTorch* 向けインテル® エクステンションによる PyTorch* の高速化

35

今すぐ Python* を高速化

43

PyTorch* のパフォーマンスを向上するオープンソースの拡張機能

アクセラレーター ・アーキテクチャーのカンブリア爆発に備える© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

3

編集者からのメッセージ
Henry A. Gabb インテル コーポレーション シニア主席エンジニア

HPC と並列コンピューティング分野で長年の経験があり、 並列プログラミングに関する記事を多数出版しています。 『Developing Multithreaded Applications: A Platform Consistent Approach』の 編 集 者 / 共 著 者 で、 イ ン テル と Microsoft* に よる Universal Parallel Computing ResearchCenters のプログラム ・ マネージャーを務めました。

インテル® Innovation が開催されましたインテル® デベロッパー ・フォーラムは、 私のインテルでの初期のキャリアに大きな影響を与えたので、 廃止された
ときは残念に思いました。 このメッセージの執筆中に開催されたインテル® Innovation 2022 は、 インテル®
デベロッパー ・フォーラムを思い起こさせるものでした。 重要な発表、 テクニカルセッション、 トラック、 そして同僚や共同研究者、 顧客との交流など、 盛りだくさんの内容でした。 アジェンダ、 スピーカー情報、 内容の詳細は上記のリンクに掲載されているので、 ここではカンファレンスの全貌を振り返ることはしません。 1 日目と2 日目のハイライトでは、 次のような大きな発表が行われました。
• インテル® デベロッパー ・ クラウドでは、 第 4 世代インテル® Xeon® スケーラブル ・プロセッサーやインテル®
データセンター GPU など、 最新および将来のハードウェア ・プラットフォームを、 発売前に開発やテストに利用できます。
• 新しいインテル® Geti™ プラットフォームにより、企業はコンピューター・ビジョン AI を迅速に開発して展開できます。
• インテルは、 広範なアプリケーションに適応可能なプラグ型コパッケージ ・フォトニクスを実現する、 将来の量産システムインパッケージ （SiP） 機能のプレビューを発表しました。
• オープンな oneAPI 仕様は、 今後インテルの子会社である Codeplay によって管理されます。
• インテルは、 ヘルスケアのユースケース向けの 3 つの新しい AI リファレンス ・ キットを発表しました。

本号では、 持続可能な AI、 モデルの最適化、 ディープラーニングのパフォーマンスに注目しています。 注目記
事 「運用環境でもハイパフォーマンスな AI」 では、 AI ワークフローで見落とされがちなコンポーネントである
MLOps* を取り上げます。 インテル® AI アナリティクス ・ ツールキット、 MLflow*、 AWS* を使用した MLOps*
環境の構築方法を紹介します。 AI の利用やモデルの規模が拡大するにつれて、 持続可能な AI が重要なトピッ
クになっています。 2 つ目の記事 「ディープラーニング ・ モデルの最適化を容易に」 ではこれについて説明します。 続く 「ディープラーニング向け Habana* Gaudi2* プロセッサー」 では、 すでに効率的なこのアーキテク
チャーの改良について、 それを裏付ける印象的な MLPerf* ベンチマーク結果とともに解説します。 「インテル®
ニューラル ・ コンプレッサーによる PyTorch* 推論の高速化」 では、 CPU や GPU 上でディープラーニングの推論のモデルサイズを小さくして高速化する、新しいオープンソースの Python* ライブラリーを説明します。最後に、「PyTorch* 向けインテル® エクステンションによる PyTorch* の高速化」 では、 パフォーマンスを大幅に向上
するインテルのオープンソース拡張を紹介します。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

4

そこから、 Python* を使用したヘテロジニアス ・ コンピューティングに目を向けます。 「今すぐ Python* を高速化」 では、 アクセラレーター ・アーキテクチャーのカンブリア爆発に備えるため、 我々の名誉編集長である James
Reinders が手引きします。
コードの現代化、 ビジュアル ・コンピューティング、 データセンターとクラウド ・コンピューティング、 データサイエンス、 システムと IoT 開発、 oneAPI を利用したヘテロジニアス並列コンピューティング向けのインテル ・ソリューションの詳細は、 Tech.Decoded （英語） を参照してください。
Henry A. Gabb
2022 年 10 月

ポッドキャスト

災害管理の使命と科学的発見

アニメーター、 デジタルコンテンツ制作者、 建築エンジニア、 熟練したゲーマーの皆さん、インテル® oneAPI ベース & レンダリング ・ ツールキットでビジュアライゼーションの限界に挑戦してみてください。 詳細 >© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

聴く （英語）将来に通用するコード
プロプライエタリーの壁を超えて成長

複数の言語をサポートし、 ヘテロジニアス計算パフォーマンスを実現する、単一のオープンなプログラミング ・ モデルで、 コードの幅を広げましょう。
オープンスタンダードに根ざしたインテル® oneAPI は、 クロスアーキテクチャーのライブラリー、コンパイラー、 ツールを提供し、 コードをより多くのハードウェアに対応させ、比類ないパフォーマンスを実現します。
インテル® oneAPI の詳細

The Parallel Universe

6

運用環境でもハイパフォーマンスな AI
インテル® AI アナリティクス ・ ツールキット、 MLflow*、
AWS* を使用した MLOps* 環境の構築

Eduardo Alvarez インテル コーポレーション シニア AI ソリューション ・ エンジニア

マシンラーニング （ML） アプリケーションを研究開発環境から運用環境に移行する際に、 MLOps* は重要なコンポーネントでありながら見落とされがちです。 この課題には、 通常、 ケースバイケースで取り組むのがベストです。 この記事では、 オープンソースのツールを使ってクラウド上に MLOps* 環境を構築し、 ハイパフォーマン
スなモデルの開発と展開を確実に行う一般的なブループリントを提示します （図 1）。 ML コンポーネントのバッ
クボーンとして、 インテル® AI アナリティクス ・ ツールキット、 特にインテル® ディストリビューションの Python* とPyTorch* 向けインテル® エクステンションを活用して、 トレーニングと推論のパフォーマンスを向上します。 この
記事を読むことで、 モデルの実験、 管理、 展開を高速に行う仕組みを、 サーバーレスのクラウド環境で自由に使えるようになります。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

7

図 1. 本記事で紹介する MLOps* ブループリントを利用したソリューションのサーバーサイド、 運用サイド、
クライアント ・ サイドの各コンポーネントの役割を担う各種ツール。 ここでは、 Docker*、 GitHub*、およびフロントエンド ・ コンポーネントは取り上げません。

MLOps *—モデルの目標パフォーマンス
MLOps* は、 ML と DevOps の俊敏性と回復力を結びつけ、 ML アセットを CI/CD パイプラインに関連付けて、運用環境への安定した展開を実現します。 これにより、 モデルの鮮度とドリフトの懸念に対応した、 統一された
リリースプロセスを構築します。 適切な MLOps* パイプラインがなければ、 ML アプリケーション ・ エンジニア
は高品質の ML アセットを事業部門に提供できず、研究開発部門の中で大きな科学実験を行っているだけになってしまいます。
MLOps* への投資が進まない主な理由は、 モデル / データドリフトの影響と、 それが運用環境のアプリケーションにどのような影響を与えるかについての理解が不十分であることに起因しています。 モデルドリフトとは、 データの変化や入力変数と出力変数の関係によって、 モデルのパフォーマンスが低下することを指します。 データドリフトは
モデルドリフトの一種で、 独立変数の性質が変化するものです。 データドリフトの例として、 季節性によるデータの変化、 消費者の嗜好の変化、 新製品の追加などが挙げられます。 確立された MLOps* パイプラインは、
データ環境に最適なモデルを展開することで、 これらの影響を軽減できます。 目標は、 運用環境で常に最もパフォーマンスの高いモデルを導入することです。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

8

MLOps* ソリューション—MLflow*
MLflow* は、 オープンソースの ML ライフサイクル管理プラットフォームです （図 2）。 MLflow* は、 クラウド上で動作するあらゆる ML ライブラリーと連携可能で、 ビッグデータのワークフローにも容易に対応できる拡張性を備えています。 MLflow* は 4 つの部分から構成されています。
• MLflow* Tracking は、 モデルのトレーニング ・プロセスのコード、 データ、 設定、 結果を記録し、 照会できるよ
うにします。
• MLflow* Projects は、 データ ・ サイエンス ・コードをパッケージ化して再展開することで、 あらゆるプラットフォー
ムで再現性を確保します。
• MLflow* Models は、 さまざまな環境にモデルを容易に展開するための API です。
• MLflow* Model Registry は、 中央のリポジトリーにモデルを保存し、 アノテーションを付け、 管理できるようにします。

この記事では、 チーム全体で利用可能なパスワードで保護された MLflow* サーバーをセットアップする方法を説明します。

図 2. MLflow* のトラッキングとレジストリー ・ コンポーネント （出典 ： Databricks）

MLflow* サーバー—AWS* ソリューション ・ インフラストラクチャー設計
ここで紹介する MLOps* 環境のクラウド ・ コンポーネントは単純です。 ML モデルをトレーニング、 トラッキング、登録、 展開するには、 インフラストラクチャーが必要です。 図 3 にクラウド ・ ソリューションを示します。 ローカルホスト （または別のリモートホスト） は、 さまざまな MLflow* API を使用して、 リモートホストのリソースと通信します。 リモートホストは、 トラッキング ・ サーバーをホストし、 データベースやオブジェクト ・ ストレージと通信する役割を担います。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

9

図 3. リモートホストとローカルホストのコンポーネントを示す AWS* ソリューション ・ アーキテクチャー

このアーキテクチャーをセットアップする手順は後述します。 ここでは、 AWS* の無料利用枠を利用しますが、これは運用環境の構築には推奨しません。
表 1 は、 製品デモのセットアップに使用したリソースを示しています。 このブループリントをベースに、 ニーズに応じて調整できます。 選択したインスタンスはすべて第 3 世代インテル® Xeon® スケーラブル ・プロセッサーで、
vCPU と GiB 容量が異なります。

表 1. 汎用環境でテストされた、 ブループリントの各種コンポーネントの AWS* サービスとリソース要件© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

10

マシンラーニング ・フレームワーク—インテル® AI アナリティクス ・ ツー
ルキット
MLOps* 環境では、 モデルを構築するため、 ハイパフォーマンスの ML フレームワークのセットが必要です。
インテル® AI アナリティクス ・ ツールキットは、 低レベルの計算を最適化するため、 oneAPI ライブラリーを使用して構築された Python* ツールおよびフレームワークを提供します。 このツールキットを活用することで、 インテル®
XPU でハイパフォーマンスなディープラーニング・トレーニングを提供し、 高速な推論をワークフローに統合できる、
MLOps* 環境を実現できます。
表 2 は、 エンドツーエンドの ML ライフサイクルと、 MLOps* ブループリントにおける各コンポーネントの説明です。
インテル® AI アナリティクス ・ ツールキットがパフォーマンスの向上と計算コストの軽減を支援しているコンポーネントは、 太字で強調表示されています。

表 2. エンドツーエンドの ML ライフサイクル ・ ソリューション

conda 環境のセットアップは本題から外れますが、 参考までに以下に環境設定スクリプト （aikit_ipex.yml）
を示します。 次のコマンドで適切な conda 環境を作成できます。
conda env create -f aikit_ipex.yml© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

MLflow* リモートホストのセットアップ
AWS* EC2* を使用したホストマシンのセットアップ
1. AWS* マネジメント ・ コンソールにアクセスし、 新しい EC2* インスタンスを起動します。 ここでは Amazon*
Linux* を選択していますが、 リストからほかの Linux* や Windows* を使用することもできます。
2. キーペアがない場合は、 新規に作成します。 キーペアは、 SSH でインスタンスにアクセスし、 サーバーの各種設定を行うのに必要です。
3. 新しいセキュリティー ・ グループを作成し、 任意の場所 （0.0.0.0/0） からの SSH、 HTTPS、 HTTP トラフィックを許可します。 ただし、 最大限のセキュリティーを確保するため、 インターネット全体に接続を開放するのではなく、サーバーにアクセスできる特定の IP をセーフリストに登録することを推奨します。
4. サーバーの EC2* ストレージボリュームは、 このインスタンスをほかの用途に使用する予定がない限り、 8 ～ 16GB
より大きくする必要はありません。 このインスタンスは、 MLflow* 専用サーバーにすることを推奨します。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

11

The Parallel Universe

12

S3 オブジェクト ・ ストアのセットアップ
S3 バケットは、 モデルのアーティファクト、 環境設定、 コードバージョン、 データバージョンの保存に使用できます。
ここに、 MLflow* ML 管理パイプラインの重要な部分がすべて含まれています。
1. AWS* マネジメント ・コンソールから新しいバケットを作成します。
2. ACL を有効にし、 すべてのパブリックアクセスをブロックしたままにします。 ACL を有効にすることで、 適切な認証情報を持つほかの AWS* アカウントからバケット内のオブジェクトにアクセスできるようになります。

AWS* RDS の PostgreSQL データベースのセットアップ
MLflow* ワークフローのこのコンポーネントは、 実行、 パラメーター、 メトリック、 タグ、 ノート、 オブジェクト ・ストアへのパス、 およびその他のメタデータを保存します。
1. AWS* マネジメント ・ コンソールからデータベースを作成します。 今回は PostgreSQL データベースを使用します。
無料利用枠を選択します。
2. データベースに名前を付け、マスターユーザー名を割り当て、このアカウントのパスワードを指定します。 この情報は、
MLflow* サーバーを起動する際に使用します。
3. インスタンスの種類を選択します。 MLflow* サーバーを経由する予定のトラフィック量 （つまり、 モデルやデータのクエリー回数） に応じて、 より強力なインスタンスが必要になる場合があります。
4. ストレージも指定する必要があります。 これもトラッキングする必要があるメタデータの量に依存します。 モデル
やアーティファクトはここに保存されないので、 大きなスペースは必要ないでしょう。
5. 仮想プライベート ・ クラスターの外からデータベースの読み書きができるように、 パブリックアクセスは必須です。
次に、 セキュリティー ・ グループを使用して、 セーフリスト IP を指定します。
6. 任 意の 場 所 （0.0.0.0/0） または 特定の IP か ら のすべ ての TCP トラフィック を 許 可 する受 信 規 則 を持 つ
セキュリティー ・ グループを作成する必要があります。
7. RDS を起動します。

AWS* CLI をインストールして SSH でインスタンスにアクセスする
AWS* CLI は、 コマンドラインから AWS* リソースを制御するツールです。 こちらのリンク （英語） にアクセスして、 AWS* ウェブサイトから CLI をインストールできます。 AWS* CLI をインストールすると、 S3 オブジェクト ・ストアへの書き込みを許可する AWS* 認証情報を自分のマシンに設定できます。 これは、MLflow* をスクリプト、
ノートブック、 API に組込む際に必要になります。
1. EC2* インスタンスのダッシュボードから、 MLflow* EC2* インスタンスを選択し、 [Connect] をクリックします。
2. [SSH] クライアント ・ タブに移動し、 プロンプトの下部からクリップボードに SSH の例をコピーします。
3. プロンプトに SSH コマンドを貼り付けます。 ここでは、 .pem ファイルを保存したフォルダーから Git Bash を使用
しています。
4. 以下の依存関係をインストールします。
sudo pip3 install mlflow[extras] psycopg2-binary boto3
sudo yum install httpd-tools
sudo amazon-Linux-extras install nginx1© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

5. nginx ユーザーを作成して、 パスワードを設定します。
sudo htpasswd -c /etc/nginx/.htpasswd testuser
6. 最後に、 nginx リバースプロキシーをポート 5000 に設定します。
sudo nano /etc/nginx/nginx.conf

nano を使って、 nginx の設定ファイルを編集し、 リバースプロキシーに関する以下の情報を追加します。

最終的なスクリプトは、 図 4 に示すコンソールの nano 出力のようになるはずです。

図 4. サーバーの場所を追加した後のプロキシーサーバー nginx.conf の nano 出力© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

13

The Parallel Universe

14

nginx と MLflow* サーバーの起動
nginx リバース ・プロキシー ・ サーバーを起動し、 MLflow* のリモートサーバーを実行できるようになりました。
この手順では、 AWS* マネジメント ・コンソールからいくつかの情報を取得する必要があります。
1. nginx サーバーを起動します。
sudo service nginx start
2. MLflow* サーバーを起動し、 オブジェクト ・ ストレージ （S3） とバックエンド ・ ストレージ （RDS） のすべてのコンポーネントを設定します。

この情報はどこにあるのでしょうか ?
• MASTERUSERNAME—PostgreSQL RDS DB に設定したユーザー名です。
• YOURPASSWORD—PostgreSQL RDS DB に設定したパスワードです。
• YOUR-DATABASE-ENDPOINT—これは、 AWS* マネジメント ・コンソール内の RDS DB 情報で見つけることができます。
• BUCKETNAME—S3 バケットの名前です。

このコマンドを実行すると、 大量の出力が表示され、 ワーカー ID と pid に関する情報が得られます。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

15

MLflow* サーバーのシャットダウンまたはバックグラウンドで実行
MLflow* サーバーをシャットダウンする場合は、 以下のコマンドを使用します。
sudo fuser -k <port>/tcp

ターミナルを閉じてバックグラウンドでサーバーの実行を継続する場合は、 MLflow* サーバーの起動コマンドに
nohup と & を追加します。

ブラウザーから MLflow* UI にアクセスする
MLflow* サーバーのインフラストラクチャーのセットアップが完了したので、 コマンドラインやスクリプトから、
MLflow* サーバーを利用できます。 MLflow* の UI にアクセスするには、 EC2* インスタンスの IPV4 パブリック
IP アドレスが必要です。
1. IPV4 パブリック IP をコピー & ペーストします （これは、 EC2* マネジメント ・ コンソール内で見つけることができます）。 IP アドレスの前に、 http:// があることを確認します。
2. nginx のユーザー名とパスワードを入力するプロンプトが表示されます。
3. これで、 MLflow* の UI から実験やモデルにアクセスし、 管理できるようになりました。

コードへの MLflow* の追加とインテル ® AI リファレンス ・ キットの例
MLflow* トラッキング ・ サーバー
まず、 開発環境内で MLflow* の認証情報を追加し、 トラッキング URI を設定する必要があります。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

16

VGG16 モデルを使用して画像を分類するモデルをトレーニングしてみましょう （残りのソースコードは、 インテル®
AI リファレンス ・ キットのビジュアル品質検査リポジトリー （英語） を参照してください）。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

17

MLflow* モデル ・ レジストリー
ML の実験を行い、 運用環境に投入する価値のあるいくつかのモデルを定義したら、 それらを登録し、 展開するためステージングできます。 以下のブロックでは、 モデルの実行 ID と実験名を使用して、 MLflow* モデル ・
レジストリーにモデルを追加しています。 そして、 このモデルを 「運用」 環境に移動してロードし、 異常な錠剤を特定する予測サービスとして使用しています。

図 5 から、 運用環境に展開したモデルが非常にうまく機能していることが分かります。

図 5. 異常な錠剤 （左と中央） と正常な錠剤 （右） を識別するために展開されたモデル© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

18

まとめ
この記事では、 インテル® AI アナリティクス ・ ツールキットを利用して、 高速なエンドツーエンドの ML パイプラインを構築する、 一般的なクラウドベースの MLOps* 環境を紹介しました。 このパイプラインは、 運用環境で常に最もパフォーマンスの高いモデルを提供するための重要な第一歩です。 この記事の目的は、 ありふれた環境を提案することではありません。 パイプラインを実装するには、 計算、 セキュリティー、 および一般的なアプリケーションの要件を考慮し、 どこに変更を加える必要があるかを認識することが不可欠です。

『oneAPI GPU 最 適 化 ガイド』 を入手して、 並列化からカーネル、 メモリーに至るまで最高のパフォーマンスを実現してください。
インテル® oneAPI ベース ・ ツールキットは、さまざまなアーキテクチャーに対応したハイ
パフォーマンスなアプリケーションやソリュー
ションの開発を可能にします。

詳細

Github* に ア ク セ ス し てoneAPI サンプルコードを取得しましょう。
詳細© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

Github* にアクセス （英語）The Parallel Universe

19

ディープラーニング ・モデルの最適化を容易に持続可能な AI、 一度に 1 つのモデルを最適化

Tony Mongkolsmai インテル コーポレーション テクニカル ・ エバンジェリスト

ディープラーニングの AI モデルは過去 10 年で大きく成長し、 この急速な成長とともに計算リソース要件も急増しています。 モデルが大きくなるほど、 多くの計算リソースが必要となり、 さまざまなメモリー階層への読み書きやシステム間でのビットの移動も多くなります

持続可能な AI とディープラーニングの最適化が重要な理由
2020 年 1 月、 Wired は 「AI Can Do Great Things – if It Doesn’ t Burn the Planet （AI は素晴らしいことができる ― もし地球を燃やさないなら）」 （英語） という記事を掲載しました。 最近では、 MIT Technology
Review が 「These Simple Changes Can Make AI Research More Energy Efficient （AI 研究のエネルギー
効率を改善するシンプルな変更点）」 （英語） という記事で、 Allen Institute for AI、 Microsoft、 Hugging Face、© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

20

およびいくつかの大学が提携して行っている、 再生可能エネルギーが利用できる時間にワークロードを実行する
ことで排出量を削減する方法を理解する取り組みについて取り上げています。 私は以前、 持続可能な AI について考え、 従来のディープラーニング ・ ニューラル ・ ネットワークに代わるいくつかのハードウェア / ソフトウェアについて、「注目の新しい AI テクノロジー」 （英語） を執筆しました。 特に持続可能性に注目したわけではありませんが、これらのテクノロジーはすべて、 特定のドメインでディープラーニング ・ モデルと同様の問題を、 より少ない計算リソースで解決できる可能性があります。
モデル最適化の素晴らしいところは、パフォーマンスを向上するだけでなく、コストや電力消費を軽減できることです。
以下の手法を利用することで、 興味深い問題をより速く、 より安く、 より持続可能な方法で解決することができます。

一般的なディープラーニングの最適化
知識蒸留
その名が示すように、 知識蒸留の目的は、 あるモデルから機能を取り出し、 それを別のモデルに移行することです。
ある問題に対する解決策であるモデルを活用することで、 同じタスクを実行できる、 それほど複雑でない類似のモデルを作成できます。 もちろん、 蒸留を成功させるには、 より小さなモデルが同様の精度で動作する必要があります。 このテーマに関する最近の多くの文献では、 知識蒸留の学習モデルがどのように機能するかを説明するため、 教師と生徒を例えとして使用しています。 大きな教師モデルは、 小さな生徒モデルのトレーニングを支援するため、 応答、 特徴、 関係に基づく知識という 3 つの異なる方法を使用します （図 1）。

図 1. 知識はどこから来るのか ? （出典 ： Knowledge Distillation ： A Survey （英語））© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

21

応答に基づく知識は、 教師モデルの出力を見て生徒モデルをトレーニングするのに役立ちます。 これは、 より小さなモデルを作成する最も一般的な方法です。 大きなモデルの出力から、 同じまたは類似の入力に基づく小さなモデルで同じ出力の動作を得ようとします。
特徴に基づく知識は、 中間層に教師モデルの振る舞いを模倣させることで、 生徒モデルのトレーニングを支援します。 モデルの中間特徴の活性化を捉えることは容易とは限らないため、 困難な場合もあります。 しかし、 この分野では中間特徴の振る舞いを捉えるさまざまな取り組みが行われており、 特徴に基づく知識蒸留を可能にしています。
関係に基づく知識の伝達は、 教師ネットワークでは、 ネットワークの著しく異なる部分の出力が連携して出力を促進する可能性があるという考えに基づいています。 これは、 トレーニングを支援するアルゴリズムを定義するのに直感的とは言えませんが、 基本的な考え方は、 一般に特徴マップとして知られているノードのさまざまなグループを受け取り、 親の特徴マップと同様の出力を提供するように生徒ノードをトレーニングします。
これら 3 つの手法を組み合わせることで、非常に大きなモデルをより小さな表現に移行できることが示されています。
その中で最も有名な DistilBERT （英語） は、 「BERT と比較して 97% の言語理解度を維持しながら、 40%
小さいモデルで 60% の高速化」 を実現できます。

量子化
ディープラーニングの最適化で最も知られているのは、 おそらく量子化でしょう。 量子化とは、 32 ビットや 64 ビッ
ト浮動小数点表現のような高精度の数値形式でトレーニングしたモデルを、 低精度の数値形式 （通常は 8 ビット
整数 （INT8）） のニューラル ・ ネットワークで機能させることです。 量子化にはいくつかのアプローチがあります。
1 つは、 最初のモデルをトレーニングした後に量子化を行う方法です。 その後、 元のモデル内の重みをスケーリングして新しいモデルを生成することで、 後続の INT8 モデルを計算できます。 このアプローチは、 微調整した
後に最適化する既存のモデルに対して実行できるという利点があります。 もう 1 つの方法は、最初のトレーニング・
プロセスの一部として量子化を含めることです。 このプロセスは通常、 トレーニング後に計算された INT8 モデル
よりも精度の高い INT8 モデルを作成できますが、 モデル ・ トレーニング ・ システムの作成が複雑になります。
どちらの場合も、 INT8 表現を使用することで、 モデルサイズを大幅に縮小し、 メモリーと計算の要件も低く抑えられます。 多くの場合、 これらは TensorFlow* 公式サイトの 「量子化認識トレーニング」 に記載されているように、精度を全く、 あるいはほとんど低下させることなく行うことができます。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

22

最適化を容易により小さく、 効率的なモデルを作成するアプローチを適切に実行するには、 多岐にわたる複雑な実世界の解決策が必要です。 これらのトピックについては多くの研究論文があり、 これらのソリューションを一般化するアプ
ローチについても多くの研究が行われています。 TensorFlow* と PyTorch* はどちらも、 量子化プロセスを簡素化するいくつかの量子化 API を提供しています。 Keras の 知識蒸留 （英語） には、 素晴らしい TensorFlow*の例があります。 PyTorch* については、 サンプルコードは少し古いですが、 「教師と生徒の知識蒸留による
PyTorch* モデルの圧縮の紹介」 （英語） という記事があります。
これらの手法を組み合わせて最適化されたモデルを生成することは、 簡単な作業ではありません。 モデルを最適化する簡素化されたワークフローを提供するため、 インテルは最近、 インテル® AI アナリティクス・ツールキット （英語） の一部としてインテル® ニューラル ・コンプレッサー （英語） をリリースしました。 CPU と GPU に対応したこのオープンソースの Python* ライブラリーは、 最適化のセットアップとプロセスを大幅に簡素化し、 自動化します。 TensorFlow*、 PyTorch*、 MXNet*、 ONNX* をサポートしているため、 このライブラリーは、 多くの大規模モデルを、 より少ないハードウェア ・ リソースで実行できる、 小さな最適化されたモデルへと迅速に移行するのに役立つでしょう。 ［編集者注 ： PyTorch* でこのライブラリーを活用する方法の詳細については、 本号の「インテル® ニューラル ・ コンプレッサーによる PyTorch* 推論の高速化」 を参照してください。］
ユース ケースや す で に使 用 して い るフレ ームワ ー ク に よ って は、 ほ か の 選 択 肢 も あ り ま す。 例 え ば、
OpenVINO™ （英語） などを使用している場合、ニューラル・ネットワーク圧縮フレームワーク （英語） や トレー
ニング後の最適化ツール （英語） など、 フレームワークの関連ソリューションを利用できます。 もちろん、 最良の選択肢は、 すでに使用しているフレームワークや SDK と連携可能なツールを使用することです。

まとめ
ディープラーニング・モデルは、 多くの業界でソリューションの重要な構成要素となっています。 この傾向が続く中、モデルのサイズを縮小し、 以前よりも高速に効率良く実行するモデルの圧縮と最適化は不可欠です。 これらの手法により、消費電力が大幅に軽減されますが、その中核にあるのはニューラル・ネットワークです。 コミュニティー
として、 消費電力を軽減しつつ、 同時にイノベーションを推進する方法を見つけることは、 非常に大きな課題であり、また必須事項でもあります。 将来的には、 AI を活用し続けながら、 計算量と消費電力を指数関数的に削減できるようなパラダイムシフトが起こるかどうか、 またどのように起こるのかに期待しています。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

23

ディープラーニング向け
Habana* Gaudi2*
プロセッサー
高効率の Gaudi* アーキテクチャーがさらに進化

Chen Levkovich Habana Labs 主席ソフトウェア製品マネージャー

2022 年 5 月に開催されたインテル® Vision 2022 において、 インテルの関連会社である Habana は、 トレー
ニング ・ パフォーマンスが大幅に向上した第 2 世代ディープラーニング ・プロセッサー 「Gaudi2*」 （図 1） を発表しました。 高効率な第 1 世代 Gaudi* アーキテクチャーをベースに、 AWS* EC2* DL1 クラウド ・ イン
スタンスやオンプレミスの Supermicro Gaudi* AI Training Server でコスト ・ パフォーマンスを最大 40%
向上します。 プロセスを 16nm から 7nm に縮小し、 AI にカスタマイズされたテンソル ・プロセッサー ・ コアを
8 から 24 に増やし、 FP8 サポートを追加し、 メディア圧縮エンジンを統合しています。 Gaudi2* のパッケージ
メモリーは 3 倍になり、 HBM2e 96GB、 帯域幅 2.45TB/ 秒になりました。 これらの進化により、 一般的な
コンピューター ・ ビジョンや自然言語処理モデルにおいて、 NVIDIA* A100 80G と比較して高いスループットを実現します （図 2 と図 3）。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

24

図 1. Gaudi2* アーキテクチャー

図 2. ResNet50 トレーニング ・ スループットの比較。 システム構成 ： https://github.com/HabanaAI/Model-References/
tree/master/TensorFlow/computer_vision/Resnets/resnet_keras （英語）。 Habana* SynapseAI* コンテナー ： https://vault.habana.ai/ui/repos/tree/General/gaudi-docker/1.6.0/ubuntu20.04/habanalabs/tensorflow-installer-tf-cpu-2.9.1（英語）。 Habana* Gaudi* パフォーマンス ： https://developer.habana.ai/resources/habana-training-models （英語）。
結果は異なることがあります。 NVIDIA* A100/V100 パフォーマンスの出典 ： https://ngc.nvidia.com/catalog/resources/
nvidia:resnet_50_v1_5_for_tensorflow/performance （英語） で公表されている NVIDIA DGX* A100-40G と NVIDIA
DGX* V100-32G の結果。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

25

図 3. BERT-L プレトレーニング段階 1 と 2 のスループットの比較。 システム構成 ： A100-80GB ： Habana による測定値。
Azure* インスタンス Standard_ND96amsr_A100_v4 で単一の A100-80GB と NVIDIA* NGC の TF docker 22.03-tf2py3 を使用して測定 （段階 1 ： Seq len=128、 BS=312、 accu steps=256。 段階 2 ： seq len=512、 BS=40、 accu
steps=768）。 A100-40GB ： Habana による測定値。 NVIDIA DGX* A100 で単一の A100-40GB と NVIDIA* NGC の TF
docker 22.03-tf2-py3 を使用して測定 （段階 1 ： Seq len=128、 BS=64、 accu steps=1024。 段階 2 ： seq len=512、BS=16、 accu steps=2048）。 V100-32GB ： Habana による測定値。 NVIDIA p3dn.24xlarge で単一の V100-32GB とNVIDIA* NGC の TF docker 21.12-tf2-py3 を使用して測定 （段階 1： Seq len=128、 BS=64、 accu steps=1024。 段階 2 ：seq len=512、 BS=8、 accu steps=4096）。 Gaudi2* ： Habana による測定値。 Gaudi2*-HLS システムで単一の Gaudi2*と SynapseAI* TF docker 1.5.0 を使用して測定 （段階 1 ： Seq len=128、 BS=64、 accu steps=1024。 段階 2 ： seq
len=512、 BS=16、 accu steps=2048）。 結果は異なることがあります。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

26

100Gb の RoCE2 （RDMA over Converged Ethernet） ポートは、 第 1 世代 Gaudi* の 10 個から、 Gaudi2*
で 24 個に増え、 トレーニング ・ パフォーマンスをコスト効率良く簡単にスケールアウトできるようになりました。
各 Gaudi2* の 21 のポートは、 サーバー内のほかの 7 つのプロセッサーに All-to-All のノンブロッキング構成で接続するためのものです （図 4）。 各プロセッサーのポートのうち 3 つはスケールアウト専用で、 8 枚構成のGaudi* サーバーである HLS-Gaudi2* は 2.4Tb のネットワーク ・ スループットを提供します。 システム設計を簡素化するため、Habana では 8 枚構成の Gaudi2* ベースボードも提供しています。 オンチップの RoCE により、ディープラーニング ・ クラスターの要件に合わせて、 1 台から 1000 台までの Gaudi2* システムを簡単に構成できます。 また、 業界標準のイーサネットでシステムを実装することで、 Gaudi2* はイーサネット・スイッチとネットワー
ク機器の選択肢を広げ、 さらなるコスト削減を可能にします。 また、 ネットワーク・インターフェイス・コントローラー・ポートをオンチップにすることにより、 部品点数と総システムコストを削減します。

図 4. Gaudi2* ネットワーク構成

Gaudi2* は、 前世代と同様に、 ディープラーニング ・ モデル開発向けに最適化された Habana* SynapseAI*
Software Suite で開発者をサポートし、 GPU ベースのモデルから Gaudi* ハードウェアへの移行を容易にします（図 5）。 SynapseAI* は、 TensorFlow* と PyTorch* フレームワーク、 および 50 以上のコンピューター ・ ビジョ
ンと自然言語処理のリファレンス ・ モデルを統合しており、 開発者向けのドキュメントやツール、 ハウツーコンテン
ツ、 コミュニティー・フォーラム、 リファレンス・モデルやモデルのロードマップは、 Habana* GitHub* リポジトリー
で提供されます。 2 行のコードを追加するだけでモデルの移行を開始できます。 独自のカーネルをプログラミン
グする熟練ユーザー向けに Habana は完全なツールキットを提供しています。 SynapseAI* は、 Gaudi2* 上でのモデルのトレーニングと、インテル® Xeon® プロセッサー、 Habana* Greco*、 Gaudi2* を含むあらゆるターゲッ
ト上での推論をサポートしています。 また、 SynapseAI* は、 トランスフォーマー ・ モデル ・ リポジトリーとツールを持つ Hugging Face*、 Grid.ai Pytorch Lightning、 cnvrg.io MLOps ソフトウェアといったエコシステム・
パートナーと統合されています。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

27

図 5. Habana* SynapseAI* Software Suite による簡素化されたモデルの構築と移行

Gaudi2* の発表から 10 日後、 Habana チームは MLPerf* 業界ベンチマークで 6 月に公表するパフォーマンス
結果を提出しました。 Gaudi2* の結果は、 トレーニング時間を劇的に向上し、 Habana が 2022 年 5 月に提出した MLPerf* ベンチマーク結果は、 ビジョン （ResNet-50） モデルと言語 （BERT） モデルの両方で、 8 カー
ド搭載サーバーにおいて NVIDIA* A100-80G の結果を上回りました （図 6 と図 7）。 Gaudi2* は、 NVIDIA*
A100-80GB と比較して ResNet-50 で 36%、 Dell* A100-40GB 8 アクセラレーター搭載サーバーと比較して ResNet-50 と BERT の両方で 45% のトレーニング時間短縮を達成しました。 Gaudi2* は、 第 1 世代のGaudi* と比較して、 ResNet-50 で 3 倍、 BERT で 4.7 倍のトレーニング・スループットの高速化を達成しました。
これらの成果は、 Gaudi* のハードウェアおよびソフトウェアの進化によるものです。

図 6. ResNet-50 トレーニングの MLPerf* ベンチマーク結果。
出典 ： https://mlcommons.org/en/training-normal-20 （英語） （2022 年 6 月）

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

28

図 7. BERT トレーニングの MLPerf* ベンチマーク結果。
出典 ： https://mlcommons.org/en/training-normal-20 （英語） （2022 年 6 月）

両世代の Gaudi* プロセッサーのパフォーマンスは、 特別なソフトウェア操作なしに達成されており、 Habana の
商用ソフトウェア ・スタックと同じ標準の設定で得られます。 そのため、 誰でも Habana の商用ソフトウェアを使用
して、Gaudi* または Gaudi2* システムで MLPerf* と同等の結果を達成できるでしょう。 どちらの世代の Gaudi* も、非常に優れたディープラーニング効率を実現するように設計されており、 Habana は非常に競争力のある価格を維持しながら優れたパフォーマンスを提供します。
Habana* Gaudi* と Gaudi2* の詳細については、 https://habana.ai/training （英語） を参照してください。

インテル® DPC++ 互換性ツール

CUDA* アプリケーションを標準ベースのデータ並列 C++ コードに移行© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

詳細 （英語）The Parallel Universe

29

インテル® ニューラル ・
コンプレッサーによる
PyTorch* 推論の高速化
精度を損なわずに AI 推論をスピードアップ

Feng Tian インテル コーポレーション AI テクニカルリード
Haihao Shen インテル コーポレーション AI アーキテクト
Huma Abidi インテル コーポレーション AI ソフトウェア ・ エンジニアリング ・ マネージャー
Chandan Damannagari インテル コーポレーション AI ソフトウェア製品マーケティング ・ ディレクター

インテル® ニューラル ・コンプレッサー （英語） は、 CPU と GPU 上でディープラーニング （DL） の推論のモデルサ
イズを小さくして高速化する、 オープンソースの Python* ライブラリーです （図 1）。 量子化、 プルーニング、 知識
蒸留などの一般的なネットワーク圧縮技術に対して、 複数の DL フレームワークにわたる統一されたインターフェイスを提供します。 このツールは、 ユーザーが最適な量子化モデルを素早く見つけられるように、 精度を意識した自動チューニングをサポートしています。 また、 事前に定義された目標を使用してプルーニングしたモデルを生成するため、 異なるウェイト ・プルーニング ・アルゴリズムを実装し、 教師モデルから生徒モデルへの知識の蒸留を支援します。 インテル ® ニューラル ・コンプレッサーは、 フレームワーク間の相互運用性を高めるため、 ONNX* ランタ
イムに加えて、TensorFlow*、 PyTorch*、 MXNet* などのフレームワーク向けに API を提供しています。 ここでは、PyTorch* モデルでこのツールを使用する利点に注目します。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe30

図 1. インテル® ニューラル ・ コンプレッサー

インテル® ニューラル ・コンプレッサーは PyTorch* の量子化を拡張し、 量子化と自動混合精度、 精度を考慮した
チューニング向けの高度なレシピを提供します。 PyTorch* モデルを入力として受け取り、 最適なモデルを生成します。 量子化機能は、 標準の PyTorch* 量子化 API をベースに構築されており、 モデルレベルからオペレーター ・レベルまでのきめ細かい量子化粒度をサポートするため、 独自の変更を加えています。 このアプローチにより、手動でチューニングをすることなく、 より高い精度を得ることができます。
さらに、 PyTorch* 自動混合精度機能を拡張し、 第 3 世代インテル® Xeon® スケーラブル ・プロセッサーでは、
BF16 と FP32 に加えて INT8 をサポートしています。 まず、 量子化可能なオペレーターをすべて FP32 から INT8に変換し、 BF16 カーネルが PyTorch* でサポートされ、 ベースとなるハードウェアで高速化されている場合は、残りの FP32 オペレーターを BF16 に変換します （図 2）。

図 2. 自動混合精度© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

31

インテル® ニューラル ・コンプレッサーは、 量子化の生産性を高めるため、 精度を考慮した自動チューニング ・メカ
ニズムをサポートしています。 まず、 量子化粒度 （per_tensor または per_channel）、 量子化スキーム （対称または非対称）、 量子化データ型 （u8 または s8）、キャリブレーション手法 （最小値 - 最大値または KL 発散） など、
量子化機能についてフレームワークに問い合わせ （図 3）、 次に各オペレーターでサポートされているデータ型を
問い合わせます。 結果に応じて、 ツールは量子化設定の異なるセットからなるチューニング空間全体を生成し、チューニングの繰り返しを開始します。 量子化設定の各セットについて、 キャリブレーション、 量子化、 評価を行い、評価が目標精度に達すると、 ツールはチューニング ・プロセスを終了し、 量子化モデルを生成します。

図 3. 精度を意識した自動チューニング

プルーニングでは、 主に非構造化および構造化ウェイト ・プルーニングとフィルター ・プルーニングに注目します。
非構造化プルーニングは、 トレーニング中に重みの大きさが事前定義されたしきい値未満になった場合、 マグニ
チュード ・アルゴリズムを使用して重みを削除します。 構造化プルーニングは、 実験的なタイル単位のスパースカー
ネルを実装し、 スパースモデルのパフォーマンスを向上させ、 フィルター ・プルーニングは、 勾配によって計算された重要度スコアに応じて、モデル内のヘッド、中間層、 隠れ状態を削除する勾配に基づくアルゴリズムを実装します。
インテル® ニューラル・コンプレッサーは、 知識蒸留アルゴリズムも実装しており、 大きな 「教師」 モデルから小さな「生徒」 モデルへ、 妥当性を損なうことなく知識を伝達します （図 4）。 両モデルには同じ入力が与えられ、 生徒
モデルはその結果を教師および正しい結果ラベルの両方と比較しながら学習します。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

32

図 4. 知識蒸留アルゴリズム

次の例は、 インテル® ニューラル・コンプレッサーを使用して自然言語処理モデルを量子化する方法を示しています。
# config.yaml
model:
name: distilbert
framework: pytorch_fx
tuning:accuracy_criterion:
relative: 0.01
# main.py
import torch
import numpy as np
from transformers import (AutoModelForSequenceClassification,
AutoTokenizer)
model_name = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModelForSequenceClassification.from_pretrained(
model_name,)© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

33# キャリブレーション・データローダー
class CalibDataLoader(object):def __init__(self):
self.tokenizer = AutoTokenizer.from_pretrained(model_name)self.sequence = "Shanghai is a beautiful city!"
self.encoded_input = self.tokenizer(
self.sequence,
return_tensors='pt')
self.label = 1 # negative sentence: 0; positive sentence: 1
self.batch_size = 1
def __iter__(self):yield self.encoded_input, self.label# 評価関数def eval_func(model):output = model(**calib_dataloader.encoded_input)
print("Output: ", output.logits.detach().numpy())
emotion_type = np.argmax(output.logits.detach().numpy())
return 1 if emotion_type == calib_dataloader.label else 0# 量子化from neural_compressor.experimental import Quantization
quantizer = Quantization('./config.yaml')quantizer.model = model
quantizer.calib_dataloader = CalibDataLoader()quantizer.eval_func = eval_func
q_model = quantizer.fit()

生成される混合精度モデルは、 低精度カーネルと使用するハードウェアによって異なります （例 ： 第 3 世代インテル®
Xeon® スケーラブル ・プロセッサー上の INT8/BF16/FP32 混合精度モデル）。

パフォーマンス結果
インテル® ニューラル・コンプレッサーは、インテル® Xeon® Platinum 8380 プロセッサー上で 400 以上のサンプル（英語）を検証し、最小限の精度損失で 2.2 倍のパフォーマンス向上を達成しました（表 1）。検証されたモデルの詳細は、こちら （英語） を参照してください。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

34

表 1. インテル® ニューラル ・ コンプレッサーのパフォーマンス結果。 システム構成 ： 2022 年 6 月 10 日現在のインテル社内での測定値。 プロセッサー：2x インテル® Xeon® Platinum 8380 プロセッサー @ 2.30GHz、40 コア /80 スレッド、インテル® ターボ・ブー
スト ・ テクノロジー有効、 インテル® ハイパースレッディング ・ テクノロジー有効。 メモリー ： 256GB （16x16GB DDR4 3200MT/秒）。 ストレージ ： インテル® SSD x1。 NIC ： 2x イーサネット ・ コントローラー 10G X550T。 BIOS ： SE5C6200.86B.0022.
D64.2105220049 （ucode:0xd0002b1）。 OS ： Ubuntu* 20.04.1 LTS。 カーネル ： 5.4.0–42-generic。 バッチサイズ ： 1。
インスタンスごとのコア数 ： 4。

インテル® ニューラル ・ コンプレッサー （英語） は、 一般的なニューラル ・ ネットワーク圧縮アプローチに適用可
能な自動チューニング機構と使いやすい API により、 生産性を向上し、 精度の損失を低減することを目的としています。 インテルでは、 より多くの圧縮レシピを追加し、 それらを組み合わせて最適なモデルを生成することで、このツールを継続的に改善しています。 ぜひ、 インテル® ニューラル ・コンプレッサーをお試しいただき、 GitHub*
リポジトリー （英語） からフィードバックを提供してください。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

35

PyTorch* 向けインテル®
エクステンションによる
PyTorch* の高速化
PyTorch* のパフォーマンスを向上するオープンソースの拡張機能

Fan Zhao インテル コーポレーション エンジニアリング ・ マネージャー
Jiong Gong インテル コーポレーション 主席エンジニア
Eikan Wang インテル コーポレーション AI ソフトウェア ・ テクニカル ・ リード

インテルのエンジニアは、 PyTorch* オープンソース・コミュニティーと協力して、 ディープラーニング （DL） のトレーニングと推論のパフォーマンス向上に取り組んでいます。 PyTorch* 向けインテル® エクステンションは、 インテル®
プロセッサー上で DL パフォーマンスを最適化するオープンソース拡張です。 この最適化の多くは、 最終的に将来の PyTorch* メインライン ・ リリースに含まれる予定ですが、 この拡張機能を利用することで、 PyTorch* ユーザー
は最新の機能と最適化をいち早く入手できます。 CPU に加えて、 近い将来インテル® GPU もサポートされる予定です。
PyTorch* 向けインテル® エクステンションは、命令モードとグラフモードの両方を最適化します（図 1）。 最適化は、
PyTorch* の操作、 グラフ、 ランタイムを対象としています。 最適化された操作やカーネルは、 PyTorch* のディス
パッチ ・メカニズムを通じて登録されます。 実行中、 PyTorch* 向けインテル® エクステンションは ATen 操作のサブセットを最適化された操作でオーバーライドし、 一般的なユースケース向けのカスタム操作とオプティマイザーを© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe36

追加で提供します。 グラフモードでは、 パフォーマンスを最大化するため、 追加のグラフ最適化パスが適用されます。 ランタイムの最適化は、 ランタイム拡張モジュールにカプセル化されており、 ユーザーがスレッドランタイム
を細かく制御できるように、 いくつかの PyTorch* フロントエンド API が用意されています。

図 1. PyTorch* 向けインテル ® エクステンション

最適化の概要メモリーレイアウトはビジョン関連の操作にとって基本的な最適化です。 入力テンソルに適切なメモリー ・フォー
マットを使用することで、 PyTorch* モデルのパフォーマンスを大幅に向上できます。 「Channels last memory
format （チャネル ・ ラスト ・メモリー ・フォーマット）」 は、 一般に複数のハードウェア ・ バックエンドに利点をもたらします。
• PyTorch* のベータ版チャネル ・ ラスト ・メモリー ・フォーマット （英語）
• 効率的な PyTorch*: テンソル ・メモリー ・フォーマットの重要性 （英語）• メモリー ・フォーマットを理解する （英語）

これはインテル® プロセッサーにも当てはまります。 PyTorch* 向けインテル® エクステンションは、 次に示す
「チャネル ・ ラスト ・ メモリー ・フォーマット」 を使用することを推奨します。
model = model.to(memory_format=torch.channels_last)
input = input.to(memory_format=torch.channels_last)© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

37

oneAPI ディープ ・ ニューラル ・ ネットワーク ・ ライブラリー （oneDNN）（英語） では、 ベクトル化とキャッシュの再利用を向上するため、 重みにブロック ・ メモリー ・ レイアウトを導入しています。 実行時の変換を避けるため、
oneDNN 操作の実行前に、重みを事前定義された最適なブロック・フォーマットに変換します。 この手法は「Weight
Prepacking （重みのプレパッケージ化）」 と呼ばれ、 ユーザーが PyTorch* 向けインテル® エクステンションで提供される ipex.optimize フロントエンド API を呼び出すと、 推論とトレーニングの両方で有効になります。
PyTorch* 向けインテル® エクステンションは、 DLRM のような推薦モデルで使用される Fused Interaction（融合相互作用） や Merged Embedding Bag （マージ埋め込みバッグ）、 物体検出ワークロードの ROIAlignや FrozenBatchNorm など、 よく利用されるトポロジーを高速化するカスタマイズ操作をいくつか提供しています。
オプティマイザーはトレーニング ・ パフォーマンスに大きく影響するため、 PyTorch* 向けインテル® エクステン
ションでは、 高度にチューニングされた融合オプティマイザーと分割オプティマイザーを提供しています。 Lamb、
Adagrad、 SGD の融合カーネルは ipex.optimize フロントエンドで提供されるため、 ユーザーはモデルコー
ドを変更する必要がありません。 このカーネルは、 重み更新ステップで、 モデルのパラメーターとその勾配に関連する一連のメモリー依存の操作を融合し、 データをメモリーから再ロードすることなくキャッシュに常駐させます。
今後のリリースでより多くの融合オプティマイザーを提供できるように取り組んでいます。
BF16 混合精度のトレーニングは、 計算の高速化、 メモリー帯域幅とメモリー使用量の軽減により、 パフォーマン
スを大幅に向上します。 しかし、 トレーニングの後半になると、 重みの更新が小さくなりすぎて、 蓄積されなくなります。 一般に、重みのマスターコピーは FP32 で保持されますが、これは 2 倍のメモリー量を必要とします。 メモリー
使用量の増加は、 推薦モデルのように多くの重みを必要とするワークロードに負担をかけるため、 BF16 トレーニ
ングには「分割」最適化を適用しています。 FP32 パラメーターを上半分（上位 16 ビット）と下半分（下位 16 ビット）に分割します。 上半分は、 BF16 で表した数値と全く同じように見えます。 下半分は、 精度を保つために保持されます。 前方および後方伝播を行う場合、 上半分はインテル® CPU のネイティブ BF16 サポートの恩恵を受けることができます。 パラメーター更新の際には、 上半分と下半分を連結してパラメーターを FP32 に戻すことで、 精度の低下を回避します。
数値精度を下げることの有効性は、 ディープラーニングの実践者たちによって実証されています。 16 ビット乗算器と 32 ビット ・アキュムレーターを使用することで、 精度を落とさずにトレーニングと推論のパフォーマンスを向上できます。 8 ビット乗算器と 32 ビット ・アキュムレーターの組み合わせも、 一部の推論ワークロードでは有効です。
精度を下げると、 2 つの利点が得られます。 1 つは、 乗累算のスループットが向上することで、 計算依存の操作のパフォーマンスが向上します。 もう 1 つは、 フットプリントが小さいため、 メモリー階層内のメモリー・トランザクショ
ンが減少し、 メモリー帯域幅依存の操作のパフォーマンスが向上します。
インテルは、 第 3 世代インテル® Xeon® スケーラブル ・プロセッサーにおいて、 インテル® アドバンスト ・ ベクト
ル ・ エクステンション 512 （インテル® AVX-512） の BF16 → FP32 FMA （Fused Multiply-Add） 命令およびFP32 → BF16 変換命令によるネイティブ BF16 をサポートし、 理論演算スループットを FP32 FMA と比較して2 倍に向上しました。 BF16 は、 次世代のインテル® Xeon® スケーラブル ・プロセッサーのインテル® アドバンスト ・
マトリクス ・エクステンション （インテル® AMX） 命令セットにより、 さらに高速化される予定です。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe38

量子化とは、 ディープ・ネットワークの重みと活性化の数値精度を下げて、 情報を圧縮することを指します。 パラメー
ター情報を FP32 から INT8 に変換することで、モデルが小さくなり、メモリーと計算の要件を大幅に軽減できます。
インテルは、 第 2 世代インテル® Xeon® スケーラブル ・プロセッサーでインテル® AVX-512 VNNI 命令セット
拡張を導入しました。 これは INT8 データの計算を高速化し、 より高いスループットを実現します。 PyTorch* は、モデルを量子化するいくつかの異なるアプローチを提供しています （「PyTorch* の実用的な量子化 （英語） を参照してください）。
融合操作などのグラフ最適化は、 全体の計算とメモリー帯域幅を最適化することで、 カーネル実装のパフォーマンスを最大限に引き出します。 PyTorch* 向けインテル® エクステンションは、 oneDNN の融合機能と PyTorch*
向けインテル® エクステンションの特殊な融合カーネルを利用して、 TorchScript IR をベースにした融合パスを適用します。 この最適化は、ユーザーに対して完全に透過です。 定数の畳み込みはコンパイル時のグラフ最適化で、定数入力を持つ操作を事前計算された定数ノードで置き換えます。 推論における畳み込み + BatchNorm 畳み込みは、 多くのモデルで無視できないパフォーマンスの利点をもたらします。 ユーザーは、 ipex.optimize フロントエンド API からこの利点を得ることができます。 インテルは、 PyTorch* NNC （Neural Network Compiler） と連携して融合機能を構成するため、 PyTorch* コミュニティーと協力して、 両者の長所を引き出す努力をしています。

例
PyTorch* 向けインテル® エクステンションは、 Python* プログラムではモジュールとして、 C++ プログラムではライブラリーとしてロードできます。 ユーザーは最小限のコード変更で、 すべての利点を得られます。 以下にいくつかの例を示します。 その他の例は、 チュートリアル （英語） に掲載されています。

BF16 トレーニング...
import torch...
model = Model()model = model.to(memory_format=torch.channels_last)
criterion = ...
optimizer = ...
model.train()#################### コード変更 ####################
import intel_extension_for_pytorch as ipex
model, optimizer = ipex.optimize(model, optimizer=optimizer, dtype=torch.bfloat16)######################################################...
with torch.cpu.amp.autocast():# Setting memory_format to torch.channels_last could improve performance# with 4D input data.
data = data.to(memory_format=torch.channels_last)
optimizer.zero_grad()output = model(data)
loss = ...
loss.backward()...

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

BF16 推論...
import torch...
model = Model()model = model.to(memory_format=torch.channels_last)model.eval()#################### コード変更 ####################
import intel_extension_for_pytorch as ipex
model = ipex.optimize(model, dtype=torch.bfloat16)######################################################...
with torch.cpu.amp.autocast(),torch.no_grad():# Setting memory_format to torch.channels_last could improve performance# with 4D input data.
data = data.to(memory_format=torch.channels_last)model = torch.jit.trace(model, data)
model = torch.jit.freeze(model)
with torch.no_grad():output = model(data)...

INT8 推論―キャリブレーション
import os
import torchmodel = Model()model.eval()data = torch.rand(<shape>)# Applying torch.fx.experimental.optimization.fuse against model performs# conv-batchnorm folding for better performance.
import torch.fx.experimental.optimization as optimization
model = optimization.fuse(model, inplace=True)#################### コード変更 ####################
import intel_extension_for_pytorch as ipex
conf = ipex.quantization.QuantConf(qscheme=torch.per_tensor_affine)for d in calibration_data_loader():# conf will be updated with observed statistics during calibrating with the datasetwith ipex.quantization.calibrate(conf):model(d)conf.save('int8_conf.json', default_recipe=True)with torch.no_grad():model = ipex.quantization.convert(model, conf, torch.rand(<shape>))######################################################
model.save('quantization_model.pt')© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

39

The Parallel Universe40

INT8 推論―展開
import torch#################### コード変更 ####################
import intel_extension_for_pytorch as ipex######################################################
model = torch.jit.load('quantization_model.pt')
model.eval()data = torch.rand(<shape>)with torch.no_grad():model(data)

パフォーマンス
PyTorch* 向けインテル® エクステンションを使用した場合のパフォーマンス向上の可能性を図 2 と図 3 に示します。 ベンチマークは、 インテル® Xeon® Platinum 8380 プロセッサー @ 2.30GHz で実行されました （システム構成については、こちら （英語） を参照してください）。 オフラインでは、ソケットの全コアを使用してシングル・
インスタンスの推論を大きなバッチで実行しました （図 2）。 リアルタイムでは、 1 インスタンスあたり 4 コアを使用し、 マルチインスタンスのシングルバッチの推論を実行しました。

図 2. PyTorch* 向けインテル® エクステンションを使用したオフライン推論におけるパフォーマンス向上© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

41

図 3. PyTorch* 向けインテル® エクステンションを使用した推論におけるパフォーマンス向上

今後の取り組み
PyTorch* 向けインテル® エクステンションの目的は、 PyTorch* ユーザーがインテル® プロセッサー上でより高いパフォーマンスを迅速に得られるようにすることです。 インテルは、 メインラインの PyTorch* にほとんどの最適化をアップストリームする一方で、 新しい機能や最新のインテル® ハードウェア向けの最適化の実験を継続していきます。 ぜひ、 このオープンソース ・プロジェクトをお試しいただき、 GitHub* リポジトリー （英語）からフィードバックを提供してください。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

コードの境界を乗り越える
インテル® DevCloud for oneAPI でクロスアーキテ
クチャー ・プログラミングのパワーを体験してください。

デモ

Mandelbrot デモを異なるアーキテクチャーで実行して、クロスアーキテクチャーのパフォーマンスを確認できます。

学習

サンプルコードを含む 25 の Jupyter* Notebook で
データ並列 C++ を実際に体験できます。

開発

最新のインテルの CPU、 GPU、 FPGA で将来に対応した
アプリケーションを計画してテストできます。

今すぐ開始 （英語） >コンパイラーの最適化に関する詳細は、 最適化に関する注意事項 （software.intel.com/articles/optimization-notice#opt-jp） を参照してください。
Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
© Intel Corporation

The Parallel Universe

43

今すぐ Python* を高速化
アクセラレーター ・アーキテクチャーのカンブリア爆発に備えるJames Reinders インテル コーポレーション oneAPI エバンジェリスト兼 The Parallel Universe 名誉編集長

Python* は、 優れた汎用性とパフォーマンスで、 常に多くの人を驚かせています。 私は生粋の C と Fortran のプログラマーですが、 ハイパフォーマンスを実現するため C++ もかなり使いこなすことができます。 Python* もハイパフォーマンスを実現できますが、 先に挙げた言語とは一線を画す利便性を備えているため、 私は Python*のファンでもあります。
高度に最適化された主要なライブラリーと、 プリコンパイルされないコードに対する （実行時の） JIT コンパイル
サポートにより、 Python* はハイパフォーマンスを実現します。 しかし、 Python* コードは、 大きなデータセットや複雑なアルゴリズムでは遅くなる傾向があります。 本記事では、 以下の項目について説明します。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

44

1. 「ヘテロジニアスな未来」 を考えることの重要性
2. オープン ・ ソリューションで解決すべき 2 つの重要な課題
3. 利用可能な CPU パフォーマンスを効率良く活用する並列実行
4. アクセラレーターを使用してパフォーマンスをさらに向上する

3 番目の並列実行だけで 12 倍高速化でき、 4 番目のアクセラレーターの使用によりさらに高速化することができます。 これらの手法は、 Python* プログラマーがパフォーマンスを向上させたいときに非常に有効であり、 簡単に取り入れることができます。 ここで紹介する手法は、 結果が出るまでにあまり時間がかかりません。

「ヘテロジニアスな未来」 を考える
Python* コードを高速に実行したいだけなら、 ヘテロジニアスを理解することは重要ではありませんが、 現在コンピューティングで起きている大きな変化を知っておく価値はあります。 コンピューターは年々高速化しています。
当初は、 より巧妙で複雑なアーキテクチャーが、 パフォーマンスの向上を牽引していました。 1989 年から 2006 年にかけては、 クロック周波数の向上が主な原動力となりました。 そして、 2006 年に突然、 クロック周波数の向上が鈍化し、 パフォーマンスを向上するには再びアーキテクチャーの変更が必要になったのです。
マルチコア ・プロセッサーは、 プロセッサー内の （同種の） コアの数を増やすことで、 より高いパフォーマンスを提供するものでした。 クロック周波数の向上とは異なり、 マルチコアのパフォーマンスを引き出すには、 ソフトウェ
アを変更する必要がありました。 Herb Sutter 氏の名著 「The Free Lunch Is Over （フリーランチは終わった）」（英語） は、 並行処理の必要性を強調しました。 並列化は必要でしたが、 この変化はソフトウェア開発者に困難な課題をもたらしました。
次に、 CPU の計算処理を専用のデバイスで補強するアクセラレーターが登場しました。 その中で最も成功したのが GPU です。 GPU は元々、 グラフィックス処理をコンピューターのディスプレイにオフロードするために導入されました。 GPU の計算能力を利用するいくつかのプログラミング ・ モデルが登場しましたが、 結果をディスプレイに送るのではなく、 CPU 上で動作するプログラムに送り返すものでした。 その中で最も成功したモデルは、 NVIDIA*GPU 向けの CUDA* です。 現在では、 同じシステム内の （ヘテロジニアスな） プロセッサーの処理能力は同等ではありません。 しかし、 一般的なプログラミング言語は、 単一の計算デバイスを前提としているため、 コードの一部を別の計算デバイスで実行する場合、 「オフロード」 という用語が使われます。
数年前、 業界のレジェンドである John Hennessey 氏と David Patterson 氏が、 「A New Golden Age for
Computer Architecture （コンピューター ・ アーキテクチャーの新しい黄金時代）」 に入ったと発表しました。
ヘテロジニアス ・コンピューティングは、 多くのドメイン専用のプロセッサーの登場により、 爆発的に増加しています。 成功するものもあれば失敗するものもありますが、 もはやすべての計算を 1 つのデバイスで行う時代は終わり、 コンピューティングは永遠に変化し続けるでしょう。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

45

2 つの重要な課題を 1 つの優れたソリューションで解決
CUDA* は人気がありますが、 その対象は NVIDIA* GPU に限定されています。 複数のベンダーから登場する
新しいアクセラレーター ・アーキテクチャーに対応するには、 オープンなソリューションが必要です。 ヘテロジニ
アス ・プラットフォームで実行されるプログラムは、 実行時に利用可能なデバイスを検出する必要があります。
また、 これらのデバイスに計算をオフロードする仕組みも必要です。
CUDA* は、 NVIDIA* GPU のみが利用可能であると仮定し、 デバイスの検出を行いません。 Python* ユーザー
は、 NVIDIA* CUDA* や AMD* ROCm* で GPU を活用するため、 CuPy （英語） を選択できます。 CuPy は堅実な選択肢ですが、 CPU パフォーマンスを向上したり、 ほかのベンダーやアーキテクチャー向けに汎用化することはできません。 複数のベンダーに移植可能で、 新しいハードウェア・ イノベーションをサポートできるプログラミング・
ソリューションがあれば、 もっと良い結果が得られるでしょう。 アクセラレーターへのオフロードを検討する前に、ホスト CPU を最大限に活用していることを確認します。 並列性を引き出す方法とコンパイルされたコードを理解すれば、 アクセラレーターでも同様の並列処理を利用できます。
Numba （英語） は、Anaconda 社によって開発された、オープンソースの Python* 用 NumPy* 対応最適化 （JIT）
コンパイラーです。 LLVM コンパイラーを使って Python* バイトコードからマシンコードを生成します。 Numba は、
多くの NumPy* 関数を含む、 数値計算に特化した Python* の大部分をコンパイルできます。 また、 ループの自動並列化、 GPU アクセラレーション・コードの生成、 ユニバーサル関数 （ufuncs） と C コールバックの生成をサポートしています。
Numba の自動並列化 （英語） はインテルが貢献したもので、 @numba.jit で parallel=True オプションを設定すると有効になります。 自動並列化は、 コンパイルされた関数内のデータ並列コード領域を分析し、 並列実行のスケジュールを作成します。 Numba は、 次の 2 種類の処理を自動並列化できます。
1. NumPy* の配列式、 ufuncs、 リダクション関数などの暗黙的なデータ並列領域
2. numba.prange 式で指定される明示的なデータ並列ループ

例えば、 次の単純な Python* ループについて考えてみます。
def f1(a,b,c,N):for i in range(N):c[i] = a[i] + b[i]

シリアル領域 （range） を並列領域 （prange） に変更し、 njit ディレクティブ （njit は Numba JIT、並列バージョンをコンパイルする） を追加することで、 明示的に並列化できます。
@njit(parallel=True)def add(a,b,c,N):for i in prange(N):c[i] = a[i] + b[i]© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

46

このコードを実行したところ、 実行時間は 24.3 秒から 1.9 秒に改善されました。 結果はシステムによって異 な り ま す。 こ の コ ー ド を 試 す に は、 oneAPI-samples リ ポ ジ ト リ ー を ク ロ ーン し （git clone
https://github.com/oneapi-src/oneAPI-samples （英 語））、 AI-and-Analytics/Jupyter/Numba_DPPY_
Essentials_training/Welcome.ipynb ノートブックを開きます。 インテル® DevCloud for oneAPI （英語）の無料のアカウントを取得すると、 簡単に試すことができます。

アクセラレーターを使用してパフォーマンスをさらに向上
アクセラレーターは、 アプリケーションにオフロードのオーバーヘッドに見合うワークがある場合に、 非常に効果的です。 最初のステップは、 オフロードできるように計算 （カーネル） を選択してコンパイルすることです。 前の例を拡張して、 オフロードカーネルを指定するため、 Numba データ並列拡張 （numba-dpex （英語）） を使用
します （詳細は、 Jupyter* Notebook トレーニング （英語） を参照してください）。
@dppy.kernel
def add(a, b, c):i = dppy.get_global_id(0)c[i] = a[i] + b[i]カーネルコードのコンパイルと並列化を行います。 前述の例では、 @njit を使用して CPU 上で実行しましたが、今回はデバイスにオフロードします。 カーネルコードは、 実行時にランタイムがデバイスにマップする中間言語（SPIR-V* （英語）） にコンパイルされます。 これにより、ベンダーに依存しないアクセラレーター・オフロードのソリュー
ションが得られます。
カーネルへの配列引数は、 プログラミング ・ ニーズに応じて、 NumPy* 配列または USM （統合共有メモリー）
配列 （USM に明示的に配置される配列型） のいずれかを選択できます。 この選択は、 データの設定やカーネルの呼び出し方法に影響します。
次に、 オープンソースのデータ並列制御 （dpctl ： SYCL* 向けの C および Python* バインディング） を使用して、
SYCL* というオープンなマルチベンダー、 マルチアーキテクチャー ・プログラミングの C++ ソリューションを利用します （詳細は、 GitHub* のドキュメント （英語） と 「XPU プログラミング向けの SYCL と Python* のインターフェイス」 （英語） を参照してください）。 これにより、 Python* プログラムは SYCL* デバイス、 キュー、 メモリーリソー
スにアクセスし、 Python* の配列 / テンソル操作を実行できるようになります。 これは、 ソリューションの再考案を回避し、 学習量を減らし、 高いレベルの互換性の確保につながります。
デバイスへの接続は簡単です。 次のコードを追加するだけです。
device = dpctl.select_default_device()print("Using device ...")
device.print_device_info()

プログラムを変更せずにデバイスの選択を制御したい場合は、 環境変数 SYCL_DEVICE_FILTER でデフォルトのデバイスを設定できます。 dpctl ライブラリーは、 ハードウェアのプロパティーに基づいて利用可能なデバイスをレビューし選択する、 プログラムによる制御もサポートしています。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe47

カーネルは、 数行の Python* コードによりデバイス上で起動 （オフロードして実行） できます。
with dpctl.device_context(device):
dpar_add[global_size,dppy.DEFAULT_LOCAL_SIZE](a,b,c)

device_context を 使用することで、 ランタイムによって必要なデータコピー （この 例ではデータは標準
NumPy* 配列のままです） が行われます。 dpctl ライブラリーは、明示的にデバイスの USM メモリーを割り当て、管理する機能もサポートしています。 これは、 高度な最適化を行う際には重要な機能ですが、 ランタイムが標準
NumPy* 配列を処理する手軽さに勝るものはありません。

非同期と同期
Python* のコーディング ・ スタイルは、 上に示した同期メカニズムによって簡単にサポートされます。 非同期の機能とその利点 （データ移動とカーネル呼び出しの待ち時間を減らすまたは隠す） は、 Python* コードを少し変更すれば利用できます。 非同期実行の詳細については、dpctl gemv example （英語） にあるサンプルコー
ドを参照してください。

CuPy
CuPy （英語） は NumPy* の大部分を再実装したものです。 CuPy 配列ライブラリーは、 既存の NumPy*/SciPy*
コードを NVIDIA* CUDA* や AMD* ROCm* プラットフォームで実行するドロップイン置換として機能します。 しかし、新しいプラットフォーム向けに CuPy を再実装するには、 膨大なプログラミング作業が必要であり、 同じ Python*
プログラムでマルチベンダーをサポートする大きな障壁となり、 前述の 2 つの重要な課題に対応できません。
CuPy では CUDA* 対応の GPU デバイスが必要です。 メモリーについては、 cudaMalloc の呼び出し回数を減らすため、メモリープーリングを自動的に実行しますが、直接制御することはほとんどできません。カーネルのオフロー
ドでは、 デバイスの選択を制御できず、 CUDA* 対応 GPU が利用できない場合は失敗します。 ヘテロジニアスの課題に対応した優れたソリューションを使用することは、 アプリケーションの移植性を高めます。

scikit-learn*
Python* プログラミングは一般に 「compute-follows-data」 に適しており、そのルーチンはとてもシンプルです。
dpctl ライブラリーは、 特定のデバイスと接続するテンソル配列型をサポートしています。 このプログラムでは、
データをデバイステンソルにキャストすると ［例 ： dpctl.tensor.asarray(data, device="gpu:0")］、
データがデバイスと関連付けられて、 デバイス上に配置されます。 このデバイステンソルを認識する scikit-learn* のパッチを適用したバージョン（英語） を使用すると、このテンソルを含むパッチを適用した scikit-learn* のメソッド （英語） は自動的にデバイス上で計算されます。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe48

これは Python* の動的型付けの優れた使い方で、 データがどこにあるかを検出し、 データが存在する場所で計算を行うように指示します。 Python* コードはほとんど変わらず、 唯一の変更は、 テンソルをデバイステンソ
ルに再キャストするところです。 これまでユーザーから寄せられたフィードバックから、 compute-follows-data
メソッドは Python* ユーザーに最も人気のモデルになると予想されます。

オープン、 マルチベンダー、 マルチアーキテクチャー ― ともに学ぶ
Python* は、 ハードウェアの多様性を受け入れ、 差し迫ったアクセラレーターのカンブリア爆発を利用する道具となりえます。 Numba データ並列 Python*、 dpctl、 compute-follows-data （パッチを適用した scikit-learn*）の組み合わせは、 ベンダーやアーキテクチャーにとらわれないため、 検討する価値があります。
Numba は NumPy* に素晴らしいサポートを提供していますが、 将来的には SciPy* やほかの Python* のニーズへの対応を検討できるでしょう。 Python* の配列 API の断片化により、 CPU 以外のデバイスでワークロードを共有したいという要望から、 Python* 配列 API の標準化 （要約はこちら （英語）） への関心が高まっています。
標準配列 API は、 Numba や dpctl などの取り組みの範囲と影響を拡大するのに大いに役立っています。
NumPy* と CuPy は配列 API を採用しており、 dpctl と PyTorch* （英語） は採用に向けて取り組んでいます。
より多くのライブラリーに採用が拡大すれば、 ヘテロジニアス ・コンピューティング （多種多様なアクセラレーター）のサポートが容易になるでしょう。
複数のスレッドや非同期タスクを使用するより高度な Python* コードでは、dpctl.device_context を使用するだけでは十分ではありません （GitHub* にある問題 （英語） を参照してください）。 少なくとも、 より複雑なスレッド化された Python* コードでは、 compute-follows-data を採用することをお勧めします。 これは、
device_context スタイルのプログラミングよりも優先されるオプションになる可能性があります。
Python* を高速化するため、 皆で貢献し、 一緒に改善に取り組むことができます。 すべてがオープンソースであり、非常にうまく機能しています。

関連情報
実際に試してみることで多くのことを学べます。 いくつかの役立つオンラインリソースを紹介します。
Data Parallel Essentials for Python （Python* のデータ並列の基本）（英語） ― Numba と dpctl の概念について説明した 90 分のビデオ
Losing your Loops Fast Numerical Computing with NumPy （NumPy* による高速な数値計算でループを排除する）（英語） ― 『Python Data Science Handbook （Python* データ ・ サイエンス・ ハンドブック）』 （英語）の著者である Jake VanderPlas 氏による NumPy* の効果的な使用に関するビデオ© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

The Parallel Universe

49

本記事で紹介したヘテロジニアスの Python* 機能はすべてオープンソースで、インテル® oneAPI ベース・ツールキッ
トとインテル® AI アナリティクス ・ ツールキットに含まれています。 SYCL* 対応の NumPy* は GitHub* （英語） でホストされています。 カーネル ・プログラミングと自動オフロード機能の Numba コンパイラー拡張も GitHub* でホストされています。 オープンソースのデータ並列制御 （dpctl ： SYCL* 向けの C および Python* バインディング）には、 GitHub* のドキュメント （英語） と、 論文 「XPU プログラミング向けの SYCL* と Python* のインターフェイス」 があります。 これにより、 Python* プログラムは SYCL* デバイス、 キュー、 メモリーにアクセスし、 Python*の配列 / テンソル操作を実行できるようになります。
デバイスコードからの非同期エラーを含む例外がサポートされています。 非同期エラーは、非同期エラーハンドラー関数によって同期例外として再スローされると、 インターセプトされます。 この動作は Python* の拡張ジェネレー
ターにより提供されるもので、 コミュニティーのドキュメント Cython （英語） と Pybind11 （英語） で詳しく説明
されています。

© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
コンパイラーの最適化に関する詳細は、 最適化に関する注意事項を参照してください。

インテルのテクノロジーを使用するには、 対応したハードウェア、 ソフトウェア、 またはサービスの有効化が必要となる場合があります。 詳細については、OEM または販売店にお問い合わせいただくか、 http://www.intel.co.jp/ を参照してください。
実際の費用と結果は異なる場合があります。
インテルは、 サードパーティーのデータについて管理や監査を行っていません。 ほかの情報も参考にして、 正確かどうかを評価してください。
最 適化に関する注 意事項 : インテル® コンパイラーでは、 インテル® マイクロプロセッサーに限 定されない最 適化に関して、 他社製マイクロプロセッ
サー用に同等の最適化を行えないことがあります。 これには、 インテル® ストリーミング SIMD 拡張命令 2、 インテル® ストリーミング SIMD 拡張命令
3、 インテル® ストリーミング SIMD 拡張命令 3 補足命令などの最 適化が該当します。 インテルは、 他社製マイクロプロセッサーに関して、 いかなる最適化の利用、 機能、 または効果も保証いたしません。 本製品のマイクロプロセッサー依存の最適化は、 インテル® マイクロプロセッサーでの使用を前提としています。 インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、 インテル® マイクロプロセッサー用のものがあります。 この
注意事項で言及した命令セットの詳細については、 該当する製品のユーザー ・ リファレンス ・ ガイドを参照してください。 注意事項の改訂 #20110804。
https://software.intel.com/en-us/articles/optimization-notice#ja-jp
性能に関するテストに使用されるソフトウェアとワークロードは、 性能がインテル® マイクロプロセッサー用に最適化されていることがあります。
SYSmark* や MobileMark* などの性能テストは、 特定のコンピューター・システム、 コンポーネント、 ソフトウェア、 操作、 機能に基づいて行ったものです。
結果はこれらの要因によって異なります。 製品の購入を検討される場合は、 他の製品と組み合わせた場合の本製品の性能など、 ほかの情報や性能テストも参考にして、 パフォーマンスを総合的に評価することをお勧めします。 構成の詳細は、 補足資料を参照してください。 性能やベンチマーク結果について、さらに詳しい情報をお知りになりたい場合は、 http://www.intel.com/benchmarks/（ 英語） を参照してください。
性能の測定結果はシステム構成の日付時点のテストに基づいています。 また、 現在公開中のすべてのセキュリティー ・ アップデートが適用されているとは限りません。 詳細は、 システム構成を参照してください。 絶対的なセキュリティーを提供できる製品またはコンポーネントはありません。
本資料は、（明示されているか否かにかかわらず、また禁反言によるとよらずにかかわらず） いかなる知的財産権のライセンスも許諾するものではありません。
インテルは、 明示されているか否かにかかわらず、 いかなる保証もいたしません。 ここにいう保証には、 商品適格性、 特定目的への適合性、 および非侵害性の黙示の保証、 ならびに履行の過程、 取引の過程、 または取引での使用から生じるあらゆる保証を含みますが、 これらに限定されるわけではありません。
© Intel Corporation. Intel、 インテル、 Intel ロゴ、 その他のインテルの名称やロゴは、 Intel Corporation またはその子会社の商標です。
* その他の社名、 製品名などは、 一般に各社の表示、 商標または登録商標です。
JPN/2212/PDF/XL/SPI/ND