Hugging Face Transformers 完全新手入門指南

釋出於 2024 年 3 月 22 日
在 GitHub 上更新

歡迎來到“Hugging Face Transformers 完全新手入門指南”,本指南專為那些希望瞭解開源機器學習(ML)基礎知識的人士設計。我們的目標是揭開 Hugging Face Transformers 的神秘面紗,闡明其工作原理,並非要將您培養成機器學習從業者,而是為了讓您能更好地理解並與從業者協作。話雖如此,最好的學習方式是實踐,因此我們將透過一個簡單的例項,演示如何在 Hugging Face Space 的 notebook 中執行微軟的 Phi-2 大語言模型(LLM)。

您可能會想,既然 Hugging Face 上已有大量教程,為什麼還要再寫一篇?答案在於可訪問性:現有的大多數資源都假設讀者具備一定的技術背景,包括 Python 程式設計能力,這可能會阻礙非技術人員掌握機器學習的基礎知識。我本人是從 AI 的業務端轉過來的,深知學習曲線會構成一道屏障,因此希望為有類似背景的學習者提供一條更平易近人的路徑。

因此,本指南專為那些渴望更好地瞭解開源機器學習但又不想從頭學習 Python 的非技術人士量身定製。我們不假設您有任何先驗知識,將從零開始解釋概念,以確保清晰明瞭。如果您是工程師,可能會覺得本指南過於基礎,但對於初學者來說,它是一個理想的起點。

讓我們開始吧……但首先,介紹一些背景知識。

什麼是 Hugging Face Transformers?

Hugging Face Transformers 是一個開源的 Python 庫,它提供了數千個用於自然語言處理(NLP)、計算機視覺、音訊任務等的預訓練 Transformers 模型。它透過抽象掉在 PyTorch、TensorFlow 和 JAX 等底層機器學習框架中訓練或部署模型的複雜性,簡化了實現 Transformer 模型的過程。

什麼是庫?

庫就是可重用程式碼片段的集合,可以整合到專案中,從而更高效地實現功能,而無需從頭編寫自己的程式碼。

值得注意的是,Transformers 庫為在 PyTorch、TensorFlow 和 JAX 等常見框架中實現模型提供了可重用的程式碼。透過呼叫庫中的函式(也稱為方法),可以訪問這些可重用的程式碼。

什麼是 Hugging Face Hub?

Hugging Face Hub 是一個協作平臺,託管了大量用於機器學習的開源模型和資料集,可以把它看作是機器學習領域的 Github。Hub 透過讓您輕鬆發現、學習和與開源社群中有用的機器學習資產互動,促進了分享與協作。Hub 與 Transformers 庫整合並協同使用,因為使用 Transformers 庫部署的模型都是從 Hub 下載的。

什麼是 Hugging Face Spaces?

Hugging Face 的 Spaces 是 Hugging Face Hub 上提供的一項服務,它提供了一個易於使用的圖形使用者介面(GUI),用於構建和部署 Web 託管的機器學習演示和應用程式。該服務允許您快速構建機器學習演示,上傳您自己的應用程式進行託管,甚至可以選擇一些預配置的機器學習應用程式立即部署。

在本教程中,我們將透過選擇相應的 Docker 容器,部署一個預配置的機器學習應用程式——JupyterLab notebook。

什麼是 notebook?

Notebooks 是互動式應用程式,允許您編寫和共享可即時執行的程式碼,並與補充性的敘述文字交織在一起。Notebooks 對資料科學家和機器學習工程師尤其有用,因為它們允許您即時試驗程式碼,並輕鬆審查和分享結果。

  1. 建立 Hugging Face 賬戶
  • 訪問 hf.co,點選“註冊”並建立一個賬戶(如果您還沒有的話)。


  1. 新增您的賬單資訊
  • 在您的 HF 賬戶中,進入“設定” > “賬單”,將您的信用卡新增到付款資訊部分。


為什麼需要您的信用卡?

為了執行大多數大語言模型(LLM),您需要一個 GPU,而這不幸不是免費的。不過,您可以從 Hugging Face 租用。別擔心,費用不會很高。本教程所需的 GPU,即 NVIDIA A10G,每小時只需幾美元。

  1. 建立一個 Space 來託管您的 notebook
  • hf.co 上,轉到“Spaces” > “Create New”。


  1. 配置您的 Space
  • 設定您喜歡的 Space 名稱
  • 選擇 Docker > JupyterLab 以選擇預配置的 notebook 應用
  • 選擇 Space 硬體為“Nvidia A10G Small”
  • 其他所有選項都可以保留預設設定
  • 選擇“建立 Space”

什麼是 Docker 模板?

