このトピックでは、第3世代Intelが提供するAnalytics ZooおよびBrain Floating Point bit-16 (bfloat16) 機能の使用方法について説明します。®Xeon ®スケーラブルなプロセッサをして、ECS (Elastic Compute Service) インスタンス上のAIアプリケーションのパフォーマンスを高速化します。 このトピックは、第7世代の高頻度ECSインスタンス (高クロック速度のECSインスタンスとも呼ばれます) に適用できます。

このタスクについて

  • 第7世代の高周波ECSインスタンスは、第3世代のSHENLONGアーキテクチャ上に構築され、第3世代のIntelを搭載しています。®Xeon ®スケーラブルなプロセッサ。 これらのインスタンスは、第6世代の高頻度インスタンスよりも最大260% 高いコンピューティングパフォーマンスを提供できます。 ECSインスタンスでAnalytics Zooを使用する場合、Intelによって最適化されたTensorFlowやPyTorch深層学習モデルなどの高度なパイプライン機能を活用して、深層学習アプリケーションを開発できます。
  • 第3世代インテル ®Xeon ®スケーラブルなプロセッサは、強化されたIntelを使用して、業界をリードするワークロード最適化プラットフォームを提供します®Deep Learning Boost (インテル)®組み込みのAIアクセラレーション機能であるDL Boost) 。 強化されたインテル ®DL Boostは、AI推論とトレーニングのパフォーマンスを向上させるために、bfloat16に対する業界初のx86サポートを備えています。

    第3世代インテル ®Xeon ®スケーラブルなプロセッサは、複雑なAIワークロードに対応できます。 強化されたインテル ®DL Boostは、AIトレーニングパフォーマンスを最大1.93倍、画像分類のAI推論パフォーマンスを最大1.87倍、自然言語処理 (NLP) のAIトレーニングパフォーマンスを最大1.7倍、AI推論パフォーマンスを最大1.9倍向上させます。× 。 bfloat16のサポートにより、ヘルスケア、金融サービス、小売業界向けのAIトレーニングワークロードの処理がはるかに効率的になります。

  • Analytics Zooは、Intelが開発した統合されたオープンソースのビッグデータ分析およびAIプラットフォームです。 TensorFlow、Keras、PyTorchなどのAIモデルをシームレスにスケーリングして、Spark、Flink、Rayなどの分散ビッグデータ環境に適応できます。 Analytics Zooには次の機能があります。
    • ビッグデータプラットフォームでTensorFlow、PyTorch、OpenVINOなどのAIモデルを実行するためのエンドツーエンドのパイプライン。 たとえば、開発者はTensorFlowまたはPyTorchコードをSparkコードに埋め込み、分散トレーニングと推論を行うことができます。 開発者は、TensorFlow、Keras、PyTorch、BigDLなどのネイティブの深層学習モデルをSpark機械学習 (ML) パイプラインで使用することもできます。
    • クラスター処理や自動MLタスク用のスケーラブルなAutoMLなど、高レベルのMLワークフロー。 クラスターサービングは、TensorFlow、PyTorch、OpenVINOツールキットなどのモデルの自動分散推論ソリューションです。 スケーラブルなAutoMLは、時系列予測に使用されます。
    • 推奨、時系列、コンピュータビジョン、NLPなどのアプリケーション用の内蔵共通モデル。
    ZOO
  • Bfloat16は、ニューラルネットワークで広く使用されている数値形式です。
  • ResNet-50は、50層の深さの残留ネットワークである。 オブジェクト分類などの分野で広く使用されています。

手順

ステップ1: 高頻度ECSインスタンスの作成

高頻度ECSインスタンスを作成するには、次の操作を実行します。

  1. ECSコンソールのインスタンス購入ページの [カスタム起動] タブに移動します。
  2. 高頻度インスタンスを作成します。 詳細については、「ウィザードを使用したインスタンスの作成」をご参照ください。
    高頻度インスタンスを作成するためのパラメーターを設定する場合、hfc7またはhfg7インスタンスファミリーを選択できます。 この例では、hfc7インスタンスファミリーを選択します。 特定のインスタンスタイプについては、「クロック速度の高いインスタンスファミリー」をご参照ください。
  3. [インスタンス] ページで、前の手順で作成したインスタンスを見つけ、インスタンスのIDをクリックします。 インスタンスがhfc7インスタンスタイプであることを確認します。
    インスタンスタイプの確認

ステップ2: ECSインスタンスでbfloat16をサポートするAnalytics Zoo環境を準備する

