隨著機器學習模型的日益普及,模型的生產化佈署成為關鍵環節。本文將探討如何利用 Databricks 平台及其 MLflow 工具,有效地將訓練好的機器學習模型佈署至生產環境,並提供 REST API 供外部應用程式呼叫。同時,我們也將探討其他佈署平台的替代方案,例如 Amazon SageMaker 和 Saturn Cloud,讓讀者能依據自身需求選擇合適的方案。此外,文章也整理了企業級 NLP 開發的實務經驗,從簡單模型的快速迭代到資料的重要性,以及與工程團隊的協作,提供全面的佈署策略。最後,我們也將簡要介紹 CUDA 程式設計的基礎知識,以及它與深度學習的關聯,讓讀者瞭解底層硬體加速的機制。
機器學習模型生產化:Databricks 與其他替代方案
在前面的章節中,我們已經開發了機器學習模型,但尚未將其投入生產。本章節將探討如何使用 Databricks 將機器學習模型生產化,並介紹其他可用的替代方案。
使用 Databricks 進行機器學習模型生產化
Databricks 是一個根據 Spark 的資料科學和機器學習平台,能夠幫助組織大規模地進行機器學習模型的訓練和佈署。我們將使用 Databricks 建立排程和事件驅動的批次推理管線,並使用 MLflow 佈署和服務我們的 spaCy 文字分類別模型。
使用 MLflow 佈署模型
MLflow 是一個開源平台,用於管理機器學習模型的生命週期。我們可以使用 MLflow 將模型佈署到生產環境,並透過 REST API 提供服務。
import requests
def score_model(model_uri, databricks_token, data):
headers = {
"Authorization": 'Bearer ' + databricks_token,
"Content-Type": "application/json; format=pandas-records",
}
data_json = data if isinstance(data, list) else data.to_list()
response = requests.request(method='POST', headers=headers, url=model_uri, json=data_json)
if response.status_code != 200:
raise Exception(f"Request failed with status {response.status_code}, {response.text}")
return response.json()
MODEL_VERSION_URI = "XXXXXX" # 模型路徑
DATABRICKS_TOKEN = "XXXXXX" # 存取令牌
score_model(MODEL_VERSION_URI, DATABRICKS_TOKEN, data.loc[:10, "description"])
使用 REST API 進行推理
我們可以使用瀏覽器、cURL 或 Python 請求函式庫來測試 REST API。
結果與討論
透過使用 Databricks 和 MLflow,我們成功地將機器學習模型佈署到生產環境,並透過 REST API 提供服務。這使得我們能夠大規模地進行機器學習模型的訓練和佈署。
Databricks 的替代方案
雖然 Databricks 是一個強大的平台,但也有其他可用的替代方案。
Amazon SageMaker
Amazon SageMaker 是 AWS 提供的一個雲端機器學習平台,能夠幫助開發者建立、訓練和佈署機器學習模型。
Saturn Cloud
Saturn Cloud 是一個根據 Dask 的資料科學和機器學習平台,能夠幫助組織大規模地進行機器學習模型的訓練和佈署。
十個最終的經驗教訓
在前面的章節中,我們介紹了自然語言處理的基本概念、技術和工具。現在,我們將分享一些從實踐中總結出的經驗教訓,以幫助讀者在NLP專案中取得成功。
第1課:從簡單的方法開始
雖然使用最新的、最先進的模型來建立NLP應用程式很誘人,但通常最好從簡單的方法開始。根據我們的經驗,模型越新、越複雜,需要花費的時間就越長,才能將其推向生產環境。
這樣做有幾個壞處:
- 延遲時間:這會延遲任何建模工作的實際影響時間。您的組織可以從一個更簡單的模型中更快地受益,該模型需要更少時間來開發和推向生產。
- 士氣低落:長期的模型開發週期可能會讓機器學習團隊、長官團隊和投資者感到沮喪。最好在任何機器學習計劃的早期階段盡早、頻繁地交付成果,以向所有相關方展示機器學習可以幫助組織,即使最初的收益更為謙虛。
- 學習機會:透過從頭到尾地研究機器學習解決方案,您可以瞭解更多關於當前問題的資訊。一旦您的簡單模型投入生產,您就可以開始看到它在實際資料上的表現,並提出諸如以下的問題:在開發過程中,我們未能考慮哪些邊緣情況?簡單模型在哪裡失敗得最厲害?鑒於我們現在所知道的,我們如何能更好地設計模型?
簡單的模型不僅更容易開發和佈署,而且也比更複雜的模型更容易解釋。例如,使用Light Gradient Boost Machine(LightGBM)和一些特定於NLP的功能工程的簡單NLP模型,比更複雜的根據神經網路的模型更容易解釋。簡單的模型還需要更少的計算資源和訓練時間,而最新的、最先進的模型通常更大、更耗費計算資源。
當然,什麼是簡單的定義會隨著時間而變化。例如,BERT在2018年是最先進的,當時比現在更難使用。上下文相關的詞表示和根據Transformer的管道現在已經變得更加普遍。
在未來的NLP研究和開發中,我們預計將看到更多的進步和創新。隨著大型預訓練語言模型的開放原始碼,研究人員和開發人員將能夠更輕鬆地構建和微調自己的NLP模型。同時,諸如spaCy、Hugging Face、AllenNLP、Amazon、Microsoft和Google等公司已經推出了優秀的NLP工具,使得從頭開始開發NLP模型或微調現有模型變得更加容易。
企業NLP開發的關鍵經驗與實踐
在企業環境中佈署自然語言處理(NLP)模型時,經驗豐富的從業者通常會遵循某些最佳實踐。這些經驗教訓有助於提高模型的開發效率和佈署成功率。以下將探討在企業NLP開發中應當重視的幾個重要經驗。
重視簡單方法與實用價值
在企業環境中,簡單且實用的方法往往比複雜的最新技術更有價值。首先採用簡單的方法可以快速交付價值給組織。這種做法不僅能夠滿足當前的需求,還能為未來的改進提供基礎。即使在神經網路成為NLP模型開發的主流技術的今天,經典的非神經網路方法仍然在企業中佔有一席之地。對於某些問題,經典方法可能更快地產生良好的結果,而最新的神經網路技術則需要更長的時間來開發和調優。
善用社群資源與現有解決方案
另一個重要的經驗是善用現有的社群資源和解決方案。在開始開發新的NLP模型之前,先探索現有的開源或第三方解決方案是非常重要的。許多常見的問題已經有現成的模型或API可供使用。直接使用這些現成的解決方案可以在短期內為組織帶來價值,同時也可以為開發更適合組織長期戰略需求的內部解決方案爭取時間。
實踐與經驗的重要性
理論知識對於研究人員來說非常重要,但對於應用型NLP從業者來說,實踐和經驗才是成功的關鍵。應該盡快開始使用程式碼和資料進行實踐,而不是花費過多的時間學習理論。一些優秀的開源專案,如spaCy、Hugging Face和fast.ai,提供了易於使用的介面和範例程式碼,可以幫助從業者快速入門並推進NLP專案。
實踐工具與資源
以下是一些值得推薦的實踐工具和資源:
- spaCy:提供高效的NLP處理能力和豐富的功能,適合用於文字處理和分析。
- Hugging Face:提供了大量的預訓練語言模型和易於使用的介面,方便從業者快速佈署和使用NLP模型。
- fast.ai:除了提供實用的NLP工具外,還有優秀的課程材料,可以幫助從業者建立堅實的NLP基礎知識。
隨著NLP技術的不斷進步,企業應該持續關注最新的發展,並根據自身需求調整策略。同時,保持對簡單有效方法的重視,並善用現有的資源,將有助於在競爭中保持領先地位。最終,透過不斷的實踐和改進,企業可以實作NLP技術的最大價值。
十大最終課程:NLP實務精要
課程5:對抗決策疲勞
作為NLP的新人,尤其是在第9章探討的各種工具中選擇時,很容易陷入決策猶豫。我們建議從簡單開始並偏向行動。先從fast.ai資源開始,選擇PyTorch或另一個主流框架,在Google Colab或本地環境開始程式設計,不要過早擔心雲端運算提供商或實驗追蹤等問題。
課程6:資料為王
雖然本文主要討論如何開發和佈署NLP模型,但在許多實際應用案例中,決定效能的關鍵不是建模方法,而是可用於訓練模型的資料品質和數量。資料越多越好。盡可能利用公開可用的資料集,如果需要,也可以購買資料集。要開發真正高效能的模型,很可能需要在應用程式中建立第一方資料捕捉,以便控制用於構建模型的資料。
一旦擁有資料,註解就至關重要。可以自己進行註解,也可以僱傭註解公司,如Appen或Scale AI。也有不錯的現成開源註解軟體,如Prodigy。然而,為了獲得最高品質的註解,可能需要組織自行構建自定義註解UI。
課程7:依靠人類智慧
在開發根據ML的產品時,需要讓人類參與迴圈處理模型失敗的邊緣案例,並進行主動學習。如果沒有人類參與,即使NLP應用程式達到90%的準確率,也可能尚未準備好投入生產,因為使用者要求超過99%的準確率。為了向使用者提供這種準確率,可以利用人類處理模型表現不佳的10%案例。
課程8:與優秀工程師合作
如果你的強項是開發NLP模型,那麼與優秀的工程師合作,可以幫助你更穩健、更容易地將NLP模型投入生產。優秀的工程師將為你的NLP流程帶來急需的系統思維,設計測試、管理MLOps等。
課程9:整合模型
整合是機器學習中最接近「免費午餐」的東西。一旦你有了一個好的生產模型,就可以設計更多的模型來補充現有的模型,並將所有模型整合在一起。只要這些模型具有相似的良好效能,但錯誤不相關,那麼整合模型的表現將優於任何單一模型。
課程10:享受樂趣
最後,我們的建議是:享受樂趣,享受旅程。NLP很難,掌握它的道路很長。就像神經網路層層學習解決複雜問題一樣,你也會一步一步學會掌握NLP。只要有耐心,從簡單開始,最重要的是,在過程中慶祝小小的勝利。
結語
我們真誠地感謝您花時間閱讀我們的書,並與我們分享您的旅程。請繼續關注https://www.appliednlpbook.com的更多內容,我們希望很快再次見到您!
附錄A:擴充套件
正如我們在本文中多次提到的,大語言模型對NLP領域產生了巨大影響,目前的趨勢表明這種影響不會很快停止,如圖A-1所示。
圖A-1:語言模型增長趨勢
此圖示顯示了語言模型的增長趨勢。
內容解密:
圖A-1清晰地展示了語言模型的規模隨著時間不斷增長的趨勢,這意味著更大、更複雜的模型將持續推動NLP領域的發展。即使你不打算自己訓練大型模型,也可以利用研究人員開源的程式碼和發布的預訓練模型權重,從而站在巨人的肩膀上進行開發。
重點摘要
- 資料品質和數量對於NLP模型的效能至關重要。
- 人類智慧在處理邊緣案例和主動學習中不可或缺。
- 與優秀工程師合作可以顯著提升NLP模型的生產就緒度。
- 整合多個模型可以有效提升整體效能。
- 享受學習過程,保持耐心和樂趣。
大語言模型的訓練與擴充套件
多GPU訓練的簡易實作
在PyTorch中,若有多個GPU可供同一台機器存取(通常見於高階工作站、學術運算叢集和AWS p3.XLarge例項),設定網路使用它們相當直接。只需將模型包裝在nn.DataParallel類別中,PyTorch就會自動處理多GPU的複雜性。
from torch import nn
model = nn.Transformer()
model = nn.DataParallel(model)
內容解密:
- 模型初始化:首先,我們初始化一個
nn.Transformer()模型。 - 包裝模型:使用
nn.DataParallel(model)將模型包裝起來,使其能在多個GPU上平行運算。 - 注意事項:當使用
nn.DataParallel時,儲存的模型權重鍵值會帶有module.字首,需要手動移除或使用指令碼自動處理。
分散式訓練的挑戰與解決方案
大多數工作站和資料中心都有硬體限制,使得擴充套件到超過固定數量的GPU變得不切實際,通常這個數字是8。CPU的PCIe通道數量限制了可同時連線的GPU數量。此外,還有其他硬體限制,如尺寸、可用性、功耗和散熱。
分散式訓練的核心挑戰:
- 如何在節點間高效傳遞梯度、損失等資訊?
- 如何最小化節點間昂貴的訊息傳遞?
- 當某個節點故障時,如何繼續訓練?
- 是將模型權重分散到多個節點,還是分散批次?
加速深度學習訓練的方法
除了升級硬體,還有多種軟體層面的方法可以加速訓練。
具體改進措施:
GPU預處理:盡可能將預處理步驟移到GPU上,以平行處理批次。
使用檔案存檔:若資料集包含大量小檔案,使用HDF檔案可以減少I/O瓶頸。
混合精確度訓練:使用較低的浮點數精確度進行某些訓練步驟,可以顯著加速訓練。Nvidia的最新GPU包含專門為低精確度矩陣乘法設計的“Tensor Cores”。
# 示例:混合精確度訓練的基本思路 from torch.cuda.amp import autocast, GradScaler model = nn.Transformer() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) scaler = GradScaler() for data in dataset: with autocast(): outputs = model(data) loss = loss_fn(outputs, targets) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()內容解密:
- 混合精確度上下文:使用
autocast()上下文管理器,將前向傳播過程轉換為混合精確度模式。 - 梯度縮放:使用
GradScaler()來避免因低精確度訓練導致的梯度下溢。 - 最佳化器步驟:透過
scaler.step(optimizer)更新模型引數,並在完成後呼叫scaler.update()。
- 混合精確度上下文:使用
消除原生Python程式碼:盡量減少Python控制流程,使用PyTorch和NumPy等函式庫,它們提供了更快的實作。
使用更快的語言/框架:考慮使用效能更好的語言或框架,以減少與Python介面相關的瓶頸。
CUDA 程式設計基礎與深度學習的關聯
在深度學習的領域中,PyTorch、fastai 和 Hugging Face transformers 等工具已經大大簡化了模型的開發和訓練過程。然而,這些工具背後所依賴的基礎設施,尤其是 CUDA,對於理解深度學習的底層運作至關重要。
CUDA 簡介
CUDA 是 Nvidia 開發的一種程式設計模型,允許開發者編寫可在 Nvidia GPU 上執行的程式碼。CUDA 的核心概念是「Kernel」,即在 GPU 上執行的函式。這些 Kernel 函式通常由熟悉硬體架構的工程師編寫,並針對特定的任務(如矩陣乘法或卷積)進行最佳化。
CUDA Kernel 編寫
編寫 CUDA Kernel 需要具備 C/C++ 的基礎知識,以及對低階程式語言中的記憶體模型、指標和靜態型別等概念的理解。下面是一個簡單的 CUDA Kernel 示例,用於實作兩個向量的加法運算:
__global__ void add(int n, float* a, float* b, float* c) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n) c[i] = a[i] + b[i];
}
內容解密:
__global__修飾符:表示該函式是一個 CUDA Kernel,將在 GPU 上執行。blockIdx.x、blockDim.x和threadIdx.x:這些變數用於計算當前執行緒的索引。CUDA 將執行緒組織成區塊(Block),並進一步將區塊組織成網格(Grid)。每個執行緒根據其在區塊和網格中的位置獲得一個唯一的索引。if (i < n):確保索引i不超過向量a、b和c的大小,避免越界存取。
要將上述 Kernel 修改為執行元素級乘法運算,只需將 c[i] = a[i] + b[i]; 改為 c[i] = a[i] * b[i]; 即可。
為何需要 CUDA?
CUDA 的重要性在於它能夠利用 Nvidia GPU 的平行計算能力,顯著加速深度學習模型的訓練和推理過程。雖然 PyTorch 等高階框架已經封裝了大部分 CUDA 相關的複雜度,但瞭解 CUDA 的基本原理有助於除錯、最佳化模型效能,以及做出更明智的硬體選擇。
挑戰與限制
儘管 CUDA 提供了強大的平行計算能力,但編寫高效的 CUDA Kernel 仍然具有挑戰性,需要深入理解硬體架構和平行計算的原理。此外,CUDA 的程式設計模型與傳統的 CPU 程式設計有很大不同,需要額外的學習和實踐。
隨著 AI 硬體技術的不斷進步,除了 CUDA 之外,還出現了其他一些程式設計模型和框架,如 ROCm 和 SYCL。這些新興技術為未來的深度學習發展提供了更多可能性。然而,目前為止,CUDA 仍然是深度學習領域最成熟和廣泛使用的 GPU 程式設計介面。