玩轉 ML,能託管就毫不本身搞,今天輪到數據處理和模型評估

專屬圖1.png

不少時候,託管式的服務可以幫咱們省不少事。從應用開發到部署,到後續運維;從機器學習模型的建立到訓練,再到最終運行……這些環節中,不少步驟均可以選擇託管式雲服務來幫助咱們下降開發成本和工做量,讓本身更專一於真正重要的任務。html

今天,咱們就一塊兒來看看機器學習過程當中的數據處理和模型評估,若是這些任務也能借助託管式服務搞定,那是否是感受又輕鬆了一大截!python

隆重推薦:Amazon SageMaker Processing

Amazon SageMaker Processing 已於近期正式上線,這是 Amazon SageMaker 的一項新功能,能夠幫助用戶在徹底託管的基礎設施上輕鬆運行數據預處理、後處理和模型評估等工做負載。git

畢竟你們都知道,訓練一個準確的機器學習(ML)模型須要不少繁瑣的步驟,但沒什麼比預處理數據集更重要,例如:github

  • 將數據集轉換爲所用 ML 算法指望的輸入格式;
  • 將現有功能轉換爲更具表現力的表示形式,例如一鍵編碼分類功能;
  • 從新調整或歸一化數值特徵;
  • 設計高級功能,例如用 GPS 座標替換郵寄地址;
  • 爲天然語言處理應用程序清理和標記文本;
  • ……

這些任務包括在數據集上運行定製腳本,並保存處理後的版本,以供後續訓練做業使用。可想而知,對 ML 團隊來講,手動運行它們,或必須構建和擴展自動化工具,這類作法的前景讓人堪憂。對於後處理做業(篩選、整理等)和模型評估做業(針對不一樣測試集對模型評分)而言也是如此。
爲解決此問題,AWS 構建了 Amazon SageMaker Processingweb

Amazon SageMaker Processing 究竟是什麼

Amazon SageMaker Processing 新增的 Python 開發工具包,使得數據科學家和 ML 工程師能夠輕鬆地在 Amazon SageMaker 上運行預處理、後處理和模型評估工做負載。算法

該開發工具包使用 SageMaker 的內置容器來進行 scikit-learn,這多是最受歡迎的數據集轉換庫之一。app

若是還須要其餘工具,那麼你們也可使用本身的 Docker 映像,而沒必要遵循任何 Docker 映像規範:這爲用戶提供了最大的靈活性,不管是在 SageMaker Processing 仍是在 Amazon ECSAmazon Elastic Kubernetes Service 之類的 AWS 容器服務上,甚至在內部,均是如此。框架

接下來咱們將使用 scikit-learn 進行一個快速演示,隨後將簡要討論如何使用本身的容器。完整示例請訪問 GitHub運維

使用內置的 Scikit-Learn 容器預處理數據

如下是使用 SageMaker Processing 開發工具包來運行 scikit-learn 做業的方法。
首先,讓咱們建立一個 SKLearnProcessor 對象,傳遞要使用的 scikit-learn 版本以及對託管基礎設施的要求:機器學習

from sagemaker.sklearn.processing import SKLearnProcessor
sklearn_processor = SKLearnProcessor(framework_version='0.20.0',
                                     role=role,
                                     instance_count=1,
                                     instance_type='ml.m5.xlarge')

而後,咱們能夠像下面這樣運行預處理腳本(稍後將介紹更多有關該操做的內容):

  • 數據集(dataset.csv)將自動複製到目標目錄(/input)下的容器內。若是須要,也能夠添加其餘輸入。
  • 這是 Python 腳本(preprocessing.py)讀取它的位置,咱們也能夠將命令行參數傳遞給腳本。
  • 腳本對命令行進行預處理,將其分爲三種方式,而後將文件保存在容器中的/opt/ml/processing/output/train、/opt/ml/processing/output/validation和/opt/ml/processing/output/test下。
  • 做業完成後,全部輸出將自動複製到 S3 中的默認 SageMaker 存儲桶。
