谷歌云與 NVIDIA 合作,宣布 Dataflow 將 GPU 帶入大數(shù)據(jù)處理領(lǐng)域,開啟新的可能性。使用數(shù)據(jù)流 GPU ,用戶現(xiàn)在可以在機(jī)器學(xué)習(xí)推理工作流中利用 NVIDIA GPU 的強(qiáng)大功能。下面我們將向您展示如何使用 BERT 獲得這些性能優(yōu)勢(shì)。
Google Cloud 的 Dataflow 是一個(gè)托管服務(wù),用于執(zhí)行各種各樣的數(shù)據(jù)處理模式,包括流式處理和批處理分析。它最近添加了 GPU 支持 現(xiàn)在可以加速機(jī)器學(xué)習(xí)推理工作流,這些工作流運(yùn)行在數(shù)據(jù)流管道上。
請(qǐng)查看 谷歌云發(fā)布 了解更多令人興奮的新功能。在這篇文章中,我們將展示 NVIDIA GPU 加速的性能優(yōu)勢(shì)和 TCO 改進(jìn),方法是部署一個(gè)來(lái)自 Transformers ( BERT )模型的雙向編碼器表示,該模型對(duì)數(shù)據(jù)流上的“問(wèn)答”任務(wù)進(jìn)行了微調(diào)。我們將用 CPU 演示數(shù)據(jù)流中的 TensorFlow 推理,如何在 GPU 上運(yùn)行相同的代碼,并顯著提高性能,展示通過(guò) NVIDIA TensorRT 轉(zhuǎn)換模型后的最佳性能,以及通過(guò) TensorRT 的 python API 和數(shù)據(jù)流進(jìn)行部署。查看 NVIDIA 示例代碼 立即嘗試。
圖 1 .數(shù)據(jù)流架構(gòu)和 GPU 運(yùn)行時(shí)。
有幾個(gè)步驟,我們將在這個(gè)職位上觸及。我們首先在本地機(jī)器上創(chuàng)建一個(gè)環(huán)境來(lái)運(yùn)行所有這些數(shù)據(jù)流作業(yè)。
創(chuàng)造環(huán)境
建議為 Python 創(chuàng)建一個(gè)虛擬環(huán)境,我們?cè)谶@里使用 virtualenv :
virtualenv -p
使用 Dataflow 時(shí),需要將開發(fā)環(huán)境中的 Python 版本與 Dataflow 運(yùn)行時(shí) Python 版本對(duì)齊。更具體地說(shuō),在運(yùn)行數(shù)據(jù)流管道時(shí),應(yīng)該使用相同的 Python 版本和阿帕奇光束SDK 版本,以避免意外錯(cuò)誤。
現(xiàn)在,我們激活虛擬環(huán)境。
在激活虛擬環(huán)境之前需要注意的最重要的一點(diǎn)是確保您沒有在另一個(gè)虛擬環(huán)境中操作,因?yàn)檫@通常會(huì)導(dǎo)致問(wèn)題。
激活虛擬環(huán)境后,我們就可以安裝所需的軟件包了。即使我們的作業(yè)在 Dataflow 上運(yùn)行,我們?nèi)匀恍枰恍┍镜匕?,這樣當(dāng)我們?cè)诒镜剡\(yùn)行代碼時(shí) Python 就不會(huì)抱怨了。
pip install apache-beam[gcp]
pip install TensorFlow==2.3.1
您可以嘗試使用 TensorFlow 的不同版本,但這里的關(guān)鍵是將這里的版本與您將在數(shù)據(jù)流環(huán)境中使用的版本保持一致。 apachebeam 及其 Google 云組件也是必需的。
獲得微調(diào)的 BERT 模型
NVIDIA NGC 有大量的資源,從 GPU – 優(yōu)化的 containers 到微調(diào)的 models 。我們探索了幾個(gè) NGC 資源。
我們將使用的第一個(gè)資源是 BERT 大型模型,它針對(duì) SquadV2 問(wèn)答任務(wù)進(jìn)行了微調(diào),包含 3 。 4 億個(gè)參數(shù)。以下命令將下載 BERT model 。
wget --content-disposition
https://api.ngc.nvidia.com/v2/models/nvidia/bert_tf_savedmodel_large_qa_squad2_amp_384/versions/19.03.0/zip -O bert_tf_savedmodel_large_qa_squad2_amp_384_19.03.0.zip
對(duì)于我們剛剛下載的 BERT 模型,在訓(xùn)練過(guò)程中使用了自動(dòng)混合精度( AMP ),序列長(zhǎng)度為 384 。
我們還需要一個(gè)詞匯表文件,我們可以從 BERT 檢查點(diǎn)獲得它,該檢查點(diǎn)可以通過(guò)以下命令從 NGC 獲得:
wget --content-disposition
https://api.ngc.nvidia.com/v2/models/nvidia/bert_tf_ckpt_large_qa_squad2_amp_128/versions/19.03.1/zip -O bert_tf_ckpt_large_qa_squad2_amp_128_19.03.1.zip
在獲得這些資源之后,我們只需要解壓縮它們并將它們定位到我們的工作文件夾中。我們將使用自定義 docker 容器,這些模型將包含在我們的圖像中。
自定義 Dockerfile
我們將使用從 GPU 優(yōu)化的 NGC TensorFlow 容器派生的自定義 Dockerfile 。 NGC TensorFlow ( TF )容器是使用 NVIDIA GPU 加速 TF 模型的最佳選擇。
然后我們?cè)偬砑訋讉€(gè)步驟來(lái)復(fù)制這些模型和我們擁有的文件。您可以此處找到 Dockerfile ,下面是 Dockerfile 的快照。
FROM nvcr.io/nvidia/tensorflow:20.11-tf2-py3
RUN pip install --no-cache-dir apache-beam[gcp]==2.26.0 ipython pytest pandas && \
mkdir -p /workspace/tf_beam
COPY --from=apache/beam_python3.6_sdk:2.26.0 /opt/apache/beam /opt/apache/beam
ADD. /workspace/tf_beam
WORKDIR /workspace/tf_beam
ENTRYPOINT [ "/opt/apache/beam/boot"]
接下來(lái)的步驟是構(gòu)建 docker 文件并將其推送到 Google 容器注冊(cè)中心( GCR )。您可以使用以下命令執(zhí)行此操作?;蛘?,您可以在此處使用我們創(chuàng)建的腳本。如果您使用的是我們回購(gòu)的腳本,那么只需執(zhí)行bash build_and_push.sh
project_id=""
docker build . -t "gcr.io/${project_id}/tf-dataflow-${USER}:latest"
docker push "gcr.io/${project_id}/tf-dataflow-${USER}:latest"
正在運(yùn)行作業(yè)
如果您已經(jīng)驗(yàn)證了您的 Google 帳戶,只需調(diào)用 run_gpu.sh 和 run_gpu.sh 腳本即可運(yùn)行我們提供的 Python 文件 here 。
數(shù)據(jù)流中的 CPU TensorFlow 引用( TF- CPU )
repo 中的 bert_squad2_qa_cpu.py 文件用于根據(jù)描述文本文檔回答問(wèn)題。批量大小是 16 ,這意味著我們將在每個(gè)推理電話回答 16 個(gè)問(wèn)題,有 16000 個(gè)問(wèn)題( 1000 批問(wèn)題)。請(qǐng)注意, BERT 可以針對(duì)給定特定用例的其他任務(wù)進(jìn)行微調(diào)。
在 Dataflow 上運(yùn)行作業(yè)時(shí),默認(rèn)情況下,它會(huì)根據(jù)實(shí)時(shí) CPU 使用情況自動(dòng)縮放。如果要禁用此功能,需要將 autoscaling_algorithm 設(shè)置為 NONE 。這將允許您選擇在整個(gè)工作周期中使用多少工人?;蛘?,可以通過(guò)設(shè)置 max_num_workers parameter ,讓 Dataflow 自動(dòng)縮放作業(yè)并限制要使用的最大工作線程數(shù)。
我們建議設(shè)置作業(yè)名稱,而不是使用自動(dòng)生成的名稱,以便通過(guò)設(shè)置 job_name 參數(shù)更好地跟蹤作業(yè)。此作業(yè)名稱將是運(yùn)行作業(yè)的計(jì)算實(shí)例的前綴。
用 GPU 加速( TF- GPU )
要在 GPU 支持下執(zhí)行相同的數(shù)據(jù)流 TensorFlow 推斷作業(yè),我們需要設(shè)置以下參數(shù)。有關(guān)更多信息,請(qǐng)參閱數(shù)據(jù)流 GPU 文檔。
--experiment "worker_accelerator=type:nvidia-tesla-t4;count:1;install-nvidia-driver"
前面的參數(shù)使我們能夠?qū)⒁粋€(gè) CUDAT4 張量核連接到 Dataflow worker VM ,它也可以作為運(yùn)行作業(yè)的 Compute VM 實(shí)例看到。數(shù)據(jù)流將自動(dòng)安裝所需的支持 NVIDIA 11 的 NVIDIA 驅(qū)動(dòng)程序。
bert_squad2_qa_gpu.py
文件與bert_squad2_qa_cpu.py
文件幾乎相同。這意味著只需很少甚至不做任何更改,就可以使用 NVIDIA GPU s 運(yùn)行作業(yè)。在我們的示例中,我們有幾個(gè)額外的 GPU 設(shè)置,比如用下面的代碼設(shè)置內(nèi)存增長(zhǎng)。
physical_devices = tf.config.list_physical_devices('GPU')
tf.config.experimental.set_memory_growth(physical_devices[0], True)
NVIDIA 優(yōu)化庫(kù)的推理
NVIDIA TensorRT 優(yōu)化了推理的深度學(xué)習(xí)模型,并提供了低延遲和高吞吐量(對(duì)于更多的 information )。在這里,我們使用 NVIDIA TensorRT 優(yōu)化到 BERT 模型,并用它來(lái)回答 GPU 在光速下的數(shù)據(jù)流管道上的問(wèn)題。用戶可以按照 TensorRT 演示 BERT github 存儲(chǔ)庫(kù) 進(jìn)行操作。
我們還使用了 Polygraphy, ,它是 TensorRT 的高級(jí) python API 來(lái)加載 TensorRT 引擎文件并運(yùn)行推斷。在數(shù)據(jù)流代碼中, TensorRT 模型被封裝為一個(gè)共享實(shí)用程序類,允許來(lái)自數(shù)據(jù)流工作進(jìn)程的所有線程使用它。
比較 CPU 和 GPU 運(yùn)行
在表 10 中,我們提供了用于示例運(yùn)行的總運(yùn)行時(shí)間和資源。數(shù)據(jù)流作業(yè)的最終成本是總 v CPU 時(shí)間、總內(nèi)存時(shí)間和總硬盤使用量的線性組合。對(duì)于 GPU 情況,還有一個(gè) GPU 組件。
請(qǐng)注意,上表是基于一次運(yùn)行編譯的,確切的數(shù)字或許略有波動(dòng),但根據(jù)我們的實(shí)驗(yàn),比率變化不大。
當(dāng)使用 NVIDIA GPU( TF- GPU )加速我們的模型時(shí),與使用 CPU ( TF- CPU )相比,包括成本和運(yùn)行時(shí)在內(nèi)的總節(jié)省是 10 倍以上。這意味著,當(dāng)我們使用 NVIDIA GPU 來(lái)推斷此任務(wù)時(shí),與僅使用 CPU 運(yùn)行模型相比,我們可以獲得更快的運(yùn)行時(shí)間和更低的成本。
使用 NVIDIA 優(yōu)化的推理庫(kù)(如 TensorRT ),用戶可以在數(shù)據(jù)流中的 GPU 上運(yùn)行更復(fù)雜和更大的模型。 TensorRT 進(jìn)一步加速同一作業(yè),比使用 TF- GPU 運(yùn)行快 3 。 6 倍,從而節(jié)省 4 。 2 倍的成本。與 TensorRT 和 TF- CPU 相比,我們的執(zhí)行時(shí)間減少了 17 倍,提供的賬單減少了 38 倍。
概括
在本文中,我們比較了 TF- CPU 、 TF- GPU 和 TensorRT 在 Google 云數(shù)據(jù)流上運(yùn)行的問(wèn)答任務(wù)的推理性能。數(shù)據(jù)流用戶可以通過(guò)利用 GPU 工人和 NVIDIA 優(yōu)化庫(kù)獲得巨大的好處。
用 NVIDIA GPU s 和 NVIDIA 軟件加速深度學(xué)習(xí)模型推理非常簡(jiǎn)單。通過(guò)添加或更改兩行,我們可以使用 TF- GPU 或 TensorRT 運(yùn)行模型。我們?cè)谶@里和這里提供了腳本和源文件供參考。
關(guān)于作者
Ethem Can NVIDIA 的數(shù)據(jù)科學(xué)家。他在解決客戶問(wèn)題的機(jī)器學(xué)習(xí)應(yīng)用程序方面擁有超過(guò) 12 年的研發(fā)經(jīng)驗(yàn)。在 NVIDIA 之前,他是主要的機(jī)器學(xué)習(xí)開發(fā)人員。埃森完成了他的博士學(xué)位。在麻州大學(xué)計(jì)算機(jī)科學(xué)系, Amherst
Dong Meng 是 NVIDIA 的解決方案架構(gòu)工程師。董先生在大數(shù)據(jù)平臺(tái)和加速器性能優(yōu)化方面經(jīng)驗(yàn)豐富。他與公共云服務(wù)提供商合作,為機(jī)器學(xué)習(xí)培訓(xùn)/推理和數(shù)據(jù)分析部署基于云的 GPU 加速解決方案。
Rajan Arora 是 NVIDIA 的解決方案架構(gòu)師經(jīng)理,專門從事面向消費(fèi)互聯(lián)網(wǎng)行業(yè)的機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)應(yīng)用。 Rajan 在 NVIDIA 工作了 4 年多,致力于開發(fā)系統(tǒng)基礎(chǔ)設(shè)施和廣泛的深度學(xué)習(xí)應(yīng)用程序。他有博士學(xué)位。亞特蘭大喬治亞理工學(xué)院電子和計(jì)算機(jī)工程專業(yè)。
審核編輯:郭婷
-
NVIDIA
+關(guān)注
關(guān)注
14文章
4990瀏覽量
103120 -
gpu
+關(guān)注
關(guān)注
28文章
4742瀏覽量
128973
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論