Docker 模板是軟體環境的預定義藍圖,包含了必要的軟體和配置,使開發人員能夠以一致且隔離的方式輕鬆快速地部署應用程式。

為什麼我需要選擇一個 GPU Space 硬體?

預設情況下,我們的 Space 配備了免費的 CPU,這對於某些應用程式來說已經足夠了。然而,大語言模型所需的大量計算可以透過並行執行來顯著提高速度,而這正是 GPU 的強項。

選擇一個記憶體足夠大的 GPU 來儲存模型並提供備用工作記憶體也很重要。在我們的例子中,一個擁有 24GB 記憶體的 A10G Small 足以執行 Phi-2。


  1. 登入 JupyterLab
  • 在 Space 完成構建後,您將看到一個登入螢幕。如果您在模板中保留了預設的令牌,您可以用“huggingface”登入。否則,請使用您設定的令牌。


  1. 建立一個新的 notebook
  • 在“Launcher”選項卡中,選擇“Notebook”標題下的“Python 3”方塊,這將建立一個已安裝 Python 的新 notebook 環境。


  1. 安裝所需軟體包
  • 在您的新 notebook 中,您需要安裝 PyTorch 和 Transformers 庫,因為它們沒有預裝在環境中。
  • 這可以透過在您的 notebook 中輸入 !pip 命令 + 庫名來完成。點選播放按鈕執行程式碼,並觀察庫的安裝過程(或者:按 CMD + Return / CTRL + Enter)。
!pip install torch
!pip install transformers

什麼是 !pip install?

!pip 是一個從 Python 包索引 (PyPI) 安裝 Python 包的命令。PyPI 是一個 Web 倉庫,存放了可用於 Python 環境的庫。它允許我們透過整合各種第三方外掛來擴充套件 Python 應用程式的功能。

既然我們使用 Transformers,為什麼還需要 PyTorch?

Hugging Face 是一個建立在其他框架(如 PyTorch、Tensorflow 和 JAX)之上的庫。在這種情況下,我們是將 Transformers 與 PyTorch 一起使用,因此需要安裝 PyTorch 才能訪問其功能。


  1. 從 Transformers 中匯入 AutoTokenizer 和 AutoModelForCausalLM 類
  • 在新的一行輸入以下程式碼並執行
from transformers import AutoTokenizer, AutoModelForCausalLM

什麼是類?

可以把類(Classes)想象成建立“物件(Objects)”的程式碼配方。它們之所以有用,是因為允許我們儲存具有屬性和功能組合的物件。這反過來簡化了編碼,因為特定主題所需的所有資訊和操作都可以從同一個地方訪問。我們將使用這些類來建立兩個物件:一個 model 物件和一個 tokenizer 物件。

為什麼在安裝 Transformers 後還需要再次匯入類?

儘管 Transformers 已經安裝好了,但 Transformers 內部的特定類並不會自動在您的環境中可用。Python 要求我們顯式匯入單個類,這有助於避免命名衝突,並確保只有庫中必要的部分被載入到您當前的工作上下文中。

  1. 定義您想執行的模型
  • 為了詳細說明您想從 Hugging Face Hub 下載並執行的模型,您需要在程式碼中指定模型倉庫的名稱。
  • 我們透過將一個變數設定為模型名稱來實現這一點,這裡我們決定將該變數命名為 model_id
  • 我們將使用微軟的 Phi-2,這是一個小巧但功能出奇強大的模型,可以在 https://huggingface.co/microsoft/phi-2 找到。注意:Phi-2 是一個基礎模型,而非指令微調模型,因此如果您嘗試用它進行聊天,它的回應會很不尋常。
model_id = "microsoft/phi-2"

什麼是指令微調模型?

指令微調語言模型是一種在其基礎版本上進一步訓練的模型,旨在理解和響應使用者給出的命令或提示,從而提高其遵循指令的能力。基礎模型能夠自動補全文字,但通常不能以有用的方式響應命令。稍後當我們嘗試提示 Phi 時,就會看到這一點。

  1. 建立一個模型物件並載入模型
  • 要將模型從 Hugging Face Hub 載入到我們的本地環境中,我們需要例項化模型物件。我們透過將上一步定義的“model_id”傳遞到 AutoModelForCausalLM 類的“.from_pretrained”方法的引數中來完成此操作。
  • 執行您的程式碼,然後去喝杯飲料,模型可能需要幾分鐘才能下載完成。
model = AutoModelForCausalLM.from_pretrained(model_id)

什麼是引數?

引數是傳遞給函式以計算輸出的輸入資訊。我們透過將引數放在函式括號之間來將其傳遞給函式。在這種情況下,模型 ID 是唯一的引數,但函式也可以有多個引數,或者沒有引數。