from sagemaker.processing import ProcessingInput, ProcessingOutput
sklearn_processor.run(
    code='preprocessing.py',
    # arguments = ['arg1', 'arg2'],
    inputs=[ProcessingInput(
        source='dataset.csv',
        destination='/opt/ml/processing/input')],
    outputs=[ProcessingOutput(source='/opt/ml/processing/output/train'),
        ProcessingOutput(source='/opt/ml/processing/output/validation'),
        ProcessingOutput(source='/opt/ml/processing/output/test')]
)

就這麼簡單!讓咱們經過查看預處理腳本的框架將全部內容放在一塊兒:

import pandas as pd
from sklearn.model_selection import train_test_split
# Read data locally 
df = pd.read_csv('/opt/ml/processing/input/dataset.csv')
# Preprocess the data set
downsampled = apply_mad_data_science_skills(df)
# Split data set into training, validation, and test
train, test = train_test_split(downsampled, test_size=0.2)
train, validation = train_test_split(train, test_size=0.2)
# Create local output directories
try:
    os.makedirs('/opt/ml/processing/output/train')
    os.makedirs('/opt/ml/processing/output/validation')
    os.makedirs('/opt/ml/processing/output/test')
except:
    pass
# Save data locally
train.to_csv("/opt/ml/processing/output/train/train.csv")
validation.to_csv("/opt/ml/processing/output/validation/validation.csv")
test.to_csv("/opt/ml/processing/output/test/test.csv")
print('Finished running processing job')

快速瀏覽 S3存儲桶,確認文件已成功處理並保存。如今,我能夠將它們直接用做 SageMaker 訓練做業的輸入。

$ aws s3 ls --recursive s3://sagemaker-us-west-2-123456789012/sagemaker-scikit-learn-2019-11-20-13-57-17-805/output
2019-11-20 15:03:22 19967 sagemaker-scikit-learn-2019-11-20-13-57-17-805/output/test.csv
2019-11-20 15:03:22 64998 sagemaker-scikit-learn-2019-11-20-13-57-17-805/output/train.csv
2019-11-20 15:03:22 18058 sagemaker-scikit-learn-2019-11-20-13-57-17-805/output/validation.csv

使用本身的容器處理數據

那麼又該如何使用本身的容器來處理數據?例如想使用熱門的 spaCy 庫預處理文本數據。此時可使用如下方法爲其定義一個普通 Docker 容器。

FROM python:3.7-slim-buster
# Install spaCy, pandas, and an english language model for spaCy.
RUN pip3 install spacy==2.2.2 && pip3 install pandas==0.25.3
RUN python3 -m spacy download en_core_web_md
# Make sure python doesn't buffer stdout so we get logs ASAP.
ENV PYTHONUNBUFFERED=TRUE
ENTRYPOINT ["python3"]

隨後便可構建 Docker 容器在本地進行測試,而後將其推送到託管的Docker註冊表服務 Amazon Elastic Container Registry

接下來可使用 ScriptProcessor 對象配置處理做業,並傳遞您已構建和推送的容器的名稱。

from sagemaker.processing import ScriptProcessor
script_processor = ScriptProcessor(image_uri='123456789012.dkr.ecr.us-west-2.amazonaws.com/sagemaker-spacy-container:latest',
                role=role,
                instance_count=1,
                instance_type='ml.m5.xlarge')

最後,能夠像前面的示例同樣運行該做業:

script_processor.run(code='spacy_script.py',
    inputs=[ProcessingInput(
        source='dataset.csv',
        destination='/opt/ml/processing/input_data')],
    outputs=[ProcessingOutput(source='/opt/ml/processing/processed_data')],
    arguments=['tokenizer', 'lemmatizer', 'pos-tagger']
)

其他過程與上述過程徹底相同:將輸入複製到容器內部,將輸出從容器複製到 S3

很簡單對吧!須要注意的是,本文重點討論了數據的預處理,但實際上你們也能夠經過這種方式運行相似的任務進行後處理和模型評估。更多案例可參閱 GitHub 中的示例。

Amazon SageMaker Processing 現已在提供 Amazon SageMaker 的全部商業區域中推出。歡迎你們親自體驗!

底圖2.png

相關文章
相關標籤/搜索