大語言模型的訓練和推理過程存在高能耗及長回應時間等問題,這些問題限制了其在資源有限情境中使用。為瞭解決這些問題,PAI提出了模型蒸餾功能。該功能支援將大模型知識遷移到較小模型,從而在保留大部分效能的同時,大幅降低模型的規模和對計算資源的需求,為更多的實際應用情境提供支援。本文將以通義千問2(Qwen2)大語言模型為基礎,為您介紹大語言模型資料增強和蒸餾解決方案的完整開發流程。
使用流程
該解決方案的完整開發流程如下:
您可以參照資料格式要求和資料準備策略準備相應的訓練資料集。
您可以在PAI-Model Gallery中使用預置的指令增廣模型(Qwen2-1.5B-Instruct-Exp或Qwen2-7B-Instruct-Exp),根據已準備好的資料集中的指令語義資訊,自動擴寫更多相似的指令。指令增廣有助於提升大語言模型的蒸餾訓練的泛化性。
您可以在PAI-Model Gallery中使用預置的指令最佳化模型(Qwen2-1.5B-Instruct-Refine或Qwen2-7B-Instruct-Refine),將已準備好的資料集中的指令(以及增廣的指令)進行最佳化精鍊。指令最佳化有助於提升大語言模型的語言產生能力。
您可以在PAI-Model Gallery中使用預置的教師大語言模型(通義千問2-72B-Instruct)對訓練資料集中的指令產生回複,從而將對應教師大模型的知識進行蒸餾。
您可以在PAI-Model Gallery中使用產生完成的指令-回複資料集,蒸餾訓練對應較小的學生模型,用於實際的應用情境。
前提條件
在開始執行操作前,請確認您已完成以下準備工作:
已開通PAI(DLC、EAS)後付費,並建立預設工作空間,詳情請參見開通PAI並建立預設工作空間。
已建立OSS儲存空間(Bucket),用於儲存訓練資料和訓練獲得的模型檔案。關於如何建立儲存空間,詳情請參見控制台快速入門。
準備指令資料
資料準備策略
為了提升模型蒸餾的有效性和穩定性,您可以參考以下策略準備資料:
您需要準備至少數百條資料,準備的資料多有助於提升模型的效果。
準備的種子資料集的分布應該儘可能廣泛且均衡。例如:任務情境分布廣泛;資料輸入輸出長度應該包含較短和較長情境;如果資料不止一種語言,例如有中文和英文,應當確保語言分布較為均衡。
處理異常資料。即使是少量的異常資料也會對微調效果造成很大的影響。您應當先使用基於規則的方式清洗資料,過濾掉資料集中的異常資料。
資料格式要求
訓練資料集格式要求為:JSON格式的檔案,包含instruction一個欄位,為輸入的指令。相應的指令資料樣本如下:
[
{
"instruction": "在2008年金融危機期間,各國政府採取了哪些主要措施來穩定金融市場?"
},
{
"instruction": "在氣候變化加劇的背景下,各國政府採取了哪些重要行動來推動可持續發展?"
},
{
"instruction": "在2001年科技泡沫破裂期間,各國政府採取了哪些主要措施來支援經濟複蘇?"
}
](可選)使用指令增廣模型進行指令增廣
指令增廣是大語言模型提示工程(Prompt Engineering)的一種常見應用,用於自動增廣使用者提供的指令資料集,以實現資料增強作用。
例如給定如下輸入:
如何做魚香肉絲? 如何準備GRE考試? 如果被朋友誤會了怎麼辦?模型輸出類似如下結果:
教我如何做麻婆豆腐? 提供一個關於如何準備托福考試的詳細指南? 如果你在工作中遇到了挫折,你會如何調整心態?
由於指令的多樣性直接影響了大語言模型的學習泛化性,進行指令增廣能有效提升最終產生的學生模型的效果。基於Qwen2基座模型,PAI提供了兩款自主研發的指令增廣模型,分別為Qwen2-1.5B-Instruct-Exp和Qwen2-7B-Instruct-Exp。您可以在PAI-Model Gallery中一鍵部署模型服務,具體操作步驟如下:
部署模型服務
您可以按照以下操作步驟,將指令增廣模型部署為EAS線上服務:
進入Model Gallery頁面。
登入PAI控制台。
在頂部左上方根據實際情況選擇地區。
在左側導覽列選擇工作空間列表,單擊指定工作空間名稱,進入對應工作空間內。
在左側導覽列選擇。
在Model Gallery頁面右側的模型列表中,搜尋Qwen2-1.5B-Instruct-Exp或Qwen2-7B-Instruct-Exp,並在相應卡片中單擊部署。
在部署配置面板中,系統已預設配置了模型服務資訊和資源部署資訊,您也可以根據需要進行修改。參數配置完成後單擊部署按鈕。
在計費提醒對話方塊中,單擊確定。
系統自動跳轉到部署任務頁面,當狀態為運行中時,表示服務部署成功。
調用模型服務
服務部署成功後,您可以使用API進行模型推理。具體使用方法參考LLM大語言模型部署。以下提供一個樣本,展示如何通過用戶端發起Request調用:
擷取服務訪問地址和Token。
在服務詳情頁面,單擊基本資料地區的查看調用資訊。

