生產中的NLP:建立Docker映象

磐創 AI發表於2020-09-29

作者|Bruce H. Cottman, Ph.D. 編譯|VK 來源|Towards Data Science

產品生命週期

在過去兩年半的工作中,我們開發和維護了幾個自然語言處理專案。我們為每個專案中的每個版本控制中心建立了Docker映象:Dev、Test和Stage。我將詳細介紹Docker解決方案來建立生產NLP專案。

程式碼開發、重構、bug修復和單元測試都是由Dev完成的。在提交Github Dev repo(sitory)之前,程式碼必須通過單元測試。其他開發團隊在合併到Test Github repo(sitory)之前執行程式碼評審、整合測試。

專案階段管理(Project stage management)觸發從開發人員到Test 儲存庫的推送。專案釋出管理(Project release management)觸發從Test 到Stage 儲存庫的推送。市場釋出管理(Marketing release management)觸發了從stage到Prod儲存庫的推送和半自動連續部署(CD)的推出。

什麼是Docker

  1. 每個專案中有四個不同的版本控制中心:Dev,Test和Stage,Prod。只有需要支援三個不同的Docker映象,因為最終階段版本被推送到Prod,一旦Stage版本通過了安全和驗收測試。Stage和Prod使用相同的Docker映象。

  2. Python和R使用者希望Jupyter和RStudio Notebook和Nbextensions首選項出現在Docker映象中。

  3. 大多數Dev和所有Test都在本地使用PyCharm進行程式碼更新、除錯和執行工具:單元測試(pytest)、型別檢查(mypy)、覆蓋率(cove)rage、PEP-8格式(黑色)和程式碼質量(pylint)。

  4. Github操作用於CI/CD部署。Prod Docker映象專門用於特定雲的安全性、日誌記錄或計量服務。

注意:雲擴充套件和故障轉移管理需要修改。我們這裡不討論這些。

同時使用Docker和Docker Compose

Docker是用於管理應用程式的單個容器映象。

Docker Compose用於同一應用程式同時管理多個容器。此工具提供與Docker相同的功能,但允許你有更復雜的應用程式。

Docker的Spacy和nltk:需要額外的步驟

根據上述說明,在上述文章中,spacy和nltk都是通過在Dev、Test和Stage的dockerfile的中間新增以下內容來匯入的:

.
.
.
RUN python -m spacy download en
RUN python -m spacy download en_core_web_sm
RUN python -m spacy download en_core_web_lg
RUN python -m nltk.downloader stopwords && python -m nltk.downloader punkt  && \
    python -m nltk.downloader averaged_perceptron_tagger && \
    python -m nltk.downloader wordnet
.
.
.

將Jupyter支援新增到Dev dockerfile中:

.
.
.
RUN python -m pip install --upgrade --no-deps --force-reinstall notebook
#
RUN python -m pip install jupyterthemes
RUN python -m pip install --upgrade jupyterthemes
RUN python -m pip install jupyter_contrib_nbextensions
RUN jupyter contrib nbextension install --user
RUN jupyter nbextensions_configurator enable --user
RUN jupyter nbextension enable jupyter-js-widgets/extension
RUN jupyter nbextension enable jupyter-notebook-gist/notebook-extension
RUN jupyter nbextension enable contrib_nbextensions_help_item/main
RUN jupyter nbextension enable autosavetime/main
RUN jupyter nbextension enable codefolding/main
RUN jupyter nbextension enable code_font_size/code_font_size
RUN jupyter nbextension enable code_prettify/code_prettify
RUN jupyter nbextension enable collapsible_headings/main
RUN jupyter nbextension enable comment-uncomment/main
RUN jupyter nbextension enable equation-numbering/main
RUN jupyter nbextension enable execute_time/ExecuteTime 
RUN jupyter nbextension enable gist_it/main 
RUN jupyter nbextension enable hide_input/main 
RUN jupyter nbextension enable spellchecker/main
RUN jupyter nbextension enable toc2/main
RUN jupyter nbextension enable toggle_all_line_numbers/main

Dev、Test和Stage的requirements.txt:

###### Requirements without Version Specifiers ######
numpy
matplotlib
progressbar2
Pillow
keras
nilearn==0.5.0
pandas
xlrd
plotly
statsmodels
prettytable
requests
seaborn
joblib
dask
distributed==v2.22.0
bs4
spacy
textacy
nltk
spacy-transformers
spacymoji
pdfminer
urllib3==1.25.10

注:該要求.txt上面顯示的檔案是為我們的Dev、Test和Stage準備的。你可能不需要所有這些軟體包,也可能需要其他軟體包。。如果需要,可以隨意刪除或新增軟體包。

注意:Pycharm配置了開發和測試工具pytest、pylint、black、mypy等。Jupyter使用者可以使用!pip install 進行安裝,然後安裝可能需要的重要的額外包或工具。

儲存庫目錄結構

一般的儲存庫結構是

|-- <project--repo-name>
        |-- docker
            |-- dev
              |--- Dockerfile
              |--- docker-compose.yml
              |--- requirements.txt
            |-- test
              |--- Dockerfile
              |--- docker-compose.yml
              |--- requirements.txt
            |-- stage
              |--- Dockerfile
              |--- docker-compose.yml
              |--- requirements.txt
        |-- src
        |-- test
        |--- requirements.txt
        |--- README.md
.
.

新增Jupyter Notebook擴充套件到Docker映象

支援Jupyter的簡要步驟:

  • 在Jupyter使用者Dockerfile中新增所需的Nbextensions.Nbextensions檔案上面給出了名稱和如何啟用它們。

  • 編輯dockerfile.yaml volume: - ./../../.。,如有必要。jupyter的後續啟動使用./../../.作為其頂層目錄。當你使用updev命令(在本文後面描述)時,docker-compose命令volume: - ./../../.使<path-to-projects>對映到/docker,該目錄是docker映象的內部目錄。jupyter的後續釋出版本使用<path-to-projects>作為其頂層目錄。請使用上面顯示的示例目錄結構,或將本地目錄結構替換為- ./../../.

  • 最後,Juptyter Notebook啟動Nbextensions。

常見問題解答:Docker命令附加功能

  1. 從舊版和以前無用的映象和容器版本中恢復磁碟空間:
!docker system prune
  1. 檢視Docker伺服器中執行的Docker容器,每秒更新一次:
!docker stats
=>
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
5d98fb8e8a66        dev_dev_1           0.11%               327.2MiB / 36.24GiB   0.88%               182MB / 9.62MB      0B / 0B             13
  1. 如果你啟動或重新啟動,你可能會在任何Docker命令上看到以下錯誤訊息:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

修復方法是等待2-3分鐘,等待Docker守護程式完成,然後再試一次。如果不是這樣,Docker守護程式的啟動就有問題,必須進行診斷和修復。一個可能的問題是檢查Docker映象記憶體或CPU分配是否適合底層主機硬體。

結尾

我詳細介紹了我們如何為生產NLP應用程式生命週期設計和實現Docker解決方案。我展示了Dev、Test和Stage的目錄結構和Docker程式碼。

本文中顯示的所有程式碼都在這裡:https://github.com/bcottman/NLP/tree/master/docker

原文連結:https://towardsdatascience.com/natural-language-processing-in-production-creating-docker-images-84bd86e161b4

歡迎關注磐創AI部落格站: http://panchuang.net/

sklearn機器學習中文官方文件: http://sklearn123.com/

歡迎關注磐創部落格資源彙總站: http://docs.panchuang.net/

相關文章