評估提示刻板印象 JumpStart 模型 - Amazon SageMaker

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

評估提示刻板印象 JumpStart 模型

您可以使用高階ModelRunner包裝函式來評估 Amazon SageMaker JumpStart 模型,以進行提示刻板印象。提示刻板印象演算法會測量模型在其回應中編碼偏差的機率。這些偏見包括種族、性別、性取向、宗教、年齡、國籍、殘疾、身體外觀和社會經濟狀態。

本教學課程示範如何從 中的 Technology Innovation Institute 載入 Falcon 7-B 模型, JumpStart並要求此模型產生對提示的回應。然後,本教學課程示範如何根據內建 CrowS -Pairs 開放原始碼挑戰資料集,評估提示刻板印象的回應。

本教學課程的各節示範如何執行下列操作:

  • 設定您的 環境。

  • 執行模型評估。

  • 檢視您的分析結果。

設定您的環境

必要條件
  • 使用基礎 Python 3.10 核心環境和 ml.g4dn.2xlarge Amazon Elastic Compute Cloud (AmazonEC2) 執行個體,然後再開始本教學課程。

    如需執行個體類型及其建議使用案例的詳細資訊,請參閱 可用於 Studio Classic 的執行個體類型

安裝必要的程式庫
  1. 在程式碼中安裝 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
  2. 將範例JSON Lines資料集 crows-pairs_sample.jsonl 下載到您目前的工作目錄中。

  3. 使用以下程式碼檢查您的環境是否包含範例輸入檔案:

    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")
  4. 定義 JumpStart 模型,如下所示:

    from sagemaker.jumpstart.model import JumpStartModel model_id, model_version, = ( "huggingface-llm-falcon-7b-instruct-bf16", "*", )
  5. 部署 JumpStart 模型並建立端點,如下所示:

    my_model = JumpStartModel(model_id=model_id) predictor = my_model.deploy() endpoint_name = predictor.endpoint_name
  6. 定義模型請求或承載的提示和格式,如下所示:

    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,則必須為下列其中一個參數指定值:temperaturetop_ptop_ktypical_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

  1. 載入要執行的必要程式庫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
  2. 為您的輸入資料集設定資料組態。

    如果您不使用內建資料集,資料組態必須識別 中包含更多偏差的欄sent_more_input_location。您還必須識別在 中包含較少偏差的資料欄sent_less_input_location。如果您使用來自 的內建資料集 JumpStart,這些參數會自動FMEval透過模型中繼資料傳遞至 。

    指定提示刻板印象任務的 sent_more_input_locationsent_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", )

    如需其他任務所需資料欄資訊的詳細資訊,請參閱中的使用自訂輸入資料集一節使用自訂輸入資料集

  3. 設定自訂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

  4. 設定您的評估報告並將其儲存至目錄,如下列範例程式碼所示:

    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)
  5. 設定平行化係數,如下所示:

    os.environ["PARALLELIZATION_FACTOR"] = "1"

    PARALLELIZATION_FACTOR 是傳送至運算執行個體之並行批次數量的乘數。如果您的硬體允許平行化,您可以設定此數字,以乘以評估任務的叫用次數。例如,如果您有100調用,且 PARALLELIZATION_FACTOR 設定為 2,則您的任務將執行200調用。您PARALLELIZATION_FACTOR最多可以增加 10,或完全移除變數。若要閱讀有關 Lambda 如何使用 AWS 的部落格,PARALLELIZATION_FACTOR請參閱適用於 Kinesis 和 DynamoDB 事件來源的新 AWS Lambda 擴展控制項。

執行模型評估

  1. 定義您的評估演算法。下列範例示範如何定義PromptStereotyping演算法:

    eval_algo = PromptStereotyping()

    如需計算其他評估任務指標的演算法範例,請參閱在 中評估模型使用fmeval程式庫執行自動評估

  2. 執行您的評估演算法。下列程式碼範例使用先前定義的模型和資料組態,以及prompt_template用於feature將提示傳遞給模型的 ,如下所示:

    eval_output = eval_algo.evaluate(model=js_model_runner, dataset_config=config, prompt_template="$feature", save=True)

    您的模型輸出可能與先前的範例輸出不同。

檢視您的分析結果

  1. 從評估演算法傳回的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,則模型回應不包含輸入資料集所測量的偏差。您將在下列步驟PandasDataFrame中使用 output_path建立 。

  2. 將結果匯入並讀取至 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。