在調用資訊對話方塊中,查詢服務訪問地址和Token,並儲存到本地。
在終端中,建立並執行如下Python代碼檔案來調用服務。
import argparse import json import requests from typing import List def post_http_request(prompt: str, system_prompt: str, host: str, authorization: str, max_new_tokens: int, temperature: float, top_k: int, top_p: float) -> requests.Response: headers = { "User-Agent": "Test Client", "Authorization": f"{authorization}" } pload = { "prompt": prompt, "system_prompt": system_prompt, "top_k": top_k, "top_p": top_p, "temperature": temperature, "max_new_tokens": max_new_tokens, "do_sample": True, "eos_token_id": 151645 } response = requests.post(host, headers=headers, json=pload) return response def get_response(response: requests.Response) -> List[str]: data = json.loads(response.content) output = data["response"] return output if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--top-k", type=int, default=50) parser.add_argument("--top-p", type=float, default=0.95) parser.add_argument("--max-new-tokens", type=int, default=2048) parser.add_argument("--temperature", type=float, default=1) parser.add_argument("--prompt", type=str, default="給我唱首歌。") args = parser.parse_args() prompt = args.prompt top_k = args.top_k top_p = args.top_p temperature = args.temperature max_new_tokens = args.max_new_tokens host = "EAS HOST" authorization = "EAS TOKEN" print(f" --- input: {prompt}\n", flush=True) system_prompt = "我希望你扮演一個指令建立者的角色。 你的目標是從【給定指令】中擷取靈感,建立一個全新的指令。" response = post_http_request( prompt, system_prompt, host, authorization, max_new_tokens, temperature, top_k, top_p) output = get_response(response) print(f" --- output: {output}\n", flush=True)其中:
host:配置為已擷取的服務訪問地址。
authorization:配置為已擷取的服務Token。
批量實現指令增廣
您可以使用上述EAS線上服務進行批量調用,實現批量指令增廣。以下程式碼範例展示了如何讀取自訂的JSON格式資料集,批量調用上面的模型介面進行指令增廣。您需要在終端中,建立並執行如下Python代碼檔案來批量調用模型服務。
import requests
import json
import random
from tqdm import tqdm
from typing import List
input_file_path = "input.json" # 輸入檔案名稱
with open(input_file_path) as fp:
data = json.load(fp)
total_size = 10 # 期望的擴充後的總資料量
pbar = tqdm(total=total_size)
while len(data) < total_size:
prompt = random.sample(data, 1)[0]["instruction"]
system_prompt = "我希望你扮演一個指令建立者的角色。 你的目標是從【給定指令】中擷取靈感,建立一個全新的指令。"
top_k = 50
top_p = 0.95
temperature = 1
max_new_tokens = 2048
host = "EAS HOST"
authorization = "EAS TOKEN"
response = post_http_request(
prompt, system_prompt,
host, authorization,
max_new_tokens, temperature, top_k, top_p)
output = get_response(response)
temp = {
"instruction": output
}
data.append(temp)
pbar.update(1)
pbar.close()
output_file_path = "output.json" # 輸出檔案名
with open(output_file_path, 'w') as f:
json.dump(data, f, ensure_ascii=False)其中:
host:配置為已擷取的服務訪問地址。
authorization:配置為已擷取的服務Token。
file_path:請替換為資料集檔案所在的本地路徑。
post_http_request和get_response函數的定義與其在調用模型服務的Python指令碼中對應的函數定義保持一致。
您也可以使用PAI-Designer的LLM-指令擴充(DLC)組件零代碼實現上述功能。具體操作方法,請參考自訂工作流程。
(可選)使用指令最佳化模型進行指令最佳化
指令最佳化是大語言模型提示工程(Prompt Engineering)的另一種常見技術,用於自動最佳化使用者提供的指令資料集,產生更加詳細的指令。這些更詳細的指令能讓大語言模型輸出更詳細的回複。
例如,在指令最佳化模型中給定如下輸入:
如何做魚香肉絲? 如何準備GRE考試? 如果被朋友誤會了怎麼辦?模型輸出類似如下結果:
請提供一個詳細的中國四川風味的魚香肉絲的食譜。包括所需的具體材料列表(如蔬菜、豬肉和調料),以及詳細的步驟說明。如果可能的話,還請推薦適合搭配這道菜的小菜和主食。 請提供一個詳細的指導方案,包括GRE考試的報名、所需資料、備考策略和建議的複習資料。同時,如果可以的話,也請推薦一些有效練習題和類比考試來協助我更好地準備考試。 請提供一個詳細的指導,教我如何在被朋友誤會時保持冷靜和理智,並且有效地溝通來解決問題。請包括一些實用的建議,例如如何表達自己的想法和感受,以及如何避免誤解加劇,並且建議一些具體的對話情境和情境,以便我能更好地理解和練習。
由於指令的詳細性直接影響了大語言模型的輸出指令,進行指令最佳化能有效提升最終產出學生模型的效果。基於Qwen2基座模型,PAI提供了兩款自主研發的指令最佳化模型,分別為Qwen2-1.5B-Instruct-Refine和Qwen2-7B-Instruct-Refine。您可以在PAI-Model Gallery中一鍵部署模型服務,具體操作步驟如下:
部署模型服務
進入Model Gallery頁面。
登入PAI控制台。
在頂部左上方根據實際情況選擇地區。
在左側導覽列選擇工作空間列表,單擊指定工作空間名稱,進入對應工作空間內。
在左側導覽列選擇。
在Model Gallery頁面右側的模型列表中,搜尋Qwen2-1.5B-Instruct-Refine或Qwen2-7B-Instruct-Refine,並在相應卡片中單擊部署。
在部署配置面板中,系統已預設配置了模型服務資訊和資源部署資訊,您也可以根據需要進行修改。參數配置完成後單擊部署按鈕。
在計費提醒對話方塊中,單擊確定。
系統自動跳轉到部署任務頁面,當狀態為運行中時,表示服務部署成功。
調用模型服務
服務部署成功後,您可以使用API進行模型推理。具體使用方法參考LLM大語言模型部署。以下提供一個樣本,展示如何通過用戶端發起Request調用:
擷取服務訪問地址和Token。
在服務詳情頁面,單擊基本資料地區的查看調用資訊。

