機器學習 | 數據大爆炸有大數據,ML 模型大爆炸怎麼辦?

專屬圖1.png

遙想當年,當企業須要從不一樣來源的多種系統中對海量數據進行分析時,大數據技術應運而生了,幫助企業更快速、靈活地從數據中得到寶貴的看法。而機器學習技術發展到今天,也產生了相似的需求。html

實踐過就會知道,機器學習(ML)是一種高度迭代的過程。在單個項目的過程當中,數據科學家和 ML 工程師一般會訓練數千個不一樣模型,以尋求最大準確度。而在這過程當中,所涉及到的算法、數據集和訓練參數(又稱爲超參數)的組合數量是無限的……你們就如同大海撈針那樣須要從中找出最優解。git

雖然業界已經提出了很多解決方法,例如自動模型調整Amazon SageMaker Autopilot 之類的工具可幫助 ML 從業者自動探索大量組合,並快速放大高性能模型。然而它們會進一步加大訓練做業的爆炸式增加。隨着時間推移,這給 ML 團隊帶來了新困難,由於要高效處理成千上萬個做業幾乎是不可能的:跟蹤指標、按實驗對做業分組、在同一個實驗中或各實驗間比較做業、查詢過去的做業等。正則表達式

固然,也能夠經過構建、管理和擴展定製工具來解決此問題。然而這樣作會浪費實際 ML 工做所需的寶貴時間和資源。本着幫助客戶專一於 ML 的精神,咱們須要另闢蹊徑來解決這個問題。算法

隆重推薦:Amazon SageMaker Experiments

近日,Amazon SageMaker Experiments 已經正式發佈!它是 Amazon SageMaker 的一項新功能,可幫助用戶組織、跟蹤、比較和評估機器學習實驗和模型版本。網絡

首先咱們來定義幾個核心概念:session

  • 試驗是單個訓練做業中所涉及的訓練步驟集合。訓練步驟一般包括預處理、訓練、模型評估等。試驗還包含豐富的輸入(例如,算法、參數、數據集)和輸出(例如,模型、檢查點、指標)元數據。
  • 實驗就是一系列的試驗,即一組相關訓練做業。

SageMaker Experiments 的目標是儘量簡單地建立實驗,用試驗填充實驗,並在試驗與實驗間運行分析。爲此,咱們推出了包含日誌記錄和分析 API 的新 Python 開發工具包。機器學習

SageMakerSageMaker Autopilot 上運行訓練做業,只須要將額外參數傳遞到 Estimator 中,以此定義試驗應附加到的實驗的名稱。全部的輸入和輸出都將自動記錄。工具

在運行訓練做業後,SageMaker Experiments 開發工具包可以讓咱們以常見的 pandas DataFrame 格式加載實驗和試驗數據。Pandas 無疑是 ML 從業者的瑞士軍刀,咱們能夠藉此執行所需的任何分析。經過使用 matplotlib 構建很酷的可視化向前進一步,將可以順利地馴服大量訓練做業!oop

正如您指望的那樣,SageMaker Experiments 完美集成在 Amazon SageMaker Studio 中。咱們能夠運行復雜的查詢,以快速找到要找的過去的試驗,還能夠對實時模型排行榜和指標圖表進行可視化。性能

演示:使用 Amazon SageMaker Experiments 記錄訓練信息

咱們將從 PyTorch 腳本開始,使用一個簡單的雙層卷積神經網絡(CNN)從 MNIST 數據集中分類圖像。若是想要在 SageMaker 上運行單個做業,能夠像下面這樣使用 PyTorch estimator

estimator = PyTorch(
        entry_point='mnist.py',
        role=role,
        sagemaker_session=sess
        framework_version='1.1.0',
        train_instance_count=1,
        train_instance_type='ml.p3.2xlarge')
    
    estimator.fit(inputs={'training': inputs})

反過來,假設想要運行同一個腳本的多個版本,只更改超參數(兩個卷積層使用的卷積篩選器數量,又名隱藏通道數)中的一個來測量它對模型準確度的影響。固然,咱們能夠運行這些做業、獲取訓練日誌、使用精心設計的文本篩選提取指標等。或者可使用 SageMaker Experiments

此時只須要:

  • 設置實驗;
  • 使用跟蹤器記錄實驗元數據;
  • 爲想運行的每一個訓練做業建立試驗;
  • 運行每一個訓練做業,以傳遞實驗名稱和試驗名稱的參數。

首先,咱們來進行實驗吧:

