背景資訊
阿里雲第七代高主頻 ECS 例項構建於第三代神龍平臺之上,基於第三代智慧英特爾® 至強® 可擴充套件處理器建立。相對於上一代,阿里雲 ECS 雲伺服器第七代高主頻例項計算效能最大可以提升 260%。在 ECS 上使用 Analytics Zoo,可以利用 Analytics Zoo 的高階流水線特性,比如使用英特爾最佳化的深度學習框架(例如 TensorFlow、PyTorch 等)開發深度學習應用。
·第三代智慧英特爾® 至強® 可擴充套件處理器提供了業界領先、經工作負載最佳化的平臺,並內建了 AI 加速功能--增強型英特爾® Deep Learning Boost(英特爾® DL Boost)。增強型英特爾® DL Boost 透過業界首次對 bfloat16 的 x86 支援,增強了人工智慧推理和訓練效能。
·第三代智慧英特爾® 至強® 可擴充套件處理器可執行復雜的人工智慧工作負載。增強型英特爾® DL Boost 將人工智慧訓練最高提升 1.93 倍,影像分類效能最高提升 1.87 倍,自然語言處理的訓練效能提升 1.7 倍,推理提升 1.9 倍。新的 bfloat16 處理支援使醫療保健、金融服務和零售業的人工智慧訓練工作負載受益匪淺。
·Analytics Zoo 是英特爾開源的統一的大資料和 AI 平臺,它可以無縫的將 TensorFlow、Keras、PyTorch 等 AI 程式擴充套件到分散式 Spark、Flink、Ray 等大資料平臺上執行。Analytics Zoo 提供了以下特性:
o為基於 TensorFlow、PyTorch、OpenVINO 等的 AI 模型提供執行在大資料平臺之上的端到端的流水線。例如開發者可以在 Spark 程式碼中嵌入 TensorFlow 或者 PyTorch 程式碼,進行分散式的訓練和推理。開發者可以在 Spark ML 流水線中使用原生的深度學習支援如 TensorFlow、Keras、PyTorch、BigDL 等。
o為自動化的機器學習任務提供了高階 ML 工作流支援,例如自動的 TensorFlow、PyTorch、OpenVINO 等模型的分散式推理 Cluster Serving 以及可擴充套件的時序資料預測的 AutoML 功能。
o內建提供了 Recommendation、Time Series、CV、NLP 等應用常用的模型。
·bfloat16 是一種業界廣泛用於神經網路的數字格式。
·Resnet50 是一個 50 層的殘差網路 (Residual Network),該神經網路廣泛用於目標分類等領域。
操作步驟
如果您想在 ECS 上使用 Analytics Zoo 對人工智慧應用進行 bfloat16 加速,按照以下步驟在 ECS 上加速人工智慧應用。下面步驟以訓練 Resnet50 模型的工作負載為例進行說明。
1.步驟一:建立高主頻 ECS 例項
2.步驟二:在 ECS 上準備帶有 bfloat16 最佳化支援的 Analytics Zoo 環境
3.步驟三:在 ECS 例項上訓練 Resnet50 模型和 bfloat16 的效能提升
步驟一:建立高主頻 ECS 例項
完成以下操作,建立一臺 ECS 例項。
1.前往例項建立頁。
2.建立一臺 hfc7 例項。具體操作,請參見使用嚮導建立例項。
3.在配置引數時,您需要注意當前場景支援的例項規格族包括 hfc7 和 hfg7。具體規格,請參見高主頻型。
4.在例項列表中,找到建立的例項,單擊例項 ID。檢視並確認例項規格。
步驟二:在 ECS 上準備帶有 bfloat16 最佳化支援的 Analytics Zoo 環境
Analytics Zoo 提供了預先建立的支援 bfloat16 的 docker image,按照方法一可以輕鬆在阿里雲 ECS 上獲取 Analytics Zoo 的 docker image。您也可以按照方法二使用 Analytics Zoo nightly build 來支援 bfloat16。
·方法一:在 ECS 上獲取 Analytics Zoo 預先建立的 docker image 建立。
1)連線 ECS 例項。具體步驟,請參見連線 ECS 例項。
2)執行以下命令安裝並執行 Docker。
1.yum install docker-io -y 2.systemctl start docker
3)執行以下命令獲取支援 bfloat16 的 Analytics Zoo docker image。
1.docker pull intelanalytics/analytics-zoo:0.8.1-bigdl_0.10.0-spark_2.4.3-bf16
4)執行以下命令執行 docker container。
1.docker run -itd --name az1 --net=host --privileged intelanalytics/analytics-zoo:0.8.1-bigdl_0.10.0-spark_2.4.3-bf16
5)執行以下命令進入 container。
1.docker exec -it az1 bash
·方法二:使用者使用 Analytics Zoo nightly build 來支援 bfloat16 手動建立。
1)連線 ECS 例項。具體步驟,請參見連線 ECS 例項。
2)執行以下命令下載並解壓最新的 Analytics Zoo nightly build pre-build package。
1.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 2.unzip analytics-zoo-bigdl_0.11.1-spark_2.4.3-0.9.0-{datetime}-dist-all.zip -d analytics-zoo
3)執行以下命令安裝 git。
1.yum -y install git
4)執行以下命令下載 TensorFlow 原始碼。
1.git clone https://github.com/Intel-tensorflow/tensorflow.git 2.git checkout v1.15.0up1
5)執行以下命令編譯 TensorFlow。
1.bazel build --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --copt=-O3 --copt=-Wformat 2.--copt=-Wformat-security --copt=-fstack-protector --copt=-fPIC 3.--copt=-fpic --linkopt=-znoexecstack --linkopt=-zrelro 4.--linkopt=-znow --linkopt=-fstack-protector --config=mkl –define 5.build_with_mkl_dnn_v1_only=true --copt=-DENABLE_INTEL_MKL_BFLOAT16 6.--copt=-march=native 7.//tensorflow/tools/lib_package:libtensorflow_jni.tar.gz 8.//tensorflow/java:libtensorflow.jar 9.//tensorflow/java:libtensorflow-src.jar 10.//tensorflow/tools/lib_package:libtensorflow_proto.zip
6)執行以下命令整理 Analytics Zoo 需要的庫檔案。
1.cd bazel-bin/tensorflow/tools/lib_package 2.mkdir linux-x86_64 3.tar -xzvf libtensorflow_jni.tar.gz -C linux_x86-64 4.rm libtensorflow_framework.so 5.rm libtensorflow_framework.so.1 6.mv libtensorflow_framework.so.1.15.0 libtensorflow_framework-zoo.so 7.cp ../../../../_solib_k8/_U@mkl_Ulinux_S_S_Cmkl_Ulibs_Ulinux___Uexternal_Smkl_Ulinux_Slib/* ./
7)執行以下命令更新 Analytics Zoo Jar。
1.cd ~/analytics-zoo/lib/ 2.cp ~/tensorflow/bazel-bin/tensorflow/tools/lib_package/linux-x86_64 ./ 3.jar -ufanalytics-zoo-bigdl_0.11.1-spark_2.4.3-0.9.0-SNAPSHOT-jar-with-dependencies.jar linux-x86_64/*
步驟三:在 ECS 例項上訓練 Resnet50 模型和 bfloat16 的效能提升
1.執行以下命令進入 Analytic Zoo docker 容器。
1.docker exec -it az1 bash
2.執行以下命令配置 spark,對 /opt/work/spark-2.4.3/conf/spark-defaults.conf 進行修改。
1.spark.authenticate=false 2.spark.ui.killEnabled=true 3.spark.eventLog.enabled=true 4.spark.history.ui.port=18080 5.spark.eventLog.dir=file:///var/log/spark/spark-events 6.spark.history.fs.logDirectory=file:///var/log/spark/spark-events 7.spark.shuffle.service.port=7337 8.spark.master=spark://$(hostname):7077
3.執行以下命令啟動 spark master。
1.cd /opt/work/spark-2.4.3 2../sbin/start-master.sh
4.用 numactl 命令啟動 8 個 spark workers,每個 worker 繫結到 12 個 vcpu。在 /opt/work/spark-2.4.3/bin 目錄下建立如下指令碼。
1.numactl -C 0-11 ./spark-class org.apache.spark.deploy.worker.Worker spark://$(hostname):7077 & 2.numactl -C 12-23 ./spark-class org.apache.spark.deploy.worker.Worker spark://$(hostname):7077 & 3.numactl -C 24-35 ./spark-class org.apache.spark.deploy.worker.Worker spark://$(hostname):7077 & 4.numactl -C 36-47 ./spark-class org.apache.spark.deploy.worker.Worker spark://$(hostname):7077 & 5.numactl -C 48-59 ./spark-class org.apache.spark.deploy.worker.Worker spark://$(hostname):7077 & 6.numactl -C 60-71 ./spark-class org.apache.spark.deploy.worker.Worker spark://$(hostname):7077 & 7.numactl -C 72-83 ./spark-class org.apache.spark.deploy.worker.Worker spark://$(hostname):7077 & 8.numactl -C 84-95 ./spark-class org.apache.spark.deploy.worker.Worker spark://$(hostname):7077 &
5.執行以下命令檢查,返回 8 表示已啟動了 8 個 Worker。
1.jps | grep Worker | wc -l
6.執行以下命令從 github 上下載 resnet50 示例程式碼。
1.git clone https://github.com/yangw1234/models-1.git 2.git checkout branch-1.6.1-zoo
7.在 models-1/models/image_recognition/tensorflow/resnet50v1_5/training/mlperf_resnet 目錄下執行 run.sh 指令碼,用--use_bfloat16 選項來開啟 bfloat16 訓練,不加此選項則預設為 FP32 訓練。
1.# Register the model as a source root 2.export PYTHONPATH="$(pwd):${PYTHONPATH}" 3.export KMP_BLOCKTIME=0 4.# 8 instances 5.export OMP_NUM_THREADS=6 6.export KMP_AFFINITY=granularity=fine,compact,1,0 7.export KMP_SETTINGS=1 8.export ANALYTICS_ZOO_HOME=/opt/work/analytics-zoo/dist 9.export SPARK_HOME=/opt/work/spark-2.4.3 10.bash $ANALYTICS_ZOO_HOME/bin/spark-submit-python-with-zoo.sh –master 11.spark://$(hostname):7077 \ 12.--executor-cores 1 --total-executor-cores 8 --driver-memory 20g --executor-memory 18g \ 13.--conf spark.network.timeout=10000000 --conf spark.executor.heartbeatInterval=100000 \ 14.imagenet_main.py 1 --model_dir ./logs --batch_size 128 --version 1 \ 15.--resnet_size 50 --train_epochs 90 --data_dir /opt/ILSVRC2012/ --use_bfloat16
本次訓練測試結果如下所示。
模型訓練 | FP32 | BF16 | BF16 相對 FP32 的效能提升 |
Throughput (images/sec) | 119.636 | 212.315 | 1.775 |
程式碼示例:Analytics Zoo 如何利用 bfloat16 加速深度模型訓練
下面的程式碼用於說明 Analytics Zoo 如何利用 bfloat16 來加速深度學習模型的訓練(例如 Resnet50 等)。在 Analytics Zoo 的 docker image 中已經包含,您不需要任何操作,僅作示例參考。
1.透過以下程式碼將輸入圖片轉換成 bfloat16 格式。
1.if use_bfloat16 == True: 2.dtype = tf.bfloat16 3.features = tf.cast(features, dtype)
2.透過以下程式碼編寫 custom_dtype_getter。
1.DEFAULT_DTYPE = tf.float32 2.CASTABLE_TYPES = (tf.float16,tf.bfloat16) 3.def _custom_dtype_getter(getter, name, shape=None, dtype=DEFAULT_DTYPE, 4. *args, **kwargs): 5.if dtype in CASTABLE_TYPES: 6. var = getter(name, shape, tf.float32, *args, **kwargs) 7.return tf.cast(var, dtype=dtype, name=name + '_cast') 8.else: 9.return getter(name, shape, dtype, *args, **kwargs)
3.透過以下程式碼建立 variable_scope,並在該 scope 下構建模型。
1.def _model_variable_scope():| 2.return tf.compat.v1.variable_scope('resnet_model', 3. custom_getter=_custom_dtype_getter) 4.with _model_variable_scope(): 5. logits = _resnet_50_model(features)
4.透過以下程式碼將 logits 裝換成 float32 計算 loss 以保證數值穩定性(numerical stability)。
1.logits = tf.cast(logits, tf.float32)
5.使用 Analytics TFPark 進行分散式訓練。具體操作,請參見 Analytics Zoo 分散式 TensorFlow。