這是關于 NVIDIA 工具的兩部分系列的第二部分,這些工具允許您運行大型Transformer模型以加速推理。
簡介
這篇文章是大型Transformer模型(例如 EleutherAI 的 GPT-J 6B 和 Google 的 T5-3B)的優(yōu)化推理指南。這兩種模型在許多下游任務中都表現(xiàn)出良好的效果,并且是研究人員和數(shù)據(jù)科學家最常用的模型之一。
NVIDIA Triton 中的 NVIDIA FasterTransformer (FT) 允許您以類似且簡單的方式運行這兩個模型,同時提供足夠的靈活性來集成/組合其他推理或訓練管道。相同的 NVIDIA 軟件堆棧可用于在多個節(jié)點上結(jié)合張量并行 (TP) 和管道并行 (PP) 技術來推斷萬億參數(shù)模型。
Transformer模型越來越多地用于眾多領域,并表現(xiàn)出出色的準確性。更重要的是,模型的大小直接影響其質(zhì)量。除了 NLP,這也適用于其他領域。
來自谷歌的研究人員證明,基于轉(zhuǎn)換器的文本編碼器的縮放對于他們的 Imagen 模型中的整個圖像生成管道至關重要,這是最新的也是最有前途的生成文本到圖像模型之一。縮放轉(zhuǎn)換器可以在單域和多域管道中產(chǎn)生出色的結(jié)果。本指南使用相同結(jié)構和相似尺寸的基于Transformer的模型。
主要步驟概述
本節(jié)介紹使用 FasterTransformer 和 Triton 推理服務器在優(yōu)化推理中運行 T5 和 GPT-J 的主要步驟。 下圖展示了一個神經(jīng)網(wǎng)絡的整個過程。
您可以使用 GitHub 上的逐步快速transformer_backend notebook 重現(xiàn)所有步驟。
強烈建議在 Docker 容器中執(zhí)行所有步驟以重現(xiàn)結(jié)果。 有關準備 FasterTransformer Docker 容器的說明可在同一notebook 的開頭找到。
如果您已經(jīng)預訓練了其中一個模型,則必須將框架保存模型文件中的權重轉(zhuǎn)換為 FT 可識別的二進制格式。 FasterTransformer 存儲庫中提供了轉(zhuǎn)換腳本。
圖 1.具有 FasterTransformer 和 Triton ?聲波風廓線儀的 transformer 神經(jīng)網(wǎng)絡的整體管道
步驟 1 和 2 :使用 Triton 推理服務器和 FasterTransformer 后端構建 Docker 容器。 使用 Triton 推理服務器作為向 FasterTransformer 后端代理請求的主要服務工具。
步驟 3 和 4 :構建 FasterTransformer 庫。 該庫包含許多用于推理準備的有用工具以及多種語言的綁定以及如何在 C++ 和 Python 中進行推理的示例。
步驟 5 和 6 :下載預訓練模型(T5-3B 和 GPT-J)的權重,并通過將它們轉(zhuǎn)換為二進制格式并將它們拆分為多個分區(qū)以實現(xiàn)并行性和加速推理,為使用 FT 進行推理做好準備。 此步驟中將使用 FasterTransformer 庫中的代碼。
步驟 7 :使用 FasterTransformer 庫中的代碼為 NN 找到最佳的低級內(nèi)核。
步驟 8 :啟動 Triton 服務器,該服務器使用前面步驟中的所有工件并運行 Python 客戶端代碼以向具有加速模型的服務器發(fā)送請求
步驟 1 :從 Triton GitHub 存儲庫中克隆 fastertransformer_backend
克隆 fastertransformer_backend GitHub 的回購協(xié)議:
git clone https://github.com/triton-inference-server/fastertransformer_backend.git
cd fastertransformer_backend && git checkout -b t5_gptj_blog remotes/origin/dev/t5_gptj_blog
步驟 2 :使用 Triton 和 FasterTransformer 庫構建 Docker 容器
使用以下文件構建 Docker 映像:
docker build --rm --build-arg TRITON_VERSION=22.03 -t triton_with_ft:22.03 \ -f docker/Dockerfile .
cd ../
運行 Docker 容器并使用以下代碼啟動交互式 bash 會話:
docker run -it --rm --gpus=all --shm-size=4G -v $(pwd):/ft_workspace \ -p 8888:8888 triton_with_ft:22.03 bash
所有進一步的步驟都需要在 Docker 容器交互式會話中運行。這個容器中還需要 Jupyter Lab 來處理提供的筆記本。
apt install jupyter-lab && jupyter lab -ip 0.0.0.0
Docker 容器是用 Triton 和 FasterTransformer 構建的,并從內(nèi)部的 FasterTransformer _ backend 源代碼開始。
步驟 3 和 4 :克隆 FasterTransformer 源代碼并構建庫
FasterTransformer 庫是預先構建的,并在 Docker 構建過程中放入我們的容器中。
從 GitHub 下載 FasterTransformer 源代碼,使用額外的腳本,將 GPT-J 或 T5 的預先訓練的模型文件轉(zhuǎn)換為 FT 二進制格式,在推斷時使用。
git clone https://github.com/NVIDIA/FasterTransformer.git
該庫能夠在以后運行內(nèi)核自動調(diào)諧代碼:
mkdir -p FasterTransformer/build && cd FasterTransformer/build
git submodule init && git submodule update
cmake -DSM=xx -DCMAKE_BUILD_TYPE=Release -DBUILD_PYT=ON -DBUILD_MULTI_GPU=ON ..
make -j32
GPT-J 推理
GPT-J 是由 EleutherAI 開發(fā)的解碼器模型,并在 The Pile 上進行了訓練,該數(shù)據(jù)集是從多個來源策劃的 825GB 數(shù)據(jù)集。 GPT-J 擁有 60 億個參數(shù),是最大的類似 GPT 的公開發(fā)布模型之一。
FasterTransformer 后端在 fasttransformer_backend/all_models/gptj 下有一個 GPT-J 模型的配置。這個配置是 Triton 合奏的完美演示。 Triton 允許您運行單個模型推理,以及構建包含推理任務所需的許多模型的復雜管道/管道。
您還可以在任何神經(jīng)網(wǎng)絡之前或之后添加額外的 Python/C++ 腳本,用于可以將您的數(shù)據(jù)/結(jié)果轉(zhuǎn)換為最終形式的預處理/后處理步驟。
GPT-J 推理管道在服務器端包括三個不同的順序步驟:
預處理 -》 FasterTransformer -》 后處理
配置文件將所有三個階段組合到一個管道中。下圖說明了客戶端-服務器推理方案。
圖 2.FasterTransformer 和 Triton ?聲波風廓線儀的 GPT-J 推斷。集成方案,所有預處理和后處理步驟都發(fā)生在服務器端
步驟 5-8 對于 GPT-J 和 T5 都是相同的,如下所示( GPT 先, T5 后)。
步驟 5 ( GPT-J ):下載并準備 GPT-J 模型的權重
wget https://mystic.the-eye.eu/public/AI/GPT-J-6B/step_383500_slim.tar.zstd
tar -axf step_383500_slim.tar.zstd -C ./models/
這些權重需要轉(zhuǎn)換為 C++ FasterTransformer 后端識別的二進制格式。 FasterTransformer 為不同的預訓練神經(jīng)網(wǎng)絡提供工具/腳本。
對于 GPT-J 權重,您可以使用以下腳本:
FasterTransformer/examples/pytorch/gptj/utils/gptj_ckpt_convert.py將檢查點轉(zhuǎn)換如下:
步驟 6 ( GPT-J ):將權重轉(zhuǎn)換為 FT 格式
python3 ./FasterTransformer/examples/pytorch/gptj/utils/gptj_ckpt_convert.py \ --output-dir ./models/j6b_ckpt \ --ckpt-dir ./step_383500/ \ --n-inference-gpus 2
n-inference-gpus指定張量并行的 GPU 數(shù)量。該腳本將創(chuàng)建。/ models / j6b _ ckpt / 2- GPU 目錄,并在那里自動寫入準備好的權重。這些權重將為張量平行 2 推斷做好準備。使用此參數(shù),您可以將權重拆分為更大數(shù)量的 GPU ,以使用 TP 技術實現(xiàn)更高的速度。
步驟 7 ( GPT-J ):用于 GPT-J 推理的內(nèi)核自動調(diào)諧
下一步是內(nèi)核自動調(diào)整。 矩陣乘法是基于Transformer的神經(jīng)網(wǎng)絡中主要和最繁重的操作。 FT 使用來自 CuBLAS 和 CuTLASS 庫的功能來執(zhí)行此類操作。 需要注意的是,MatMul 操作可以在“硬件”級別使用不同的低級算法以數(shù)十種不同的方式執(zhí)行。
FasterTransformer 庫有一個腳本,允許對所有低級算法進行實時基準測試,并為模型的參數(shù)(注意層的大小、注意頭的數(shù)量、隱藏層的大小)和 你的輸入數(shù)據(jù)。 此步驟是可選的,但可以實現(xiàn)更高的推理速度。
運行在構建 FasterTransformer 庫階段構建的 。/FasterTransformer/build/bin/gpt_gemm 二進制文件。 腳本的參數(shù)可以在 GitHub 的文檔中找到,或者使用 –help 參數(shù)。
./FasterTransformer/build/bin/gpt_gemm 8 1 32 12 128 6144 51200 1 2
步驟 8 ( GPT-J ):準備 Triton 配置并為模型服務
權重就緒后,下一步是為 GPT-J 模型準備 Triton 配置文件。在 fastertransformer _ backend / all _ models / gptj / fasterTransormer / config 打開 GPT-J 模型的主 Triton 配置。用于編輯的 pbtxt 。只有兩個強制參數(shù)需要在那里更改才能開始推斷。
更新 tensor _ para _ size 。為兩個 GPU 準備了權重,因此將其設置為 2 。
parameters { key: "tensor_para_size" value: { string_value: "2" }
}
更新上一步中檢查點文件夾的路徑:
parameters { key: "model_checkpoint_path" value: { string_value: "./models/j6b_ckpt/2-gpu/" }
}
現(xiàn)在使用 Triton 后端和 GPT-J 啟動 Parabricks 推理服務器:
CUDA_VISIBLE_DEVICES=0,1 /opt/tritonserver/bin/tritonserver --model-repository=./triton-model-store/gptj/ &
如果 Triton 成功啟動,您將看到輸出線,通知模型由 Parabricks 加載,并且服務器正在監(jiān)聽指定端口的傳入請求:
# Info about T5 model that was found by the Triton in our directory: +-------------------+---------+--------+
| Model | Version | Status |
+-------------------+---------+--------+
| fastertransformer | 1 | READY |
+-------------------+---------+--------+ # Info about that Triton successfully started and waiting for HTTP/GRPC requests: I0503 17:26:25.226719 1668 grpc_server.cc:4421] Started GRPCInferenceService at 0.0.0.0:8001
I0503 17:26:25.227017 1668 http_server.cc:3113] Started HTTPService at 0.0.0.0:8000
I0503 17:26:25.283046 1668 http_server.cc:178] Started Metrics Service at 0.0.0.0:8002
接下來,將推斷請求發(fā)送到服務器。在客戶端, tritonclient Python 庫允許從任何 Python 應用程序與我們的服務器通信。
這個帶有 GPT-J 的示例將文本數(shù)據(jù)直接發(fā)送到 Triton 服務器,所有預處理和后處理都將在服務器端進行。完整的客戶端腳本可以在 fastertransformer _ backend / tools / end _ to _ end _ test 中找到。 py 或提供的 Jupyter 筆記本中。
主要部分包括:
# Import libraries
import tritonclient.http as httpclient # Initizlize client
client = httpclient.InferenceServerClient("localhost:8000", concurrency=1, verbose=False)
# ... # Request text promp from user
print("Write any input prompt for the model and press ENTER:")
# Prepare tokens for sending to the server
inputs = prepare_inputs( [[input()]])
# Sending request
result = client.infer(MODEl_GPTJ_FASTERTRANSFORMER, inputs)
print(result.as_numpy("OUTPUT_0"))
T5 推理
T5(Text-to-Text Transfer Transformer)是谷歌最近創(chuàng)建的架構。它由編碼器和解碼器部分組成,是完整Transformer架構的一個實例。它將所有自然語言處理 (NLP) 任務重新構建為統(tǒng)一的文本到文本格式,其中輸入和輸出始終是文本字符串。
本節(jié)準備的 T5 推理管道與 GPT-J 模型的不同之處在于,只有 NN 推理階段位于服務器端,而不是具有數(shù)據(jù)預處理和后處理結(jié)果的完整管道。預處理和后處理階段的所有計算都發(fā)生在客戶端。
Triton 允許您靈活地配置推理,因此也可以在服務器端構建完整的管道,但其他配置也是可能的。
首先,使用客戶端的 Huggingface 庫在 Python 中將文本轉(zhuǎn)換為標記。接下來,向服務器發(fā)送推理請求。最后,在得到服務器的響應后,在客戶端將生成的令牌轉(zhuǎn)換為文本。
下圖說明了客戶端-服務器推理方案。
圖 3.更快 transformer 和 Triton ?聲波風廓線儀的 T5 推斷。所有的預處理和后處理步驟都發(fā)生在客戶端,只有重推理部分計算在服務器上。
T5 的制備步驟與 GPT-J 相同。 T5 步驟 5-8 的詳細信息如下:
步驟 5 ( T5 ):下載 T5-3B 的權重
首先下載 T5 3b 大小的權重。您必須安裝 git lfs 才能成功下載權重。
git clone https://huggingface.co/t5-3b
步驟 6 ( T5 ):將權重轉(zhuǎn)換為 FT 格式
同樣,權重需要轉(zhuǎn)換為 C++ FasterTransformer 后端識別的二進制格式。 對于 T5 權重,您可以使用 FasterTransformer/blob/main/examples/pytorch/t5/utils/huggingface_t5_ckpt_convert.py 中的腳本來轉(zhuǎn)換檢查點。
轉(zhuǎn)換器需要以下參數(shù)。 與 GPT-J 非常相似,但參數(shù) i_g 表示 GPU 的數(shù)量將用于 TP 機制中的推理,因此將其設置為 2:
python3 FasterTransformer/examples/pytorch/t5/utils/huggingface_t5_ckpt_convert.py\ -i t5-3b/ \ -o ./models/t5-3b/ \ -i_g 2
步驟 7 ( T5 ): T5-3B 推理的內(nèi)核自動調(diào)諧
下一步是使用 t5_gemm 二進制文件對 T5 進行內(nèi)核自動調(diào)整,該文件將運行實驗以對 T5 模型的最重部分進行基準測試,并找到最佳的低級內(nèi)核。 運行在構建 FasterTransformer 庫(步驟 2)階段構建的 。/FasterTransformer/build/bin/t5_gemm 二進制文件。 此步驟是可選的,但包含它可以實現(xiàn)更高的推理速度。 同樣,腳本的參數(shù)可以在 GitHub 的文檔中找到,或者使用 –help 參數(shù)。
./FasterTransformer/build/bin/t5_gemm 1 1 32 1024 32 128 16384 1024 32 128 16384 32128 1 2 1 1
步驟 8 ( T5 ):準備 T5 模型的 Triton 配置
您必須為 T5 模型 triton-model-store/t5/fastertransformer/config.pbtxt 打開復制的 Triton 配置進行編輯。 那里只需要更改兩個強制參數(shù)即可開始推理。
然后更新 tensor_para_size。 為兩個 GPU 準備了權重,因此將其設置為 2。
parameters { key: "tensor_para_size" value: { string_value: "2" }
}
接下來,使用權重更新文件夾的路徑:
parameters { key: "model_checkpoint_path" value: { string_value: "./models/t5-3b/2-gpu/" }
}
啟動 Triton 推理服務器。更新上一步中準備的轉(zhuǎn)換模型的路徑:
CUDA_VISIBLE_DEVICES=0,1 /opt/tritonserver/bin/tritonserver \ --model-repository=./triton-model-store/t5/
如果 Triton 成功啟動,您將在輸出中看到以下幾行:
# Info about T5 model that was found by the Triton in our directory: +-------------------+---------+--------+
| Model | Version | Status |
+-------------------+---------+--------+
| fastertransformer | 1 | READY |
+-------------------+---------+--------+ # Info about that Triton successfully started and waiting for HTTP/GRPC requests: I0503 17:26:25.226719 1668 grpc_server.cc:4421] Started GRPCInferenceService at 0.0.0.0:8001
I0503 17:26:25.227017 1668 http_server.cc:3113] Started HTTPService at 0.0.0.0:8000
I0503 17:26:25.283046 1668 http_server.cc:178] Started Metrics Service at 0.0.0.0:8002
現(xiàn)在運行客戶端腳本。在客戶端,使用 Huggingface 庫將文本輸入轉(zhuǎn)換為令牌,然后使用 Python 的 tritonclient 庫向服務器發(fā)送請求。為此實現(xiàn)函數(shù)預處理。
然后使用 tritonclient http 類的實例,該類將請求服務器上的 8000 端口(“本地主機”,如果在本地部署)通過 http 向模型發(fā)送令牌。
收到包含令牌的響應后,再次使用后處理助手函數(shù)將令牌轉(zhuǎn)換為文本形式。
# Import libraries
from transformers import ( T5Tokenizer, T5TokenizerFast
) import tritonclient.http as httpclient # Initialize client
client = httpclient.InferenceServerClient( URL, concurrency=request_parallelism, verbose=verbose
) # Initialize tokenizers from HuggingFace to do pre and post processings # (convert text into tokens and backward) at the client side
tokenizer = T5Tokenizer.from_pretrained(MODEL_T5_HUGGINGFACE, model_max_length=1024)
fast_tokenizer = T5TokenizerFast.from_pretrained(MODEL_T5_HUGGINGFACE, model_max_length=1024) # Implement the function that takes text converts it into the tokens using # HFtokenizer and prepares tensorts for sending to Triton
def preprocess(t5_task_input): ... # Implement function that takes tokens from Triton's response and converts # them into text
def postprocess(result): ... # Run translation task with T5
text = "Translate English to German: He swung back the fishing pole and cast the line."
inputs = preprocess(text)
result = client.infer(MODEl_T5_FASTERTRANSFORMER, inputs)
postprocess(result)
添加自定義層和新的 NN 架構
如果您有一些內(nèi)部帶有轉(zhuǎn)換器塊的自定義神經(jīng)網(wǎng)絡,或者您已將一些自定義層添加到 FT(T5、GPT)支持的默認 NN 中,則 FT 開箱即用將不支持此 NN。 您可以通過添加對新層的支持來更改 FT 的源代碼以添加對此 NN 的支持,或者您可以使用 FT 塊和 C++、PyTorch 和 TensorFlow API 將來自 FT 的快速轉(zhuǎn)換器塊集成到您的自定義推理腳本/管道中 。
結(jié)果
FasterTransformer 執(zhí)行的優(yōu)化在 FP16 模式下實現(xiàn)了比原生 PyTorch GPU 推理最高 6 倍的加速,以及對 GPT-J 和 T5-3B 的 PyTorch CPU 推理最高 33 倍的加速。
下圖顯示了 GPT-J 的推理結(jié)果,顯示了 T5-3B 模型在批量大小為 1 的翻譯任務的推理結(jié)果。
圖 4.GPT-J 6B 模型推斷和加速比較
圖 5.T5-3B 模型推斷加速比較
模型越小,batch size 越大,F(xiàn)asterTransformer 表現(xiàn)出的優(yōu)化就越好,因為計算帶寬增加了。 下圖顯示了 T5-small 模型,其測試可以在 FasterTrasformer GitHub 上找到。 與 GPU PyTorch 推理相比,它展示了約 22 倍的吞吐量增加。 可以在 GitHub 上找到基于 T5 的模型的類似結(jié)果。
圖 6.T5 小模型推斷比較
結(jié)論
這里演示的代碼示例使用 FasterTransformer 和 Triton 推理服務器來運行 GPT-J-6B 和 T5-3B 模型的推理。與 CPU 相比,它實現(xiàn)了高達 33 倍的加速,與 GPU 上的原生 PyTorch 后端相比,它達到了 22 倍。
同樣的方法也可以用于小型 transformer 模型,如 T5 small 和 BERT ,以及具有數(shù)萬億參數(shù)的大型模型,如 GPT-3 。 Triton 和 FasterTransformer 使用張量和管道并行等技術提供優(yōu)化和高度加速的推理,以實現(xiàn)所有模型的低延遲和高吞吐量。
閱讀更多關于 Triton 和 FasterTransformer 或訪問 fastertransformer_backend 本文中使用的示例。
大型模型的訓練和推理是人工智能和高性能計算之間的一項非常重要的任務。如果您對大型神經(jīng)網(wǎng)絡感興趣, NVIDIA 發(fā)布了多種工具,可以幫助您以最簡單、最有效的方式充分利用這些工具。
關于作者
Denis Timonin 是一名深度學習解決方案架構師和工程師,目前在 NVIDIA 從事世界上最大的神經(jīng)網(wǎng)絡的訓練和推理,并在計算機視覺、自然語言處理和自動語音識別領域構建人工智能解決方案。在此之前,丹尼斯在華為研究了移動設備的小型精確神經(jīng)網(wǎng)絡,并構建了復雜的人工智能管道,用于金融數(shù)據(jù)分類、醫(yī)學圖像分割、目標檢測和跟蹤。
Bo Yang Hsueh 是 FasterTransformer 的領導者和主要開發(fā)人員。三年前他參加了 transformer 加速賽。最近,他專注于大型 NLP 模型加速,包括 T5 和 GPT-J 等公共模型。楊波獲得國立交通大學計算機科學碩士學位。
Vinh Nguyen 是一位深度學習的工程師和數(shù)據(jù)科學家,發(fā)表了 50 多篇科學文章,引文超過 2500 篇。在 NVIDIA ,他的工作涉及廣泛的深度學習和人工智能應用,包括語音、語言和視覺處理以及推薦系統(tǒng)。 看所有的位置由 Vinh Nguyen
審核編輯:郭婷
-
NVIDIA
+關注
關注
14文章
5013瀏覽量
103247 -
服務器
+關注
關注
12文章
9233瀏覽量
85626 -
人工智能
+關注
關注
1792文章
47411瀏覽量
238926
發(fā)布評論請先 登錄
相關推薦
評論