from smexperiments.experiment import Experiment
mnist_experiment = Experiment.create(
    experiment_name="mnist-hand-written-digits-classification",
    description="Classification of mnist hand-written digits",
    sagemaker_boto_client=sm)

而後添加幾個想要跟蹤的項目,如數據集位置和咱們對其應用的規範化值:

from smexperiments.tracker import Tracker
with Tracker.create(display_name="Preprocessing", sagemaker_boto_client=sm) as tracker:
     tracker.log_input(name="mnist-dataset", media_type="s3/uri", value=inputs)
     tracker.log_parameters({
        "normalization_mean": 0.1307,
        "normalization_std": 0.3081,
    })

如今來運行幾個做業。此處只是循環處理想要嘗試的幾個不一樣值,爲每一個訓練做業建立一個新試驗並在其中添加跟蹤器信息:

for i, num_hidden_channel in enumerate([2, 5, 10, 20, 32]):
    trial_name = f"cnn-training-job-{num_hidden_channel}-hidden-channels-{int(time.time())}"
    cnn_trial = Trial.create(
        trial_name=trial_name,
        experiment_name=mnist_experiment.experiment_name,
        sagemaker_boto_client=sm,
    )
    cnn_trial.add_trial_component(tracker.trial_component)

而後配置估算器,從而傳遞感興趣的超參數值,並讓其餘值保持原樣。這裏還會傳遞正則表達式,以從訓練日誌中提取指標。全部這些都會推送存儲在試驗中:事實上,全部參數(傳遞或默認參數)都是如此。

 estimator = PyTorch(
        entry_point='mnist.py',
        role=role,
        sagemaker_session=sess,
        framework_version='1.1.0',
        train_instance_count=1,
        train_instance_type='ml.p3.2xlarge',
        hyperparameters={
            'hidden_channels': num_hidden_channels
        },
        metric_definitions=[
            {'Name':'train:loss', 'Regex':'Train Loss: (.*?);'},
            {'Name':'test:loss', 'Regex':'Test Average loss: (.*?),'},
            {'Name':'test:accuracy', 'Regex':'Test Accuracy: (.*?)%;'}
        ]
    )

最後運行訓練做業,將該做業與實驗和試驗關聯:

 cnn_training_job_name = "cnn-training-job-{}".format(int(time.time()))
    
    estimator.fit(
        inputs={'training': inputs},
        job_name=cnn_training_job_name,
        experiment_config={
            "ExperimentName": mnist_experiment.experiment_name,
            "TrialName": cnn_trial.trial_name,
            "TrialComponentDisplayName": "Training",
        }
    )
# end of loop

當全部做業完成時,便可運行分析。接下來看看是怎麼作的。

演示:使用 Amazon SageMaker Experiments 進行分析

有關實驗的全部信息能夠輕鬆導出至 Pandas DataFrame 中。

from sagemaker.analytics import ExperimentAnalytics
trial_component_analytics = ExperimentAnalytics(
    sagemaker_session=sess,
    experiment_name=mnist_experiment.experiment_name
)
analytic_table = trial_component_analytics.dataframe()

若是想要深刻了解,能夠指定其餘參數,例如:

trial_component_analytics = ExperimentAnalytics(
    sagemaker_session=sess,
    experiment_name=mnist_experiment.experiment_name,
    sort_by="metrics.test:accuracy.max",
    sort_order="Descending",
    metric_names=['test:accuracy'],
    parameter_names=['hidden_channels', 'epochs', 'dropout', 'optimizer']
)
analytic_table = trial_component_analytics.dataframe()

這將構建一個 DataFrame,試驗會在其中按測試準確度降序進行排序,而且只會顯示每一個試驗的一些超參數。

for col in analytic_table.columns: 
    print(col) 
 
TrialComponentName
DisplayName
SourceArn
dropout
epochs
hidden_channels
optimizer
test:accuracy - Min
test:accuracy - Max
test:accuracy - Avg
test:accuracy - StdDev
test:accuracy - Last
test:accuracy - Count

效果是否遠超你想象!Pandas 是數據分析的瑞士軍刀,咱們將可以以各類可能的方式比較試驗和實驗。

最後,得益於與 Amazon SageMaker Studio 的集成,咱們還可使用預約義的小部件實時可視化全部這些信息。要了解有關 Amazon SageMaker Studio 的更多信息,請點擊這裏

本文只是介紹了 Amazon SageMaker Experiments 的一小部分功能,相信它能幫助你們處理天天必需要面對的大量做業。此服務現已在提供了 Amazon SageMaker 的全部 AWS 商業區域中推出,歡迎體驗!

底圖2.png

相關文章
相關標籤/搜索