aws技術有哪些(為機器學習推理開發的專用晶片)
2023-04-17 09:49:01 1
生活中很多經驗告訴我們,很多情況下,一些「專用」的東西,往往比「通用」的在執行具體任務時效果更好,例如為了分擔 CPU 負載,實現更強圖形處理性能,電腦開始配置專用的圖形處理器 GPU。這兩年,隨著機器學習技術的火熱,人們發現,用 GPU 來進行 ML 模型的訓練也是一種比較好的做法,速度更快,性能更強。
然而畢竟 GPU 誕生的本意就是用於處理計算機圖像的,並非「AI」專用,那麼有沒有專供機器學習使用的晶片,可以實現比 GPU 訓練更快的速度,以及更低的成本?
2019年底進行的年度 AWS re:Invent 大會上,最令人激動的新發布之一就是正式推出 AWS 自己設計和打造的 Inferentia 晶片,以更低成本提供更高性能的機器學習推理能力。
機器學習推理是使用經過訓練的模型做出預測的流程。經統計,在機器學習應用程式中,推理最多能夠佔到總成本的90%。其原因有二:
獨立 GPU 實例通常專為模型訓練而設計,而非用於推理。雖然訓練作業可並行批量處理大量數據樣本,但推理作業往往會實時處理單個輸入,因而僅佔用少量 GPU 計算。這使得獨立 GPU 推理成本高且效率低。獨立 CPU 實例並非專門用於矩陣運算,因此對於深度學習推理而言通常太慢。其次,不同模型對 CPU、GPU 和內存有不同要求,對一種資源進行優化可能導致對其他資源的利用不足和更高的成本。對於機器學習推理而言,AWS Inferentia 晶片的優勢可以總結為:高性能,低延遲,高易用。
每個 AWS Inferentia 晶片有4個處理核心 Neuron Core,能在低功率下支持高達 128 TOPS 的性能。AWS Inferentia 支持 FP16、BF16 和 INT8 數據類型,並且可接收 FP32 的訓練模型輸入,並使用 BF16 高速運行該模型。AWS Inferentia 具有大容量片上存儲,可用於緩存大型模型,從而無需將它們存儲到片外,這使得 Neuron Core 可對模型進行高速訪問,對於降低推理延遲具有顯著影響。AWS Inferentia 附帶了 AWS Neuron SDK,可使用 AWS Inferentia 在流行框架中創建和訓練複雜的神經網絡模型。Neuron 由編譯器、運行時和分析工具組成,並預先集成到流行的機器學習框架中,包括 TensorFlow、Pytorch 和 MXNet。基於 AWS Inferentia 晶片,AWS 在雲端提供了 EC2 Inf1 實例,將 Inferentia 晶片與 AWS Nitro 虛擬化管理程序、最新的第二代定製 Intel Xeon 可擴展處理器,以及高達 100Gbps 的網絡相結合,以實現高吞吐量推理。這一配置使 Inf1 實例提供了 Amazon EC2 G4 實例3倍的吞吐量和40%推理成本的降低(基於使用 TensorFlow 端到端運行 BERT 模型的結果)。
Inf1 實例的規格如下表所示。
使用 AWS Inferentia 進行機器學習的典型流程如下圖所示。通常,我們會在 GPU 實例上訓練機器學習模型,之後把訓練好的模型利用 AWS Neuron 重新編譯,然後將此模型交付給 Inf1 實例(AWS Inferentia 晶片)執行機器學習推理。
下面,我們通過一個樣例來看看如何使用 AWS Neuron 在 AWS Inferentia 晶片上進行機器學習推理。
在這裡,我們會用到 AWS Deep Learning AMI,它可以在 Amazon EC2 上一鍵式安裝機器學習的各種框架工具,從而加快在雲中進行機器學習的速度。最新的 Deep Learning AMI 已支持 AWS Inferentia,並附帶 AWS Neuron 開發所需的工具包(Neuron SDK)。
我們在 us-west-2 區域以 Deep Learning AMI (Ubuntu 18.04) Version 27.0 – ami-008d8ed4bd7dc2485 做為系統鏡像,啟動 Inf1.2xlarge 實例。啟動 Inf1 實例後,使用以下命令升級到最新版 Neuron 運行時環境和工具包:
$ sudo apt-get update $ sudo apt-get install aws-neuron-runtime $ sudo apt-get install aws-neuron-tools
隨後我們就能用 neuron-ls 命令顯示 Inf1 實例上的 Inferentia 晶片數量和信息:
$ neuron-ls -------------- --------- -------- ----------- ----------- ------ ------ | PCI BDF | LOGICAL | NEURON | MEMORY | MEMORY | EAST | WEST | | | ID | CORES | CHANNEL 0 | CHANNEL 1 | | | -------------- --------- -------- ----------- ----------- ------ ------ | 0000:00:1f.0 | 0 | 4 | 4096 MB | 4096 MB | 0 | 0 | -------------- --------- -------- ----------- ----------- ------ ------
在輸出的表格中,第一列顯示了 PCI 總線設備功能 ID。第二列顯示分配給設備的邏輯 ID。這個邏輯 ID 在 Neuron 運行時守護進程 (Runtime Daemon)(Neuron rtd)配置期間使用。第三列顯示可用的 Neuron Core 數量。最後兩列顯示與任何其他 Inferentia 設備的連接。
因為我們選擇的 Inf1.2xlarge 只有一個 Inferentia 晶片,所以這兩列為空(如果啟動 Inf1.6xlarge 或 Inf1.24xlarge 這兩種帶有多個 Inferentia 晶片的實例,這兩列會顯示 Inferentia 晶片的互聯信息)。
搭建好環境後,來看一下如何使用 AWS Neuron 和 Tensorflow 進行深度學習推理。整個過程分為兩個階段:編譯階段和推理階段。
在第一階段,我們將編譯 TensorFlow Neuron 中預訓練的 Keras ResNet50 模型,並將其導出為 SavedModel,一種 TensorFlow 模型的交換格式。
首先激活 TensorFlow-Neuron conda 虛擬環境。使用虛擬環境能夠確保在使用深度學習框架時對包的管理有最佳的靈活性,這也是深度學習的一個最佳實踐。
$ source activate aws_neuron_tensorflow_p36
隨後使用以下命令更新 Neuron 包到最新版本:
$ conda update tensorflow-neuron
接下來,創建一個名為 tensorflow_compile_resnet50.py 的 Python 腳本,此 Python 腳本使用 AWS Neuron 編譯 Keras ResNet50 模型,並將其導出為 TensorFlow SavedModel 格式。
import os import time import shutil import tensorflow as tf import tensorflow.neuron as tfn import tensorflow.compat.v1.keras as keras from tensorflow.keras.applications.resnet50 import ResNet50 from tensorflow.keras.applications.resnet50 import preprocess_input # Create a workspace WORKSPACE = './ws_resnet50' os.makedirs(WORKSPACE, exist_ok=True) # Prepare export directory (old one removed) model_dir = os.path.join(WORKSPACE, 'resnet50') compiled_model_dir = os.path.join(WORKSPACE, 'resnet50_neuron') shutil.rmtree(model_dir, ignore_errors=True) shutil.rmtree(compiled_model_dir, ignore_errors=True) # Instantiate Keras ResNet50 model keras.backend.set_learning_phase(0) model = ResNet50(weights='imagenet') # Export SavedModel tf.saved_model.simple_save( session = keras.backend.get_session, export_dir = model_dir, inputs = {'input': model.inputs[0]}, outputs = {'output': model.outputs[0]}) # Compile using Neuron tfn.saved_model.compile(model_dir, compiled_model_dir, compiler_args =['--num-neuroncores', '4']) # Prepare SavedModel for uploading to Inf1 instance shutil.make_archive(compiled_model_dir, 'zip', WORKSPACE, 'resnet50_neuron')
這裡有兩點需要注意:
Resnet50 的模型有2000多萬個參數。使用 FP32格式,每個參數4位元組。AWS Neuron 編譯器自動將它們轉換為 BF16,每個參數2位元組,這是一種更有效的數據格式,Neuron Core 在硬體上原生支持這種格式;由於啟用的 inf1.2xlarge 實例有4個 Neuron Core,設置 compiler_args =[『–num-neuroncores』, 『4』],會將模型定位並優化於4個 Neuron Core 上運行。此參數的默認值為1,我們需要確保參數設置為啟動的 Inf1 實例上的 Neuron Core 的數量。隨後使用以下命令編譯模型:
$ python tensorflow_compile_resnet50.py
編譯過程大約需要幾分鐘時間,輸出應包含如下信息:
... INFO:tensorflow:fusing subgraph neuron_op_d6f098c01c780733 with neuron-cc INFO:tensorflow:Number of operations in TensorFlow session: 4638 INFO:tensorflow:Number of operations after tf.neuron optimizations: 556 INFO:tensorflow:Number of operations placed on Neuron runtime: 554 INFO:tensorflow:Successfully converted ./ws_resnet50/resnet50 to ./ws_resnet50/resnet50_neuron ...
編譯後,保存的模型以壓縮格式存儲在 ws_resnet50/resnet50_neuron.zip,使用以下命令解壓縮模型:
$ unzip ws_resnet50/resnet50_neuron.zip -d .
在第二階段,我們會使用在第一階段編譯的推理模型在示例圖像上運行推理。
首先,下載一幅用於推理的示例圖像:
$ curl -O https://raw.githubusercontent.com/awslabs/mxnet-model-server/master/docs/images/kitten_small.jpg
隨後創建一個名為 tensorflow_infer_resnet50.py 的 Python 腳本,該腳本包含以下內容,使用在第一階段編譯好的模型在 AWS Inferentia 上進行推理。
import os import numpy as np import tensorflow as tf from tensorflow.keras.preprocessing import image from tensorflow.keras.applications import resnet50 # Create input from image img_sgl = image.load_img('kitten_small.jpg', target_size=(224, 224)) img_arr = image.img_to_array(img_sgl) img_arr2 = np.expand_dims(img_arr, axis=0) img_arr3 = resnet50.preprocess_input(img_arr2) # Load model COMPILED_MODEL_DIR = './resnet50_neuron/' predictor_inferentia = tf.contrib.predictor.from_saved_model(COMPILED_MODEL_DIR) # Run inference model_feed_dict={'input': img_arr3} infa_rslts = predictor_inferentia(model_feed_dict); # Display results print(resnet50.decode_predictions(infa_rslts["output"], top=5)[0])
這樣,我們就可以使用以下命令運行推理操作:
$ python tensorflow_infer_resnet50.py
輸出應該如下所示:
... [('n02123045', 'tabby', 0.6918919), ('n02127052', 'lynx', 0.12770271), ('n02123159', 'tiger_cat', 0.08277027), ('n02124075', 'Egyptian_cat', 0.06418919), ('n02128757', 'snow_leopard', 0.009290541)]
總結
通過上述樣例,我們看到了使用 AWS Neuron SDK 在 AWS Inferentia 晶片上進行機器學習推理的全過程,也希望藉此能夠幫助大家把更多的機器學習應用在雲端部署以獲得最佳的體驗。
覺得文章不錯的話,麻煩大家轉發和關注,小編為大家也準備了一些資料,回復資料二字即可獲得
作者:AWS_AI開發者社區 連結:https://segmentfault.com/a/1190000023277983 來源:SegmentFault 思否 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
,