經過前兩期的課程
相信大家已經能快速上手使用
Amazon SageMaker啦
那麼這一期的內容
少點理論多點實戰
快來跟小編一起學習實操
如何使用 Amazon SageMaker
運行基於 TensorFlow 的中文命名實體識別
在我們開始實操課程前,先來點擊以下視頻了解如何在 Amazon SageMaker 上使用多種有趣的深度學習框架 (TensorFlow, MXNet, PyTorch等),為你即將開始的編寫模型及從開源系統導入模型之旅打下基礎。
雖然 Amazon SageMaker 有著多種有趣的深度學習方式,但今天小編將首先就 TensorFlow 這一深度學習框架進行分享與講解(悄悄告訴你們,後續還有更多精彩,記得隨時關注哦~)。
那麼,到底什麼是 Tensor Flow ?
TensorFlow 是廣泛被用於開發大型深度神經網絡 (DNN) 的開源機器學習 (ML) 庫,此類 DNN 需要分布式訓練,並且在多個主機上使用多個 GPU。
Amazon SageMaker 是一項託管服務,可通過主動學習、超參數優化、模型分布式訓練、監控訓練進展,部署培訓模型作為自動擴展的 RESTful 服務,以及對並發 ML 實驗進行集中式管理,從標籤數據開始簡化 ML 工作流。
掃描下方二維碼獲取更多TensorFlow相關知識
本文將重點討論使用 Amazon SageMaker 進行分布式 TensorFlow 訓練。
好啦,前期鋪墊已經打好
硬核實操知識轟炸就要開啟
如何使用 Amazon SageMaker
運行基於 TensorFlow 的中文命名實體識別
接下來的實操教程時間
細節多,知識硬,內容夯
請千萬不要走神開小差~
利用業內數據構建知識圖譜是很多客戶正在面臨的問題,其中中文命名實體識別(Named Entity Recognition,簡稱 NER)是構建知識圖譜的一個重要環節。我們在與客戶的交流中發現,現有的 NER 工具(比如 Jiagu)對於特定領域的中文命名實體識別效果難以滿足業務需求,而且這些工具很難使用自定義數據集訓練。因此客戶迫切想使用業內最先進的算法在行業內數據集上進行訓練,以改進現有 NER 工具的不足。
本文將介紹如何使用 Amazon SageMaker 運行基於 TensorFlow 的中文命名實體識別。
命名實體識別,是指識別文本中具有特定意義的實體,主要包括人名、地名、機構名、專有名詞等。命名實體識別是信息提取、問答系統、句法分析、機器翻譯、知識圖譜等應用領域的重要基礎工具。
英語中的命名實體具有比較明顯的形式標誌(即實體中的每個詞的第一個字母要大寫),所以實體邊界識別相對容易,任務的重點是確定實體的類別。和英語相比,中文命名實體識別任務更加複雜,而且相對於實體類別標註子任務,實體邊界的識別更加困難。
NER 一直是自然語言處理(NLP)領域中的研究熱點,從早期基於詞典和規則的方法,到傳統機器學習的方法,到近年來基於深度學習的方法,NER 研究進展的大概趨勢大致如下圖所示。
早期的命名實體識別方法基本都是基於規則的。之後由於基於大規模的語料庫的統計方法在自然語言處理各個方面取得不錯的效果之後,一大批機器學習的方法也出現在命名實體類識別任務。
值得一提的是,由於深度學習在自然語言的廣泛應用,基於深度學習的命名實體識別方法也展現出不錯的效果,此類方法基本還是把命名實體識別當做序列標註任務來做,比較經典的方法是 LSTM+CRF 、 BiLSTM+CRF 。
我們知道,預訓練模型可以大幅提升計算機視覺的深度學習算法表現,而在 NLP 領域也是同理,預訓練語言模型可以有效提升文本分類、機器翻譯、命名實體識別等任務的效果。預訓練語言模型經歷了從詞嵌入(Word Embedding),到 BERT ,再到 ALBERT 的演進。
BERT 的全稱是 Bidirectional Encoder Representation from Transformers ,即雙向Transformer的編碼器(Encoder),因為解碼器(Decoder)是不能獲得要預測的信息的。模型的主要創新點都在預訓練方法上,即用了 Masked LM 和 Next Sentence Prediction 兩種方法分別捕捉詞語和句子級別的表示。
ALBERT(見參考資料4)基於 BERT ,但有一些改進,它可以在主要基準測試上獲得最先進的性能,而參數卻減少了 30 %。比如,對於 albert_base_zh ,它只有原始 BERT 模型的 10 %的參數,但是保留了主要精度。
本文將使用預訓練語言模型 ALBERT 做中文命名實體識別,該項目基於開源的代碼修改而來(本文代碼見參考資料 1 ,原始代碼見參考資料 2 ),使用 TensorFlow 框架開發,在下一節,我們將展示如何在 Amazon SageMaker 中進行該模型的訓練。
Amazon SageMaker中運行TensorFlow
本節將介紹如何使用 Amazon SageMaker 的自定義容器 ( Bring Your Own Container ,簡稱 BYOC )和自定義腳本( Bring Your Own Script ,簡稱 BYOS )兩種方式來運行 TensorFlow 程序的訓練任務。首先我們來看下如何在 Amazon SageMaker Notebook 上運行這個項目,然後再把它運行在 Amazon SageMaker 上。
在Amazon SageMaker Notebook上運行TensorFlow開原始碼
我們首先要創建 Amazon SageMaker Notebook ,然後下載代碼和數據,最後運行代碼。如果一切運行正常,我們就可以進行下一步工作——將該 TensorFlow 代碼運行到 Amazon SageMaker 中了。
創建Amazon SageMaker Notebook
我們首先要創建一個 Amazon SageMaker Notebook ,筆記本實例類型最好選擇 ml.p2.xlarge ,這樣就可以使用 GPU 進行訓練的測試了,卷大小建議改成 10GB 或以上,因為運行該項目需要下載一些額外的數據。
筆記本啟動後,打開頁面上的終端,執行以下命令下載代碼:
執行以下命令下載和解壓數據(數據來源見參考資料3):
我們需要進入一個虛擬環境 tensorflow_p36 ,該環境預製了運行 TensorFlow 所需要的常用組件,運行 run_train.sh 進行訓練,命令如下:
如果出現下面的輸出,說明運行結果正常,在實例類型為 ml.p2.xlarge 的筆記本中,訓練速度可以達到 23 個樣本/秒,如果是其他類型實例,速度可能有差異。
自定義容器需要經歷準備 Dockerfile ,創建訓練的啟動腳本,創建鏡像並上傳到 Amazon ECR ,本地測試和 Amazon SageMaker 測試等步驟。完整執行過程見 tensorflow_bring_your_own.ipynb 。
我們首先需要準備 Dockerfile ,在其中安裝 TensorFlow 程序運行必須的環境,拷貝所有代碼到鏡像中。
這裡我們需要了解 Amazon SageMaker 對於容器內目錄結構的要求,具體如下圖所示,訓練所需代碼放到 /opt/ml/code 目錄下,訓練所需數據放到 /opt/ml/input/data 目錄下,訓練輸出的模型放到 /opt/ml/model 目錄下,訓練結果文件或者日誌文件放到 /opt/ml/output 目錄下,訓練超參數文件是由 Amazon SageMaker 自動生成的,在 /opt/ml/input/config 目錄下。
Amazon SageMaker 在訓練時默認的啟動腳本是 train ,您可以將自己代碼中的啟動腳本命名為 train ,但我們更建議您使用我們提供的啟動腳本 train ,該腳本是基於 Python 的,可以幫助您解析傳入的超參數,並調用您代碼中的實際啟動腳本。
在準備好 Dockerfile 和啟動腳本後,我們可以使用 build_and_push.sh 這個腳本創建鏡像並上傳到 Amazon ECR 。注意這個過程可能需要進行很多次,因為我們不可避免地要修改 Dockerfile 或者 TensorFlow 程序以使得它們可以正常工作。如果尚未調試完成,我們可以暫時不執行該腳本的最後一句 docker push ${fullname} ,以避免頻繁上傳鏡像到 Amazon ECR 。
在創建鏡像完成後,我們可以使用 Amazon SageMaker 的本地模式進行本地測試:
第一步,執行 utils/setup.sh 來初始化本地模式。
第二步,指定執行的角色,這裡我們假設您是在 Amazon SageMaker Notebook 上執行的,如果是其他環境,您可能需要手動指定角色的 ARN 。
第三步,設定超參數,這裡需要對應到您程序中所需的超參數。
第四步,設定訓練機型為 local 或者 local_gpu (支持 GPU )。
第五步,創建 Estimator,這裡需要傳入之前獲得的角色、訓練機型、機器數量、鏡像名稱、超參數等。
第六步,啟動訓練,這裡需要傳入訓練數據的位置,在本地模式下,訓練數據的位置可以設置成本地路徑。
訓練啟動後,我們可以看到訓練的日誌輸出,以及監控本機的 GPU 、 CPU 、內存等的使用率等情況,以確認程序可以正常工作。
如果在此過程中需要進入正在運行的容器內調試,我們可以使用 docker ps 命令獲取當前正在運行的容器 ID ,並使用 docker exec -it <CONTAINER ID> /bin/bash 進入容器內進行調試。
在本地測試和上傳鏡像到 Amazon ECR 完成後,我們可以使用 Amazon SageMaker 進行測試:
第一步,上傳數據到 Amazon S3 ,獲取鏡像在 Amazon ECR 的地址。
第二步,指定執行的角色,這裡我們假設您是在 Amazon SageMaker Notebook 上執行的,如果是其他環境,您可能需要手動指定角色的 ARN 。
第三步,設定超參數,這裡需要對應到您程序中所需的超參數。
第四步,設定訓練機型為 ml.p2.xlarge (支持 GPU )。
第五步,創建 Estimator ,這裡需要傳入之前獲得的角色、訓練機型、機器數量、鏡像地址、超參數等。
第六步,啟動訓練,這裡需要傳入訓練數據的位置,在 Amazon SageMaker 模式下,訓練數據的位置需要設置成 Amazon S3 路徑。
訓練啟動後,我們可以在 Amazon SageMaker 控制臺看到這個訓練任務,點進詳情可以看到訓練的詳情,日誌輸出,以及監控機器的 GPU 、 CPU 、內存等的使用率等情況,以確認程序可以正常工作。
在此過程中我們無法進入正在運行的容器內調試,您可以將儘量多的日誌列印出來,或者輸出到 /opt/ml/output 路徑下,該路徑下的所有文件在訓練完成後會被自動打包成 output.tar.gz 放到設定好的位於 Amazon S3 的輸出路徑下。
本文所示程序使用了 MSRA 公開的中文實體識別數據集進行訓練,在訓練 3 輪之後,最優的 F1 值就可以達到 0.948345 ,屬於比較領先的結果。
使用 BYOS 的方法和 BYOC 的不同之處在於:BYOC 是使用用戶自己創建的鏡像來運行程序,更適用於用戶對鏡像自定義程度較高的使用情景;而 BYOS 是使用預先構建好的鏡像,只是傳入用戶自己的代碼來運行程序,不需要用戶自己調試鏡像,更適用於比較簡單的使用情景。
由於不需要編譯自定義鏡像,我們可以直接進行本地測試和 Amazon SageMaker 測試,完整流程見tensorflow_script_mode_quickstart.ipynb。
我們可以使用 Amazon SageMaker 的本地模式進行本地測試:
第一步,執行 utils/setup.sh 來初始化本地模式。
第二步,指定執行的角色,這裡我們假設您是在 Amazon SageMaker Notebook 上執行的,如果是其他環境,您可能需要手動指定角色的 ARN 。
第三步,設定超參數,這裡需要對應到您程序中所需的超參數。
第四步,設定訓練機型為 local 或者 local_gpu (支持GPU)。
第五步,創建一個名為 TensorFlow 的 Estimator ,這裡需要傳入訓練入口腳本(entry_point)、原始碼路徑(source_dir)、之前獲得的角色、訓練機型、機器數量、 TensorFlow 版本、 Python 版本、超參數等。
第六步,啟動訓練,這裡需要傳入訓練數據的位置,在本地模式下,訓練數據的位置可以設置成本地路徑。
這裡我們可以注意到 estimator.fit ()傳入的參數與 BYOC 略有不同,這兩個寫法其實是等價的,事實上,這裡的寫法更規範一些,按照 Amazon SageMaker 的文檔,輸入數據可以有多個通道(Channel),默認的通道是 training ,在本文的代碼中,訓練、驗證等過程其實都是從 training 通道中讀取的數據,所以更規範的做法是,我們應該額外增加一個通道 validation ,用來存放驗證數據。
訓練啟動後,我們可以看到訓練的日誌輸出,以及監控本機的 GPU、CPU 、內存等的使用率等情況,以確認程序可以正常工作。
如果在此過程中需要進入正在運行的容器內調試,我們可以使用docker ps命令獲取當前正在運行的容器ID,並使用docker exec -it <CONTAINER ID> /bin/bash進入容器內進行調試。另外,我們使用docker images命令可以看到Amazon SageMaker自動下載了一個名為763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-training:1.15.2-gpu-py3的鏡像,該鏡像是由Amazon SageMaker預編譯的。
在本地測試完成後,我們可以使用Amazon SageMaker進行測試:
第一步,上傳數據到Amazon S3。
第二步,指定執行的角色,這裡我們假設您是在Amazon SageMaker Notebook上執行的,如果是其他環境,您可能需要手動指定角色的ARN。
第三步,設定超參數,這裡需要對應到您程序中所需的超參數。
第四步,設定訓練機型為ml.p2.xlarge(支持GPU)。
第五步,創建一個名為TensorFlow的Estimator,這裡需要傳入訓練入口腳本(entry_point)、原始碼路徑(source_dir)、之前獲得的角色、訓練機型、機器數量、TensorFlow版本、Python版本、超參數等。
第六步,啟動訓練,這裡需要傳入訓練數據的位置,在Amazon SageMaker模式下,訓練數據的位置需要設置成Amazon S3路徑。
訓練啟動後,我們可以在Amazon SageMaker控制臺看到這個訓練任務,點進詳情可以看到訓練的詳情,日誌輸出,以及監控機器的GPU、CPU、內存等的使用率等情況,以確認程序可以正常工作。
在這裡,source_dir我們設置的是本地代碼路徑,Amazon SageMaker會自動將該路徑下的所有代碼和數據拷貝進容器中。此外,BYOS模式還支持git路徑作為代碼路徑,使用方法如下:
但是,由於本文所用代碼需要ALBERT預訓練數據,而該數據不包含在git內,所以我們需要對代碼進行改造,以使得在代碼內下載並解壓數據,才能夠正常訓練。這裡我們不再展示如何操作,感興趣的讀者可以自行嘗試。
本文講解了如何使用Amazon SageMaker運行基於TensorFlow的中文命名實體識別,其中算法部分是使用預訓練語言模型ALBERT做中文命名實體識別。
本文展示了如何把一個已有項目快速運行到Amazon SageMaker上,如果您想使用到Amazon SageMaker的更多高級用法,需要對已有項目進行改造,比如支持實時推理、批量推理、斷點重新訓練等,具體可以查看Amazon SageMaker的文檔。
本文所演示的使用方法是基於單機單卡的,Amazon SageMaker 提供基於 Docker 的簡化分布式 TensorFlow 訓練平臺,如果要將程序擴展到多機多卡進行訓練,可以參考其他相關博客。
1. 本文代碼:
https://github.com/whn09/albert-chinese-ner
2. 使用預訓練語言模型ALBERT做中文NER:
https://github.com/ProHiryu/albert-chinese-ner
3. 海量中文預訓練ALBERT模型:
https://github.com/brightmart/albert_zh
4. ALBERT論文:
https://arxiv.org/pdf/1909.11942.pdf
5. 命名實體識別 – Named-entity recognition | NER:
https://easyai.tech/ai-definition/ner/
想要入門 Amazon SageMaker 的童靴
看!過!來!
服務抵扣券直充福利
在!等!你!
自 2020 年 4 月 30 日起至 2020 年 9 月 30 日,AWS 為機器學習應用提供專屬福利,1000 元人民幣 / 200 美元 服務抵扣券直充到 AWS 帳戶,祝您輕鬆體驗 Amazon SageMaker 服務。
掃描下方二維碼即可訪問中國區申請入口
(1000元人民幣服務抵扣券)
掃描下方二維碼即可訪問國際區申請入口
(200美元服務抵扣券)