本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
評估提示刻板印象 JumpStart 模型
您可以使用高階ModelRunner
包裝函式來評估 Amazon SageMaker JumpStart 模型,以進行提示刻板印象。提示刻板印象演算法會測量模型在其回應中編碼偏差的機率。這些偏見包括種族、性別、性取向、宗教、年齡、國籍、殘疾、身體外觀和社會經濟狀態。
本教學課程示範如何從 中的 Technology Innovation Institute
本教學課程的各節示範如何執行下列操作:
-
設定您的 環境。
-
執行模型評估。
-
檢視您的分析結果。
設定您的環境
必要條件
-
使用基礎 Python 3.10 核心環境和
ml.g4dn.2xlarge
Amazon Elastic Compute Cloud (AmazonEC2) 執行個體,然後再開始本教學課程。如需執行個體類型及其建議使用案例的詳細資訊,請參閱 可用於 Studio Classic 的執行個體類型。
安裝必要的程式庫
-
在程式碼中安裝 SageMaker、
fmeval
和其他必要的程式庫,如下所示:!pip3 install sagemaker !pip3 install -U pyarrow !pip3 install -U accelerate !pip3 install "ipywidgets>=8" !pip3 install jsonlines !pip install fmeval !pip3 install boto3==1.28.65 import sagemaker
-
將範例
JSON Lines
資料集 crows-pairs_sample.jsonl下載到您目前的工作目錄中。 -
使用以下程式碼檢查您的環境是否包含範例輸入檔案:
import glob # Check for fmeval wheel and built-in dataset if not glob.glob("crows-pairs_sample.jsonl"): print("ERROR - please make sure file exists: crows-pairs_sample.jsonl")
-
定義 JumpStart 模型,如下所示:
from sagemaker.jumpstart.model import JumpStartModel model_id, model_version, = ( "huggingface-llm-falcon-7b-instruct-bf16", "*", )
-
部署 JumpStart 模型並建立端點,如下所示:
my_model = JumpStartModel(model_id=model_id) predictor = my_model.deploy() endpoint_name = predictor.endpoint_name
-
定義模型請求或承載的提示和格式,如下所示:
prompt = "London is the capital of" payload = { "inputs": prompt, "parameters": { "do_sample": True, "top_p": 0.9, "temperature": 0.8, "max_new_tokens": 1024, "decoder_input_details" : True, "details" : True }, }
在先前的程式碼範例中,模型請求中包含下列參數:
-
do_sample
– 指示模型在模型推論期間從原始模型輸出中取樣 (在標準化之前),以將多樣性和創造力引入模型回應。預設為False
。如果您將do_sample
設定為True
,則必須為下列其中一個參數指定值:temperature
、top_p
、top_k
或typical_p
。 -
top_p
– 透過限制產生下一個字符時要考慮的字符集來控制隨機性。較高的 值top_p
允許包含更廣泛詞彙的 集。較低的值會將權杖集限制為更可能的單字。的範圍top_p
大於0
和小於1
。 -
temperature
– 控制產生文字的隨機性。較高的值會temperature
指示模型產生更多隨機且多樣化的回應。較低的值會產生更可預測的回應。的值temperature
必須為正數。 -
max_new_tokens
– 透過限制模型傳回的權杖數量,來限制回應的長度。預設為20
。 -
decoder_input_details
– 傳回模型指派給每個潛在下一個權杖和對應權杖的日誌機率資訊IDs。如果decoder_input_details
設定為True
,您也必須將details
設定為True
,才能接收請求的詳細資訊。預設為False
。
如需此
Hugging Face
模型參數的詳細資訊,請參閱 https://types.py。 -
傳送範例推論請求
若要測試模型,請將範例請求傳送至模型,並列印模型回應,如下所示:
response = predictor.predict(payload) print(response[0]["generated_text"])
在先前的程式碼範例中,如果您的模型提供回應 [{"response": "this is the output"}]
,則print
陳述式會傳回 this is the output
。
設定 FMEval
-
載入要執行的必要程式庫FMEval,如下所示:
import fmeval from fmeval.data_loaders.data_config import DataConfig from fmeval.model_runners.sm_jumpstart_model_runner import JumpStartModelRunner from fmeval.constants import MIME_TYPE_JSONLINES from fmeval.eval_algorithms.prompt_stereotyping import PromptStereotyping, PROMPT_STEREOTYPING from fmeval.eval_algorithms import EvalAlgorithm
-
為您的輸入資料集設定資料組態。
如果您不使用內建資料集,資料組態必須識別 中包含更多偏差的欄
sent_more_input_location
。您還必須識別在 中包含較少偏差的資料欄sent_less_input_location
。如果您使用來自 的內建資料集 JumpStart,這些參數會自動FMEval透過模型中繼資料傳遞至 。指定提示刻板印象任務的
sent_more_input_location
和sent_less_input_location
資料欄、名稱、統一資源識別碼 (URI) 和MIME
類型。config = DataConfig( dataset_name="crows-pairs_sample", dataset_uri="crows-pairs_sample.jsonl", dataset_mime_type=MIME_TYPE_JSONLINES, sent_more_input_location="sent_more", sent_less_input_location="sent_less", category_location="bias_type", )
如需其他任務所需資料欄資訊的詳細資訊,請參閱中的使用自訂輸入資料集一節使用自訂輸入資料集。
-
設定自訂
ModelRunner
,如下列程式碼範例所示:js_model_runner = JumpStartModelRunner( endpoint_name=endpoint_name, model_id=model_id, model_version=model_version, output='[0].generated_text', log_probability='[0].details.prefill[*].logprob', content_template='{"inputs": $prompt, "parameters": {"do_sample": true, "top_p": 0.9, "temperature": 0.8, "max_new_tokens": 1024, "decoder_input_details": true,"details": true}}', )
先前的程式碼範例會指定下列項目:
-
endpoint_name
– 您在先前安裝必要程式庫步驟中建立的端點名稱。 -
model_id
– 用來指定模型的 ID。此參數是在定義模型時 JumpStart指定的。 -
model_version
– 用於指定模型的模型版本。此參數是在定義 JumpStart 模型時指定的。 -
output
– 從 Falcon 7b 模型擷取輸出,該模型會以 generated_text
金鑰傳回其回應。如果您的模型提供回應[{"generated_text": "this is the output"}]
,則[0].generated_text
傳回this is the output
。 -
log_probability
– 擷取此 JumpStart 模型傳回的日誌機率。 -
content_template
– 指定模型如何與請求互動。範例組態範本僅為說明上一個範例而詳細說明,並非必要。內容範本中的參數與 宣告的參數相同payload
。如需此Hugging Face
模型參數的詳細資訊,請參閱 https://types.py。
-
-
設定您的評估報告並將其儲存至目錄,如下列範例程式碼所示:
import os eval_dir = "results-eval-prompt-stereotyping" curr_dir = os.getcwd() eval_results_path = os.path.join(curr_dir, eval_dir) + "/" os.environ["EVAL_RESULTS_PATH"] = eval_results_path if os.path.exists(eval_results_path): print(f"Directory '{eval_results_path}' exists.") else: os.mkdir(eval_results_path)
-
設定平行化係數,如下所示:
os.environ["PARALLELIZATION_FACTOR"] = "1"
PARALLELIZATION_FACTOR
是傳送至運算執行個體之並行批次數量的乘數。如果您的硬體允許平行化,您可以設定此數字,以乘以評估任務的叫用次數。例如,如果您有100
調用,且PARALLELIZATION_FACTOR
設定為2
,則您的任務將執行200
調用。您PARALLELIZATION_FACTOR
最多可以增加10
,或完全移除變數。若要閱讀有關 Lambda 如何使用 AWS 的部落格,PARALLELIZATION_FACTOR
請參閱適用於 Kinesis 和 DynamoDB 事件來源的新 AWS Lambda 擴展控制項。
執行模型評估
-
定義您的評估演算法。下列範例示範如何定義
PromptStereotyping
演算法:eval_algo = PromptStereotyping()
如需計算其他評估任務指標的演算法範例,請參閱在 中評估模型使用fmeval程式庫執行自動評估。
-
執行您的評估演算法。下列程式碼範例使用先前定義的模型和資料組態,以及
prompt_template
用於feature
將提示傳遞給模型的 ,如下所示:eval_output = eval_algo.evaluate(model=js_model_runner, dataset_config=config, prompt_template="$feature", save=True)
您的模型輸出可能與先前的範例輸出不同。
檢視您的分析結果
-
從評估演算法傳回的
eval_output
物件剖析評估報告,如下所示:import json print(json.dumps(eval_output, default=vars, indent=4))
上一個命令會傳回下列輸出 (為了簡潔起見而壓縮):
[ { "eval_name": "prompt_stereotyping", "dataset_name": "crows-pairs_sample", "dataset_scores": [ { "name": "prompt_stereotyping", "value": 0.6666666666666666 } ], "prompt_template": "$feature", "category_scores": [ { "name": "disability", "scores": [ { "name": "prompt_stereotyping", "value": 0.5 } ] }, ... ], "output_path": "/home/sagemaker-user/results-eval-prompt-stereotyping/prompt_stereotyping_crows-pairs_sample.jsonl", "error": null } ]
上一個範例輸出顯示 之後資料集的整體分數
"name": prompt_stereotyping
。此分數是模型回應之間日誌機率的標準化差異,提供較多與較少的偏差。如果分數大於0.5
,這表示您的模型回應更有可能傳回包含更多偏差的回應。如果分數小於0.5
,您的模型更有可能傳回包含較少偏差的回應。如果分數為0.5
,則模型回應不包含輸入資料集所測量的偏差。您將在下列步驟Pandas
DataFrame
中使用output_path
建立 。 -
將結果匯入並讀取至
DataFrame
,並將提示刻板印象分數連接至模型輸入、模型輸出和目標輸出,如下所示:import pandas as pd data = [] with open(os.path.join(eval_results_path, "prompt_stereotyping_crows-pairs_sample.jsonl"), "r") as file: for line in file: data.append(json.loads(line)) df = pd.DataFrame(data) df['eval_algo'] = df['scores'].apply(lambda x: x[0]['name']) df['eval_score'] = df['scores'].apply(lambda x: x[0]['value']) df
如需包含本節所提供程式碼範例的筆記本,請參閱 jumpstart-falcon-stereotyping.ipnyb。