什麼是方法?

方法(Method)是函式的別稱,特指使用特定物件或類的資訊的函式。在這種情況下,.from_pretrained 方法使用來自類和 model_id 的資訊來建立一個新的 model 物件。

  1. 建立一個分詞器物件並載入分詞器
  • 要載入分詞器,您現在需要建立一個分詞器物件。為此,再次將 model_id 作為引數傳遞到 AutoTokenizer 類的 .from_pretrained 方法中。
  • 請注意,這裡有一些額外的引數,對於本示例來說,理解它們並不重要,所以我們不作解釋。
tokenizer = AutoTokenizer.from_pretrained(model_id, add_eos_token=True, padding_side='left')

什麼是分詞器?

分詞器(tokenizer)是一種將句子分割成更小文字片段(詞元,即 token)的工具,併為每個詞元分配一個稱為輸入 ID 的數值。這是必需的,因為我們的模型只理解數字,所以我們必須首先將文字轉換(即編碼)為模型可以理解的格式。每個模型都有自己的分詞器詞彙表,使用與模型訓練時相同的分詞器非常重要,否則它會誤解文字。

  1. 建立供模型處理的輸入
  • 定義一個新變數 input_text,它將接收您想提供給模型的提示。在本例中,我問的是“你是誰?”,但您可以選擇任何您喜歡的內容。
  • 將新變數作為引數傳遞給分詞器物件,以建立 input_ids
  • 向分詞器物件傳遞第二個引數 return_tensors="pt",這確保了 token_id 表示為我們所用模型版本(即 PyTorch 而非 Tensorflow)所需的正確向量型別。
input_text = "Who are you?"
input_ids = tokenizer(input_text, return_tensors="pt")
  1. 執行生成並解碼輸出
  • 現在輸入已經是正確的格式,我們需要將其傳遞給模型。我們透過呼叫 model 物件上的 .generate 方法,將 input_ids 作為引數傳遞,並將其結果賦給一個新變數 outputs。我們還設定了第二個引數 max_new_tokens 等於 100,這限制了模型將生成的詞元數量。
  • 輸出目前還不是人類可讀的,要將它們恢復為文字,我們必須解碼輸出。我們可以使用 .decode 方法來完成此操作,並將結果儲存到變數 decoded_outputs 中。
  • 最後,將 decoded_output 變數傳遞給 print 函式,我們就可以在 notebook 中看到模型的輸出了。
  • 可選:將 outputs 變數傳遞給 print 函式,看看它們與 decoded outputs 有何不同。
outputs = model.generate(input_ids["input_ids"], max_new_tokens=100)
decoded_outputs = tokenizer.decode(outputs[0])
print(decoded_outputs)

為什麼我需要解碼?

模型只理解數字,所以當我們以向量形式提供 input_ids 時,它返回的輸出也是相同的格式。為了將這些輸出恢復為文字,我們需要使用分詞器逆轉我們最初的編碼過程。

為什麼輸出讀起來像個故事?

請記住,Phi-2 是一個基礎模型,沒有經過對話用途的指令微調,因此它實際上是一個龐大的自動補全模型。根據您的輸入,它會基於其之前見過的所有網頁、書籍和其他內容,預測接下來最可能出現的內容。

恭喜,您已經成功在您的第一個大語言模型上進行了推理!

我希望透過這個例子能幫助您更好地理解開源機器學習的世界。如果您想繼續您的機器學習學習之旅,我推薦我們最近與 DeepLearning AI 合作釋出的 Hugging Face 課程

社群

你好!這篇文章裡的建議非常有幫助!正是這些小小的改變帶來了最大的變化。非常感謝分享!

班加羅爾全棧開發者課程

班加羅爾全棧培訓

馬拉泰哈利全棧培訓

班加羅爾 React 培訓

很棒的文章!如果您正在為孩子們尋找優質舒適的足球衫,一定要多瞭解一下。期待更多內容。

這篇文章見解深刻,研究充分,觀點清晰——非常值得稱讚!此外,它還激勵我購買復古足球衫來慶祝經典運動時尚的永恆魅力。

這篇文章對主題進行了全面且結構良好的概述,論證清晰易懂。我特別感興趣的是關於利物浦球衣文化意義的部分,它出色地展示了體育與身份認同之間的聯絡。

好文章!謝謝分享!如果有人需要影片教程: https://youtu.be/82Bt4K4YdHg?si=ZIiaoIxY_Y3luqic

註冊登入 以發表評論

© . This site is unofficial and not affiliated with Hugging Face, Inc.