在調用資訊對話方塊中,查詢服務訪問地址和Token,並儲存到本地。
在終端中,建立並執行如下Python代碼檔案來調用服務。
import argparse import json import requests from typing import List def post_http_request(prompt: str, system_prompt: str, host: str, authorization: str, max_new_tokens: int, temperature: float, top_k: int, top_p: float) -> requests.Response: headers = { "User-Agent": "Test Client", "Authorization": f"{authorization}" } pload = { "prompt": prompt, "system_prompt": system_prompt, "top_k": top_k, "top_p": top_p, "temperature": temperature, "max_new_tokens": max_new_tokens, "do_sample": True, "eos_token_id": 151645 } response = requests.post(host, headers=headers, json=pload) return response def get_response(response: requests.Response) -> List[str]: data = json.loads(response.content) output = data["response"] return output if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--top-k", type=int, default=2) parser.add_argument("--top-p", type=float, default=0.95) parser.add_argument("--max-new-tokens", type=int, default=256) parser.add_argument("--temperature", type=float, default=0.5) parser.add_argument("--prompt", type=str, default="給我唱首歌。") args = parser.parse_args() prompt = args.prompt top_k = args.top_k top_p = args.top_p temperature = args.temperature max_new_tokens = args.max_new_tokens host = "EAS HOST" authorization = "EAS TOKEN" print(f" --- input: {prompt}\n", flush=True) system_prompt = "請最佳化這個指令,將其修改為一個更詳細具體的指令。" response = post_http_request( prompt, system_prompt, host, authorization, max_new_tokens, temperature, top_k, top_p) output = get_response(response) print(f" --- output: {output}\n", flush=True)其中:
host:配置為已擷取的服務訪問地址。
authorization:配置為已擷取的服務Token。
批量實現指令最佳化
您可以使用上述EAS線上服務進行批量調用,實現批量指令最佳化。以下程式碼範例展示了如何讀取自訂的JSON格式資料集,批量調用上面的模型介面進行品質最佳化。您需要在終端中,建立並執行如下Python代碼檔案來批量調用模型服務。
import requests
import json
import random
from tqdm import tqdm
from typing import List
input_file_path = "input.json" # 輸入檔案名稱
with open(input_file_path) as fp:
data = json.load(fp)
pbar = tqdm(total=len(data))
new_data = []
for d in data:
prompt = d["instruction"]
system_prompt = "請最佳化以下指令。"
top_k = 50
top_p = 0.95
temperature = 1
max_new_tokens = 2048
host = "EAS HOST"
authorization = "EAS TOKEN"
response = post_http_request(
prompt, system_prompt,
host, authorization,
max_new_tokens, temperature, top_k, top_p)
output = get_response(response)
temp = {
"instruction": output
}
new_data.append(temp)
pbar.update(1)
pbar.close()
output_file_path = "output.json" # 輸出檔案名
with open(output_file_path, 'w') as f:
json.dump(new_data, f, ensure_ascii=False)
其中:
host:配置為已擷取的服務訪問地址。
authorization:配置為已擷取的服務Token。
file_path:請替換為資料集檔案所在的本地路徑。
post_http_request和get_response函數的定義與其在調用模型服務的Python指令碼中對應的函數定義保持一致。
您也可以使用PAI-Designer的LLM-指令最佳化(DLC)組件零代碼實現上述功能。具體操作方法,請參考自訂工作流程。
部署教師大語言模型產生對應回複
部署模型服務
在最佳化好資料集中的指令以後,您可以按照以下操作步驟,部署教師大語言模型產生對應回複。
進入Model Gallery頁面。
登入PAI控制台。
在頂部左上方根據實際情況選擇地區。
在左側導覽列選擇工作空間列表,單擊指定工作空間名稱,進入對應工作空間內。
在左側導覽列選擇。
在Model Gallery頁面右側的模型列表中,搜尋通義千問2-72B-Instruct,並在相應卡片中單擊部署。
在部署配置面板中,系統已預設配置了模型服務資訊和資源部署資訊,您也可以根據需要進行修改。參數配置完成後單擊部署按鈕。
在計費提醒對話方塊中,單擊確定。
系統自動跳轉到部署任務頁面,當狀態為運行中時,表示服務部署成功。
調用模型服務
服務部署成功後,您可以使用API進行模型推理。具體使用方法參考LLM大語言模型部署。以下提供一個樣本,展示如何通過用戶端發起Request調用:
擷取服務訪問地址和Token。
在服務詳情頁面,單擊基本資料地區的查看調用資訊。

