|
|
ลองใช้ Colab Notebook
|
ดูสมุดบันทึกใน GitHub
|
ดาวน์โหลดสมุดบันทึก
|
ในโน้ตบุ๊คนี้ คุณจะได้เรียนรู้วิธีเริ่มต้นใช้งานบริการการปรับแต่ง PaLM API โดยใช้คําสั่ง curl หรือ API คำขอ Python เพื่อเรียก PaLM REST API ในส่วนนี้ คุณจะได้เรียนรู้วิธีปรับแต่งโมเดลข้อความที่อยู่เบื้องหลังบริการสร้างข้อความของ PaLM API
ตั้งค่า
ตรวจสอบสิทธิ์
PaLM API ช่วยให้คุณปรับแต่งโมเดลโดยใช้ข้อมูลของคุณเองได้ เนื่องจากเป็นข้อมูลของคุณและรูปแบบที่ปรับแต่งแล้ว จึงต้องมีการควบคุมการเข้าถึงที่เข้มงวดกว่าคีย์ API จะให้ได้
ก่อนที่จะเรียกใช้บทแนะนำนี้ได้ คุณจะต้องตั้งค่า OAuth สำหรับโปรเจ็กต์ก่อน
หากต้องการเรียกใช้สมุดบันทึกนี้ใน Colab ให้เริ่มด้วยการอัปโหลดไฟล์ client_secret*.json โดยใช้ตัวเลือก "ไฟล์ > อัปโหลด"