Analytics Zooは、bfloat16をサポートする事前作成済みのDockerイメージを提供します。 方法1を使用して、Alibaba Cloud ECSでこのDockerイメージを取得できます。 または、方法2を使用して、bfloat16をサポートするAnalytics Zooの夜間ビルドを取得できます。 関連コードの詳細については、「サンプルコード: Analytics Zooがbfloat16を使用して深層学習モデルのトレーニングを高速化する方法」をご参照ください。

  • 方法1: ECSでAnalytics Zooが提供するDockerイメージを取得する
    1. ECS インスタンスに接続します。 詳細については、「ECS インスタンスへの接続」をご参照ください。
    2. 次のコマンドを実行して、Dockerをインストールして実行します。
      yum install docker-io -y
      systemctl start docker
    3. 次のコマンドを実行して、bfloat16をサポートするAnalytics Zooが提供するDockerイメージを取得します。
      docker pull intelanalytics/analytics-zoo:0.8.1-bigdl_0.10.0-spark_2.4.3-bf16
    4. 次のコマンドを実行して、Dockerイメージに対応するDockerコンテナを実行します。
      docker run -itd -- name az1 -- net=host -- 特権的なintelanalytics/analytics-zoo:0.8.1-bigdl_0.10.0-spark_2.4.3-bf16
    5. 次のコマンドを実行して、コンテナにアクセスします。
      docker exec -it az1 bash
  • 方法2: bfloat16をサポートするAnalytics Zooの夜間ビルドを使用して、Analytics Zoo環境を手動で作成する
    1. ECS インスタンスに接続します。 詳細については、「ECS インスタンスへの接続」をご参照ください。
    2. 次のコマンドを実行して、最新のAnalytics Zooプリビルドリリースと夜間ビルドパッケージをダウンロードして解凍します。
      wget https://oss.sonatype.org/content/repositories/snapshots/com/intel/analytics/zoo/analytics-zoo-bigdl_0.11.1-spark_2.4.3/0.9.0-SNAPSHOT/analytics-zoo-bigdl_0.11.1-spark_2.4.3-0.9.0-20201026.210040-51-dist-all.zip
      analytics-zoo-bigdl_0.11.1-spark_2.4.3-0.9.0の解凍-{datetime}-dist-all.zip -d analytics-zoo
    3. 次のコマンドを実行してGitをインストールします。
      yum -y gitをインストールする
    4. 次のコマンドを実行して、TensorFlowソースコードをダウンロードします。
      git clone https://github.com/Intel-tensorflow/tensorflow.git
      gitチェックアウトv1.15.0up1
    5. 次のコマンドを実行してTensorFlowをコンパイルします。
      bazel build -- cxxopt=-D_GLIBXX_USE_CXX11_ABI=0 -- copt=-O3 -- copt=-Wformat
      -- copt=-Wformat-security -- copt=-fstack-protector -- copt=-fPIC
      -- copt=-fpic -- linkopt=-znoexecstack -- linkopt=-zrelro
      -- linkopt=-znow -- linkopt=-fstack-protector -- config=mkl -- define
      build_with_mkl_dnn_v1_only=true -- copt=-DENABLE_INTEL_MKL_BFLOAT16
      -- copt=-march=ネイティブ
      // tensorflow/tools/lib_package:libtensorflow_jni.tar.gz
      // tensorflow/java:libtensorflow.jar
      // tensorflow/java:libtensorflow-src.jar
      // tensorflow/tools/lib_package:libtensorflow_proto.zip
    6. 次のコマンドを実行して、Analytics Zooに必要なライブラリファイルを整理します。
      cd bazel-bin/tensorflow/tools/lib_package
      mkdir linux-x86_64
      tar -xzvf libtensorflow_jni.tar.gz -C linux_x86-64
      rm libtensorflow_framework.so
      rm libtensorflow_framework.so.1
      mv libtensorflow_framework.so.1.15.0 libtensorflow_framework-zoo.so
      cpを使用します。./../../../_solib_k8/_U @ mkl_Ulinux_S_S_Cmkl_Ulibs_Ulinux __ Uexternal_Smkl_Ulinux_Slib/* ./
    7. 次のコマンドを実行して、Analytics Zoo Jarフォルダを更新します。
      cd ~/analytics-zoo/lib /
      cp ~/tensorflow/bazel-bin/tensorflow/tools/lib_package/linux-x86_64 ./
      jar -ufanalytics-zoo-bigdl_0.11.1-spark_2.4.3-0.9.0-SNAPSHOT-jar-with-dependencies.jar linux-x86_64/*

ステップ3: ResNet-50モデルをトレーニングし、bfloat16を使用してECSインスタンスのパフォーマンスを向上させる

  1. 次のコマンドを実行して、Analytic Zoo Dockerコンテナにアクセスします。
    docker exec -it az1 bash
  2. 次のコマンドを実行してSparkを設定し、/opt/work/spark-2.4.3/conf/spark-defaults.confファイルを変更します。
    spark.authenticate=false
    spark.ui.killEnabled=true
    spark.eventLog.enabled=true
    spark.history.ui.port=18080
    spark.eventLog.dir=file:/// var/log/spark/spark-events
    spark.history.fs.logDirectory=file:/// var/log/spark/spark-events
    spark.shuffle.service.port=7337
    spark.master=spark://$(ホスト名):7077
  3. 次のコマンドを実行してSparkマスターを起動します。
    cd /opt/work/spark-2.4.3
    . /sbin/start-master.sh
  4. numactlコマンドを実行して8つのSparkワーカーを起動し、各Sparkワーカーを12 vCPUにバインドします。 次に、/opt/work/spark-2.4.3/binディレクトリに次のスクリプトを作成します。
    numact1 − C0 − 11。/spark-class org.apache.spark.de ploy.worker.Worker spark://$(ホスト名):7077&
    numactl − C12 − 23。/spark-class org.apache.spark.de ploy.worker.Worker spark://$(ホスト名):7077&
    numactl − C 24 − 35。/spark-class org.apache.spark.de ploy.worker.Worker spark://$(ホスト名):7077&
    numactl − C 36 − 47。/spark-class org.apache.spark.de ploy.worker.Worker spark://$(ホスト名):7077&
    numactl − C48 − 59。/spark-class org.apache.spark.de ploy.worker.Worker spark://$(ホスト名):7077&
    numactl − C 60 − 71。/spark-class org.apache.spark.de ploy.worker.Worker spark://$(ホスト名):7077&
    numactl − C 72 − 83。/spark-class org.apache.spark.de ploy.worker.Worker spark://$(ホスト名):7077&
    numactl − C 84 − 95。/spark-class org.apache.spark.de ploy.worker.Worker spark://$(ホスト名):7077&
  5. 次のコマンドを実行して、開始されたSparkワーカーの数を確認します。 8つのSparkワーカーが起動されている場合、8はコマンド出力に表示されます。
    jps  grepワーカー  wc -l
  6. 次のコマンドを実行して、GithubからサンプルコードをダウンロードしResNet-50。
    git clone https://github.com/yangw1234/models-1.git
    git checkout branch-1.6.1-動物園
  7. models-1/models/image_recognition/tensorflow/resnet50v1_5/training/mlperf_resnetディレクトリでRun. shスクリプトを実行し、-- use_bfloat16オプションを追加してbfloat16-basedトレーニングを有効にします。 -- use_bfloat16オプションを追加しない場合、デフォルトでトレーニングにはfloat32が使用されます。
    # モデルをソースルートとして登録する
    PYTHONPATH="$(pwd):${ PYTHONPATH}" をエクスポートする
    エクスポートKMP_BLOCKTIME=0
    #8インスタンス
    エクスポートOMP_NUM_THREADS=6
    エクスポートKMP_AFFINITY=granularity=fine,compact,1,0
    エクスポートKMP_SETTINGS=1
    export ANALYTICS_ZOO_HOME=/opt/work/analytics-zoo/dist
    export SPARK_HOME=/opt/work/spark-2.4.3
    bash $ANALYTICS_ZOO_HOME/bin/spark-submit-python-with-zoo.sh -- master
    spark://$(ホスト名):7077 \
    -- executor-cores 1 -- total-executor-cores 8 -- driver-memory 20g -- executor-memory 18g \
    -- con f spark.net work.timeout=10000000 -- conf spark.exe cutor.heartbeatInterval=100000 \
    imagenet_main.py 1 -- model_dirです。/logs -- batch_size 128 -- バージョン1 \
    -- resnet_size 50-- train_epochs 90 -- data_dir /opt/ILSVRC2012/ -- use_bfloat16
    次の表に、トレーニングテストの結果を示します。
    ResNet-50モデルトレーニング FP32 BF16 float32上のbfloat16によって達成される性能の改善
    スループット (画像 /秒) 119.636 212.315 1.775

サンプルコード: Analytics Zooがbfloat16を使用して深層学習モデルのトレーニングを高速化する方法

次のコードでは、bfloat16を使用してResNet-50モデルなどの深層学習モデルのトレーニングを高速化する方法の例を示します。 コードは参照用です。 Analytics Zooが提供するDockerイメージには既に含まれており、手動操作は必要ありません。

  1. 次のコードを使用して、入力画像をbfloat16形式に変換します。
    if use_bfloat16 == True:
    dtype = tf.bfloat16
    features = tf.cast(features, dtype)
  2. 次のコードを使用して、custom_dtype_getterをコンパイルします。
    DEFAULT_DTYPE = tf.float32
    CASTABLE_TYPES = (tf.float16,tf.bfloat16)
    def _custom_dtype_getter(getter、name、shape=None、dtype=DEFAULT_DTYPE、     
          * args、**kwargs):
        CASTABLE_TYPESのdtype:
          var = getter (名前、形状、tf.float32、* args、**kwargs)
          retur n tf.ca st(var, dtype=dtype, name=name + '_cast')
        else:
          return getter(name、shape、dtype、* args、**kwargs)
  3. 次のコードを使用してvariable_scopeを作成し、variable_scopeの下にモデルを構築します。
    def _model_variable_scope():
        retur n tf.com pat.v1.variable_scope('resnet_model' 、
                        custom_getter=_custom_dtype_getter)
    
    _model_variable_scope():
        logits = _resnet_50_model(features)
  4. 次のコードを使用して、logitをfloat32形式にキャストし、数値の安定性を確保するために損失を計算します。
    logits = tf.cast(logits, tf.float32)
  5. Analytics TFParkを分散トレーニングに使用します。 詳細については、「TFParkの概要」をご参照ください。