在調用資訊對話方塊中,查詢服務訪問地址和Token,並儲存到本地。
在終端中,建立並執行如下Python代碼檔案來調用服務。
import argparse import json import requests from typing import List def post_http_request(prompt: str, system_prompt: str, host: str, authorization: str, max_new_tokens: int, temperature: float, top_k: int, top_p: float) -> requests.Response: headers = { "User-Agent": "Test Client", "Authorization": f"{authorization}" } pload = { "prompt": prompt, "system_prompt": system_prompt, "top_k": top_k, "top_p": top_p, "temperature": temperature, "max_new_tokens": max_new_tokens, "do_sample": True, } response = requests.post(host, headers=headers, json=pload) return response def get_response(response: requests.Response) -> List[str]: data = json.loads(response.content) output = data["response"] return output if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--top-k", type=int, default=50) parser.add_argument("--top-p", type=float, default=0.95) parser.add_argument("--max-new-tokens", type=int, default=2048) parser.add_argument("--temperature", type=float, default=0.5) parser.add_argument("--prompt", type=str) parser.add_argument("--system_prompt", type=str) args = parser.parse_args() prompt = args.prompt system_prompt = args.system_prompt top_k = args.top_k top_p = args.top_p temperature = args.temperature max_new_tokens = args.max_new_tokens host = "EAS HOST" authorization = "EAS TOKEN" print(f" --- input: {prompt}\n", flush=True) response = post_http_request( prompt, system_prompt, host, authorization, max_new_tokens, temperature, top_k, top_p) output = get_response(response) print(f" --- output: {output}\n", flush=True)其中:
host:配置為已擷取的服務訪問地址。
authorization:配置為已擷取的服務Token。
批量實現教師模型的指令標註
以下代碼示範了如何讀取自訂JSON格式資料集,批量調用上述模型介面進行教師模型標註。您需要在終端中,建立並執行如下Python代碼檔案來批量調用模型服務。
import json
from tqdm import tqdm
import requests
from typing import List
input_file_path = "input.json" # 輸入檔案名稱
with open(input_file_path) as fp:
data = json.load(fp)
pbar = tqdm(total=len(data))
new_data = []
for d in data:
system_prompt = "You are a helpful assistant."
prompt = d["instruction"]
print(prompt)
top_k = 50
top_p = 0.95
temperature = 0.5
max_new_tokens = 2048
host = "EAS HOST"
authorization = "EAS TOKEN"
response = post_http_request(
prompt, system_prompt,
host, authorization,
max_new_tokens, temperature, top_k, top_p)
output = get_response(response)
temp = {
"instruction": prompt,
"output": output
}
new_data.append(temp)
pbar.update(1)
pbar.close()
output_file_path = "output.json" # 輸出檔案名
with open(output_file_path, 'w') as f:
json.dump(new_data, f, ensure_ascii=False)其中:
host:配置為已擷取的服務訪問地址。
authorization:配置為已擷取的服務Token。
file_path:請替換為資料集檔案所在的本地路徑。
post_http_request和get_response函數的定義與其在調用模型服務指令碼中對應的函數定義保持一致。
蒸餾訓練較小的學生模型
訓練模型
當獲得教師模型的回複後,您可以在PAI-Model Gallery中,實現學生模型的訓練,無需編寫代碼,極大簡化了模型的開發過程。本方案以Qwen2-7B-Instruct模型為例,為您介紹如何使用已準備好的訓練資料,在PAI-Model Gallery中進行模型訓練,具體操作步驟如下:
進入Model Gallery頁面。
登入PAI控制台。
在頂部左上方根據實際情況選擇地區。
在左側導覽列選擇工作空間列表,單擊指定工作空間名稱,進入對應工作空間內。
在左側導覽列選擇。
在Model Gallery頁面右側的模型列表中,搜尋並單擊通義千問2-7B-Instruct模型卡片,進入模型詳情頁面。
在模型詳情頁面,單擊右上方的微調訓練。
在微調訓練配置面板中,配置以下關鍵參數,其他參數取預設配置。
參數
描述
預設值
資料集配置
訓練資料集
在下拉式清單中選擇OSS檔案或目錄,並按照以下步驟選擇資料集檔案所在的OSS儲存路徑:
單擊
,並選擇已建立的OSS儲存空間。單擊上傳檔案,並按控制台操作指引,將從上述步驟獲得的資料集檔案上傳到OSS目錄中。
單擊確定。
無
訓練輸出配置
model
單擊
,選擇已建立的OSS儲存目錄。無
tensorboard
單擊
,選擇已建立的OSS儲存目錄。無
計算資源配置
任務資源
選擇資源規格,系統會自動推薦適合的資源規格。
無
超參數配置
learning_rate
模型訓練的學習率,Float類型。
5e-5
num_train_epochs
訓練輪次,INT類型。
1
per_device_train_batch_size
每張GPU卡在一次訓練迭代的資料量,INT類型。
1
seq_length
文本序列長度,INT類型。
128
lora_dim
LoRA維度,INT類型。當lora_dim>0時,使用LoRA/QLoRA輕量化訓練。
32
lora_alpha
LoRA權重,INT類型。當lora_dim>0時,使用LoRA/QLoRA輕量化訓練,該參數生效。
32
load_in_4bit
模型是否以4位元載入,bool類型。取值如下:
true
false
當lora_dim>0、load_in_4bit為true且load_in_8bit為false時,使用4位元QLoRA輕量化訓練。
true
load_in_8bit
模型是否以8位元載入,bool類型。取值如下:
true
false
當lora_dim>0、load_in_4bit為false且load_in_8bit為true時,使用8位元QLoRA輕量化訓練。
false
gradient_accumulation_steps
梯度累積步數,INT類型。
8
apply_chat_template
演算法是否結合訓練資料與預設的Chat Template來最佳化模型輸出,bool類型。取值如下:
true
false
以Qwen2系列模型為例,格式為:
問題:
<|im_end|>\n<|im_start|>user\n + instruction + <|im_end|>\n答案:
<|im_start|>assistant\n + output + <|im_end|>\n
true
system_prompt
模型訓練使用的系統提示,String類型。
You are a helpful assistant
參數配置完成後,單擊訓練。
在計費提醒對話方塊中,單擊確定。
系統將自動跳轉到訓練任務頁面。
部署模型服務
當模型訓練完成後,您可以按照以下操作步驟,將模型部署為EAS線上服務。
在訓練任務頁面右側,單擊部署。
在部署配置面板中,系統已預設配置了模型服務資訊和資源部署資訊,您也可以根據需要進行修改。參數配置完成後單擊部署按鈕。
在計費提醒對話方塊中,單擊確定。
系統自動跳轉到部署任務頁面,當狀態為運行中時,表示服務部署成功。
調用模型服務
服務部署成功後,您可以使用API進行模型推理。具體使用方法參考LLM大語言模型部署。