cp client_secret*.json client_secret.jsonls
client_secret.json
คำสั่ง gcloud นี้จะเปลี่ยนไฟล์ client_secret.json ให้เป็นข้อมูลเข้าสู่ระบบที่ใช้ตรวจสอบสิทธิ์กับบริการได้
import os
if 'COLAB_RELEASE_TAG' in os.environ:
# Use `--no-browser` in colab
!gcloud auth application-default login --no-browser --client-id-file client_secret.json --scopes='https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/generative-language.tuning'
else:
!gcloud auth application-default login --client-id-file client_secret.json --scopes='https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/generative-language.tuning'
การเรียก REST API ด้วย CURL
ส่วนนี้จะแสดงตัวอย่างคำสั่ง curl เพื่อเรียกใช้ REST API คุณจะได้เรียนรู้วิธีสร้างงานการปรับแต่ง ตรวจสอบสถานะ และเรียกใช้การอนุมานเมื่อเสร็จสมบูรณ์
ตั้งค่าตัวแปร
ตั้งค่าตัวแปรสำหรับค่าที่เกิดขึ้นประจำเพื่อใช้กับการเรียก API ของ REST ที่เหลือ โค้ดนี้ใช้ไลบรารี os ของ Python เพื่อตั้งค่าตัวแปรสภาพแวดล้อมซึ่งเข้าถึงได้ในเซลล์โค้ดทั้งหมด
ระบบนี้ใช้เฉพาะกับสภาพแวดล้อมสมุดบันทึก Colab เท่านั้น โค้ดในเซลล์โค้ดถัดไปเทียบเท่ากับการเรียกใช้คําสั่งต่อไปนี้ในเทอร์มินัล bash
export access_token=$(gcloud auth application-default print-access-token)
export project_id=my-project-id
export base_url=https://generativelanguage.googleapis.com
import os
access_token = !gcloud auth application-default print-access-token
access_token = '\n'.join(access_token)
os.environ['access_token'] = access_token
os.environ['project_id'] = "project-id"
os.environ['base_url'] = "https://generativelanguage.googleapis.com"
แสดงรายการโมเดลที่ปรับแต่งแล้ว
ยืนยันการตั้งค่าการตรวจสอบสิทธิ์โดยแสดงรายการโมเดลที่ปรับแต่งแล้วที่ใช้ได้ในปัจจุบัน
curl -X GET ${base_url}/v1beta3/tunedModels \-H 'Content-Type: application/json' \-H "Authorization: Bearer ${access_token}" \-H "x-goog-user-project: ${project_id}" | grep name
"name": "tunedModels/testnumbergenerator-fvitocr834l6",
"name": "tunedModels/my-display-name-81-9wpmc1m920vq",
"displayName": "my display name 81",
"name": "tunedModels/number-generator-model-kctlevca1g3q",
"name": "tunedModels/my-display-name-81-r9wcuda14lyy",
"displayName": "my display name 81",
"name": "tunedModels/number-generator-model-w1eabln5adwp",
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 17583 0 17583 0 0 51600 0 --:--:-- --:--:-- --:--:-- 51563
สร้างโมเดลที่ปรับแต่งแล้ว
หากต้องการสร้างโมเดลที่ปรับแต่งแล้ว คุณต้องส่งชุดข้อมูลไปยังโมเดลในช่อง training_data
ในตัวอย่างนี้ คุณจะปรับแต่งโมเดลเพื่อสร้างตัวเลขถัดไปในลำดับ เช่น หากอินพุตคือ 1 โมเดลควรแสดงผลเป็น 2 หากอินพุตคือ one hundred เอาต์พุตควรเป็น one hundred one
curl -X POST ${base_url}/v1beta3/tunedModels \-H 'Content-Type: application/json' \-H "Authorization: Bearer ${access_token}" \-H "x-goog-user-project: ${project_id}" \-d '{"display_name": "number generator model","base_model": "models/text-bison-001","tuning_task": {"hyperparameters": {"batch_size": 2,"learning_rate": 0.001,"epoch_count":3,},"training_data": {"examples": {"examples": [{"text_input": "1","output": "2",},{"text_input": "3","output": "4",},{"text_input": "-3","output": "-2",},{"text_input": "twenty two","output": "twenty three",},{"text_input": "two hundred","output": "two hundred one",},{"text_input": "ninety nine","output": "one hundred",},{"text_input": "8","output": "9",},{"text_input": "-98","output": "-97",},{"text_input": "1,000","output": "1,001",},{"text_input": "10,100,000","output": "10,100,001",},{"text_input": "thirteen","output": "fourteen",},{"text_input": "eighty","output": "eighty one",},{"text_input": "one","output": "two",},{"text_input": "three","output": "four",},{"text_input": "seven","output": "eight",}]}}}}' | tee tunemodel.json
{
"name": "tunedModels/number-generator-model-q2d0uism5ivd/operations/xvyx09sjxlmh",
"metadata": {
"@type": "type.googleapis.com/google.ai.generativelanguage.v1beta3.CreateTunedModelMetadata",
"totalSteps": 23,
"tunedModel": "tunedModels/number-generator-model-q2d0uism5ivd"
}
}
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2277 0 297 100 1980 146 975 0:00:02 0:00:02 --:--:-- 1121
รับสถานะโมเดลที่ปรับแต่ง
ระบบจะตั้งค่าสถานะของโมเดลเป็น CREATING ระหว่างการฝึก และจะเปลี่ยนเป็น ACTIVE เมื่อการฝึกเสร็จสมบูรณ์
ด้านล่างนี้เป็นโค้ด Python บางส่วนที่ใช้แยกวิเคราะห์ชื่อโมเดลที่สร้างขึ้นจาก JSON ของการตอบกลับ หากคุณเรียกใช้สิ่งนี้ในเทอร์มินัล ให้ลองใช้โปรแกรมแยกวิเคราะห์ JSON ของ bash เพื่อแยกวิเคราะห์การตอบกลับ
import json
first_page = json.load(open('tunemodel.json'))
os.environ['modelname'] = first_page['metadata']['tunedModel']
print(os.environ['modelname'])
tunedModels/number-generator-model-q2d0uism5ivd
ส่งคําขอ GET อีกครั้งพร้อมชื่อโมเดลเพื่อรับข้อมูลเมตาของโมเดลซึ่งมีช่องสถานะ
curl -X GET ${base_url}/v1beta3/${modelname} \-H 'Content-Type: application/json' \-H "Authorization: Bearer ${access_token}" \-H "x-goog-user-project: ${project_id}" \ | grep state
"state": "CREATING",
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 494 0 494 0 0 760 0 --:--:-- --:--:-- --:--:-- 760
curl: (3) URL using bad/illegal format or missing URL
เรียกใช้การอนุมาน
เมื่องานการปรับแต่งเสร็จแล้ว คุณจะใช้งานดังกล่าวเพื่อสร้างข้อความด้วยบริการข้อความได้
curl -X POST ${base_url}/v1beta3/${modelname}:generateText \-H 'Content-Type: application/json' \-H "Authorization: Bearer ${access_token}" \-H "x-goog-user-project: ${project_id}" \-d '{"prompt": {"text": "4"},"temperature": 1.0,"candidate_count": 2}' | grep output
"output": "3 2 1",
"output": "3 2",
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1569 0 1447 100 122 183 15 0:00:08 0:00:07 0:00:01 310
เอาต์พุตจากโมเดลอาจถูกต้องหรือไม่ถูกต้องก็ได้ หากโมเดลที่ปรับแต่งแล้วมีประสิทธิภาพไม่เป็นไปตามมาตรฐานที่กำหนด คุณสามารถลองเพิ่มตัวอย่างคุณภาพสูงอีก ปรับแต่งไฮเปอร์พารามิเตอร์ หรือเพิ่มคำนำหน้าในตัวอย่าง คุณยังสร้างรูปแบบที่ปรับแต่งอีกรูปแบบหนึ่งโดยอิงตามรูปแบบแรกที่สร้างไว้ได้ด้วย
ดูคําแนะนําเพิ่มเติมเกี่ยวกับการปรับปรุงประสิทธิภาพได้ในคู่มือการปรับแต่ง
เรียกใช้ REST API ด้วยคำขอ Python
คุณจะเรียก API ที่เหลือได้ด้วยไลบรารีที่ให้คุณส่งคำขอ HTTP ตัวอย่างชุดถัดไปใช้คลังคำขอ Python และแสดงฟีเจอร์ขั้นสูงบางอย่าง
ตั้งค่าตัวแปร
access_token = !gcloud auth application-default print-access-token
access_token = '\n'.join(access_token)
project = 'project-id'
base_url = "https://generativelanguage.googleapis.com"
นำเข้าคลัง requests
import requests
import json
แสดงรายการโมเดลที่ปรับแต่งแล้ว
ยืนยันการตั้งค่าการตรวจสอบสิทธิ์โดยแสดงรายการโมเดลที่ปรับแต่งแล้วที่ใช้ได้ในปัจจุบัน
headers={
'Authorization': 'Bearer ' + access_token,
'Content-Type': 'application/json',
'x-goog-user-project': project
}
result = requests.get(
url=f'{base_url}/v1beta3/tunedModels',
headers = headers,
)
result.json()
{'tunedModels': [{'name': 'tunedModels/testnumbergenerator-fvitocr834l6',
'baseModel': 'models/text-bison-001',
'displayName': 'test_number_generator',
'description': '{"description":"generates the next number in the sequence given the input text","exampleInput":"input: 1","exampleOutput":"output: 2","datasourceUrl":"https://drive.google.com/open?id=11Pdm6GNom4vlBMUHwO6yFjGQT3t1yi44WVShXMFnkVA&authuser=0&resourcekey=0-2d17tccbdBoThXMkNDvtag","showedTuningComplete":false}',
'state': 'ACTIVE',
'createTime': '2023-09-18T11:06:39.092786Z',
'updateTime': '2023-09-18T11:07:24.198359Z',
'tuningTask': {'startTime': '2023-09-18T11:06:39.461814784Z',
'completeTime': '2023-09-18T11:07:24.198359Z',
'snapshots': [{'step': 1,
'meanLoss': 16.613504,
'computeTime': '2023-09-18T11:06:44.532937624Z'},
{'step': 2,
'epoch': 1,
'meanLoss': 20.299532,
'computeTime': '2023-09-18T11:06:47.825134421Z'},
{'step': 3,
'epoch': 1,
'meanLoss': 8.169708,
'computeTime': '2023-09-18T11:06:50.580344344Z'},
{'step': 4,
'epoch': 2,
'meanLoss': 3.7588992,
'computeTime': '2023-09-18T11:06:53.219133748Z'},
{'step': 5,
'epoch': 3,
'meanLoss': 2.0643115,
'computeTime': '2023-09-18T11:06:55.828458606Z'},
{'step': 6,
'epoch': 3,
'meanLoss': 1.9765375,
'computeTime': '2023-09-18T11:06:58.426053772Z'},
{'step': 7,
'epoch': 4,
'meanLoss': 0.9276156,
'computeTime': '2023-09-18T11:07:01.231832398Z'},
{'step': 8,
'epoch': 5,
'meanLoss': 1.8424839,
'computeTime': '2023-09-18T11:07:03.822710074Z'},
{'step': 9,
'epoch': 5,
'meanLoss': 1.1747926,
'computeTime': '2023-09-18T11:07:06.441685551Z'},
{'step': 10,
'epoch': 6,
'meanLoss': 0.3079359,
'computeTime': '2023-09-18T11:07:08.793491157Z'},
{'step': 11,
'epoch': 7,
'meanLoss': 0.543368,
'computeTime': '2023-09-18T11:07:11.393264892Z'},
{'step': 12,
'epoch': 7,
'meanLoss': 0.35068464,
'computeTime': '2023-09-18T11:07:13.808021238Z'},
{'step': 13,
'epoch': 8,
'meanLoss': 0.026032856,
'computeTime': '2023-09-18T11:07:16.295972078Z'},
{'step': 14,
'epoch': 8,
'meanLoss': 0.108341046,
'computeTime': '2023-09-18T11:07:18.941247488Z'},
{'step': 15,
'epoch': 9,
'meanLoss': 0.016470395,
'computeTime': '2023-09-18T11:07:21.607654306Z'},
{'step': 16,
'epoch': 10,
'meanLoss': 0.063049875,
'computeTime': '2023-09-18T11:07:24.077271307Z'}],
'hyperparameters': {'epochCount': 10,
'batchSize': 16,
'learningRate': 0.02} },
'temperature': 0.7,
'topP': 0.95,
'topK': 40},
{'name': 'tunedModels/my-display-name-81-9wpmc1m920vq',
'baseModel': 'models/text-bison-tuning-test',
'displayName': 'my display name 81',
'state': 'ACTIVE',
'createTime': '2023-09-18T22:02:08.690991Z',
'updateTime': '2023-09-18T22:02:28.806318Z',
'tuningTask': {'startTime': '2023-09-18T22:02:09.161100369Z',
'completeTime': '2023-09-18T22:02:28.806318Z',
'snapshots': [{'step': 1,
'meanLoss': 7.2774773,
'computeTime': '2023-09-18T22:02:12.453056368Z'},
{'step': 2,
'meanLoss': 6.1902447,
'computeTime': '2023-09-18T22:02:13.789508217Z'},
{'step': 3,
'meanLoss': 5.5545835,
'computeTime': '2023-09-18T22:02:15.136220505Z'},
{'step': 4,
'epoch': 1,
'meanLoss': 7.9237704,
'computeTime': '2023-09-18T22:02:16.474358517Z'},
{'step': 5,
'epoch': 1,
'meanLoss': 7.6770706,
'computeTime': '2023-09-18T22:02:17.758261108Z'},
{'step': 6,
'epoch': 1,
'meanLoss': 7.378622,
'computeTime': '2023-09-18T22:02:19.114072224Z'},
{'step': 7,
'epoch': 1,
'meanLoss': 4.485537,
'computeTime': '2023-09-18T22:02:20.927434115Z'},
{'step': 8,
'epoch': 2,
'meanLoss': 6.815181,
'computeTime': '2023-09-18T22:02:22.267906011Z'},
{'step': 9,
'epoch': 2,
'meanLoss': 6.411363,
'computeTime': '2023-09-18T22:02:24.078114085Z'},
{'step': 10,
'epoch': 2,
'meanLoss': 8.585093,
'computeTime': '2023-09-18T22:02:25.441598938Z'},
{'step': 11,
'epoch': 2,
'meanLoss': 4.901249,
'computeTime': '2023-09-18T22:02:27.108985392Z'},
{'step': 12,
'epoch': 3,
'meanLoss': 7.073003,
'computeTime': '2023-09-18T22:02:28.441662034Z'}],
'hyperparameters': {'epochCount': 3,
'batchSize': 4,
'learningRate': 0.001} },
'temperature': 0.7,
'topP': 0.95,
'topK': 40},
{'name': 'tunedModels/number-generator-model-kctlevca1g3q',
'baseModel': 'models/text-bison-tuning-test',
'displayName': 'number generator model',
'state': 'ACTIVE',
'createTime': '2023-09-18T23:43:21.461545Z',
'updateTime': '2023-09-18T23:43:49.205493Z',
'tuningTask': {'startTime': '2023-09-18T23:43:21.542403958Z',
'completeTime': '2023-09-18T23:43:49.205493Z',
'snapshots': [{'step': 1,
'meanLoss': 7.342065,
'computeTime': '2023-09-18T23:43:23.356271969Z'},
{'step': 2,
'meanLoss': 7.255807,
'computeTime': '2023-09-18T23:43:24.620248223Z'},
{'step': 3,
'meanLoss': 5.4591417,
'computeTime': '2023-09-18T23:43:25.854505395Z'},
{'step': 4,
'meanLoss': 6.968665,
'computeTime': '2023-09-18T23:43:27.138260198Z'},
{'step': 5,
'meanLoss': 4.578809,
'computeTime': '2023-09-18T23:43:28.404943274Z'},
{'step': 6,
'meanLoss': 6.4862137,
'computeTime': '2023-09-18T23:43:29.631624883Z'},
{'step': 7,
'meanLoss': 9.781939,
'computeTime': '2023-09-18T23:43:30.801341449Z'},
{'step': 8,
'epoch': 1,
'meanLoss': 5.990006,
'computeTime': '2023-09-18T23:43:31.854703315Z'},
{'step': 9,
'epoch': 1,
'meanLoss': 8.846312,
'computeTime': '2023-09-18T23:43:33.075785103Z'},
{'step': 10,
'epoch': 1,
'meanLoss': 6.1585655,
'computeTime': '2023-09-18T23:43:34.310432174Z'},
{'step': 11,
'epoch': 1,
'meanLoss': 4.7877502,
'computeTime': '2023-09-18T23:43:35.381582526Z'},
{'step': 12,
'epoch': 1,
'meanLoss': 9.660514,
'computeTime': '2023-09-18T23:43:36.445446408Z'},
{'step': 13,
'epoch': 1,
'meanLoss': 5.6482882,
'computeTime': '2023-09-18T23:43:37.603237821Z'},
{'step': 14,
'epoch': 1,
'meanLoss': 3.162092,
'computeTime': '2023-09-18T23:43:38.671463397Z'},
{'step': 15,
'epoch': 2,
'meanLoss': 6.322996,
'computeTime': '2023-09-18T23:43:39.769742201Z'},
{'step': 16,
'epoch': 2,
'meanLoss': 6.781,
'computeTime': '2023-09-18T23:43:40.985967994Z'},
{'step': 17,
'epoch': 2,
'meanLoss': 5.136773,
'computeTime': '2023-09-18T23:43:42.235469710Z'},
{'step': 18,
'epoch': 2,
'meanLoss': 7.2091155,
'computeTime': '2023-09-18T23:43:43.415178581Z'},
{'step': 19,
'epoch': 2,
'meanLoss': 7.7508755,
'computeTime': '2023-09-18T23:43:44.775221774Z'},
{'step': 20,
'epoch': 2,
'meanLoss': 8.144815,
'computeTime': '2023-09-18T23:43:45.788824334Z'},
{'step': 21,
'epoch': 2,
'meanLoss': 5.485137,
'computeTime': '2023-09-18T23:43:46.812663998Z'},
{'step': 22,
'epoch': 2,
'meanLoss': 3.709197,
'computeTime': '2023-09-18T23:43:47.971764087Z'},
{'step': 23,
'epoch': 3,
'meanLoss': 6.0069466,
'computeTime': '2023-09-18T23:43:49.004191079Z'}],
'hyperparameters': {'epochCount': 3,
'batchSize': 2,
'learningRate': 0.001} },
'temperature': 0.7,
'topP': 0.95,
'topK': 40},
{'name': 'tunedModels/my-display-name-81-r9wcuda14lyy',
'baseModel': 'models/text-bison-tuning-test',
'displayName': 'my display name 81',
'state': 'ACTIVE',
'createTime': '2023-09-18T23:52:06.980185Z',
'updateTime': '2023-09-18T23:52:26.679601Z',
'tuningTask': {'startTime': '2023-09-18T23:52:07.616953503Z',
'completeTime': '2023-09-18T23:52:26.679601Z',
'snapshots': [{'step': 1,
'meanLoss': 7.2774773,
'computeTime': '2023-09-18T23:52:10.278936662Z'},
{'step': 2,
'meanLoss': 6.2793097,
'computeTime': '2023-09-18T23:52:11.630844790Z'},
{'step': 3,
'meanLoss': 5.540499,
'computeTime': '2023-09-18T23:52:13.027840389Z'},
{'step': 4,
'epoch': 1,
'meanLoss': 7.977523,
'computeTime': '2023-09-18T23:52:14.368199020Z'},
{'step': 5,
'epoch': 1,
'meanLoss': 7.6197805,
'computeTime': '2023-09-18T23:52:15.872428752Z'},
{'step': 6,
'epoch': 1,
'meanLoss': 7.3851357,
'computeTime': '2023-09-18T23:52:17.213094182Z'},
{'step': 7,
'epoch': 1,
'meanLoss': 4.5342345,
'computeTime': '2023-09-18T23:52:19.090698421Z'},
{'step': 8,
'epoch': 2,
'meanLoss': 6.8603754,
'computeTime': '2023-09-18T23:52:20.494844731Z'},
{'step': 9,
'epoch': 2,
'meanLoss': 6.418575,
'computeTime': '2023-09-18T23:52:21.815997555Z'},
{'step': 10,
'epoch': 2,
'meanLoss': 8.659064,
'computeTime': '2023-09-18T23:52:23.524287192Z'},
{'step': 11,
'epoch': 2,
'meanLoss': 4.856765,
'computeTime': '2023-09-18T23:52:24.864661291Z'},
{'step': 12,
'epoch': 3,
'meanLoss': 7.1078596,
'computeTime': '2023-09-18T23:52:26.225055381Z'}],
'hyperparameters': {'epochCount': 3,
'batchSize': 4,
'learningRate': 0.001} },
'temperature': 0.7,
'topP': 0.95,
'topK': 40},
{'name': 'tunedModels/number-generator-model-w1eabln5adwp',
'baseModel': 'models/text-bison-tuning-test',
'displayName': 'number generator model',
'state': 'ACTIVE',
'createTime': '2023-09-19T19:29:08.622497Z',
'updateTime': '2023-09-19T19:29:46.063853Z',
'tuningTask': {'startTime': '2023-09-19T19:29:08.806930486Z',
'completeTime': '2023-09-19T19:29:46.063853Z',
'snapshots': [{'step': 1,
'meanLoss': 7.342065,
'computeTime': '2023-09-19T19:29:13.023811994Z'},
{'step': 2,
'meanLoss': 7.1960244,
'computeTime': '2023-09-19T19:29:14.844046282Z'},
{'step': 3,
'meanLoss': 5.480289,
'computeTime': '2023-09-19T19:29:16.596884354Z'},
{'step': 4,
'meanLoss': 6.851822,
'computeTime': '2023-09-19T19:29:17.741735378Z'},
{'step': 5,
'meanLoss': 4.5535283,
'computeTime': '2023-09-19T19:29:18.914760812Z'},
{'step': 6,
'meanLoss': 6.449012,
'computeTime': '2023-09-19T19:29:20.053316042Z'},
{'step': 7,
'meanLoss': 9.842458,
'computeTime': '2023-09-19T19:29:21.371286675Z'},
{'step': 8,
'epoch': 1,
'meanLoss': 5.9831877,
'computeTime': '2023-09-19T19:29:22.915277044Z'},
{'step': 9,
'epoch': 1,
'meanLoss': 8.936815,
'computeTime': '2023-09-19T19:29:24.666461680Z'},
{'step': 10,
'epoch': 1,
'meanLoss': 6.14651,
'computeTime': '2023-09-19T19:29:26.793310451Z'},
{'step': 11,
'epoch': 1,
'meanLoss': 4.853589,
'computeTime': '2023-09-19T19:29:28.328297535Z'},
{'step': 12,
'epoch': 1,
'meanLoss': 9.6831045,
'computeTime': '2023-09-19T19:29:29.501236840Z'},
{'step': 13,
'epoch': 1,
'meanLoss': 5.706586,
'computeTime': '2023-09-19T19:29:30.612807978Z'},
{'step': 14,
'epoch': 1,
'meanLoss': 3.276942,
'computeTime': '2023-09-19T19:29:31.928747103Z'},
{'step': 15,
'epoch': 2,
'meanLoss': 6.1736736,
'computeTime': '2023-09-19T19:29:33.588699180Z'},
{'step': 16,
'epoch': 2,
'meanLoss': 6.857398,
'computeTime': '2023-09-19T19:29:35.239083809Z'},
{'step': 17,
'epoch': 2,
'meanLoss': 5.098094,
'computeTime': '2023-09-19T19:29:37.000705047Z'},
{'step': 18,
'epoch': 2,
'meanLoss': 7.27724,
'computeTime': '2023-09-19T19:29:38.532313231Z'},
{'step': 19,
'epoch': 2,
'meanLoss': 7.6310735,
'computeTime': '2023-09-19T19:29:39.696034301Z'},
{'step': 20,
'epoch': 2,
'meanLoss': 8.152623,
'computeTime': '2023-09-19T19:29:40.803342042Z'},
{'step': 21,
'epoch': 2,
'meanLoss': 5.451577,
'computeTime': '2023-09-19T19:29:42.445788199Z'},
{'step': 22,
'epoch': 2,
'meanLoss': 3.7990716,
'computeTime': '2023-09-19T19:29:43.866737307Z'},
{'step': 23,
'epoch': 3,
'meanLoss': 6.120624,
'computeTime': '2023-09-19T19:29:45.599248553Z'}],
'hyperparameters': {'epochCount': 3,
'batchSize': 2,
'learningRate': 0.001} },
'temperature': 0.7,
'topP': 0.95,
'topK': 40}]}
สร้างโมเดลที่ปรับแต่งแล้ว
เช่นเดียวกับตัวอย่าง Curl คุณต้องส่งชุดข้อมูลผ่านช่อง training_data
operation = requests.post(
url = f'{base_url}/v1beta3/tunedModels',
headers=headers,
json= {
"display_name": "number generator",
"base_model": "models/text-bison-001",
"tuning_task": {
"hyperparameters": {
"batch_size": 4,
"learning_rate": 0.001,
"epoch_count":3,
},
"training_data": {
"examples": {
"examples": [
{
'text_input': '1',
'output': '2',
},{
'text_input': '3',
'output': '4',
},{
'text_input': '-3',
'output': '-2',
},{
'text_input': 'twenty two',
'output': 'twenty three',
},{
'text_input': 'two hundred',
'output': 'two hundred one',
},{
'text_input': 'ninety nine',
'output': 'one hundred',
},{
'text_input': '8',
'output': '9',
},{
'text_input': '-98',
'output': '-97',
},{
'text_input': '1,000',
'output': '1,001',
},{
'text_input': '10,100,000',
'output': '10,100,001',
},{
'text_input': 'thirteen',
'output': 'fourteen',
},{
'text_input': 'eighty',
'output': 'eighty one',
},{
'text_input': 'one',
'output': 'two',
},{
'text_input': 'three',
'output': 'four',
},{
'text_input': 'seven',
'output': 'eight',
}
]
}
}
}
}
)
operation
<Response [200]>
operation.json()
{'name': 'tunedModels/number-generator-ncqqnysl74dt/operations/qqlbwzfyzn0k',
'metadata': {'@type': 'type.googleapis.com/google.ai.generativelanguage.v1beta3.CreateTunedModelMetadata',
'totalSteps': 12,
'tunedModel': 'tunedModels/number-generator-ncqqnysl74dt'} }
ตั้งค่าตัวแปรที่มีชื่อของรูปแบบที่ปรับแต่งเพื่อใช้กับคําเรียกที่เหลือ
name=operation.json()["metadata"]["tunedModel"]
name
'tunedModels/number-generator-ncqqnysl74dt'
รับสถานะโมเดลที่ปรับแต่งแล้ว
คุณสามารถตรวจสอบความคืบหน้าของงานการปรับแต่งได้โดยดูที่ช่องสถานะ CREATING หมายความว่างานการปรับแต่งยังอยู่ระหว่างดำเนินการ และ ACTIVE หมายความว่าการฝึกอบรมเสร็จสมบูรณ์แล้วและโมเดลที่ปรับแต่งพร้อมใช้งาน
tuned_model = requests.get(
url = f'{base_url}/v1beta3/{name}',
headers=headers,
)
tuned_model.json()
{'name': 'tunedModels/number-generator-ncqqnysl74dt',
'baseModel': 'models/text-bison-001',
'displayName': 'number generator',
'state': 'CREATING',
'createTime': '2023-09-19T19:56:25.999303Z',
'updateTime': '2023-09-19T19:56:25.999303Z',
'tuningTask': {'startTime': '2023-09-19T19:56:26.297862545Z',
'hyperparameters': {'epochCount': 3, 'batchSize': 4, 'learningRate': 0.001} },
'temperature': 0.7,
'topP': 0.95,
'topK': 40}
โค้ดด้านล่างจะตรวจสอบช่องสถานะทุกๆ 5 วินาทีจนกว่าจะไม่อยู่ในสถานะ CREATING อีกต่อไป
import time
import pprint
op_json = operation.json()
response = op_json.get('response')
error = op_json.get('error')
while response is None and error is None:
time.sleep(31)
operation = requests.get(
url = f'{base_url}/v1/{op_json["name"]}',
headers=headers,
)
op_json = operation.json()
response = op_json.get('response')
error = op_json.get('error')
percent = op_json['metadata'].get('completedPercent')
if percent is not None:
print(f"{percent:.2f}% - {op_json['metadata']['snapshots'][-1]}")
print()
if error is not None:
raise Exception(error)
21.28% - {'step': 40, 'epoch': 10, 'meanLoss': 2.4871845, 'computeTime': '2023-09-20T00:23:55.255785843Z'}
21.28% - {'step': 40, 'epoch': 10, 'meanLoss': 2.4871845, 'computeTime': '2023-09-20T00:23:55.255785843Z'}
43.09% - {'step': 81, 'epoch': 21, 'meanLoss': 0.032220088, 'computeTime': '2023-09-20T00:24:56.302837803Z'}
43.09% - {'step': 81, 'epoch': 21, 'meanLoss': 0.032220088, 'computeTime': '2023-09-20T00:24:56.302837803Z'}
63.83% - {'step': 120, 'epoch': 32, 'meanLoss': 0.0030430648, 'computeTime': '2023-09-20T00:25:57.228615435Z'}
63.83% - {'step': 120, 'epoch': 32, 'meanLoss': 0.0030430648, 'computeTime': '2023-09-20T00:25:57.228615435Z'}
85.11% - {'step': 160, 'epoch': 42, 'meanLoss': -1.1145603e-06, 'computeTime': '2023-09-20T00:26:57.819011896Z'}
100.00% - {'step': 188, 'epoch': 50, 'meanLoss': 0.00040101097, 'computeTime': '2023-09-20T00:27:40.024132813Z'}
เรียกใช้การอนุมาน
เมื่องานการปรับแต่งเสร็จสิ้นแล้ว คุณจะใช้โมเดลดังกล่าวเพื่อสร้างข้อความได้เช่นเดียวกับการใช้โมเดลข้อความพื้นฐาน
import time
m = requests.post(
url = f'{base_url}/v1beta3/{name}:generateText',
headers=headers,
json= {
"prompt": {
"text": "9"
},
})
import pprint
print(m.json()['candidates'][0]['output'])
9
เอาต์พุตจากโมเดลอาจถูกต้องหรือไม่ถูกต้องก็ได้ หากโมเดลที่ปรับแต่งแล้วมีประสิทธิภาพไม่เป็นไปตามมาตรฐานที่กำหนด คุณอาจลองเพิ่มตัวอย่างคุณภาพสูงอีก ปรับแต่งไฮเปอร์พารามิเตอร์ หรือเพิ่มคำนำหน้าในตัวอย่าง
ขั้นตอนถัดไป
- ดูการเริ่มต้นปรับแต่งอย่างรวดเร็วด้วย Python เพื่อเริ่มการเขียนโค้ดกับบริการปรับแต่ง
- ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีปรับแต่งโมเดลให้เหมาะกับกรณีการใช้งานของคุณได้ที่คําแนะนําในการปรับแต่ง
ลองใช้ Colab Notebook
ดูสมุดบันทึกใน GitHub
ดาวน์โหลดสมุดบันทึก