mistral-finetune
เป็นโค้ดเบสน้ำหนักเบาที่ช่วยให้ปรับแต่งโมเดลของ Mistral ได้อย่างมีประสิทธิภาพและมีประสิทธิภาพ โดยอิงจาก LoRA ซึ่งเป็นกระบวนทัศน์การฝึกอบรมที่ตุ้มน้ำหนักส่วนใหญ่ถูกแช่แข็ง และมีเพียง 1-2% ของตุ้มน้ำหนักเพิ่มเติมในรูปแบบของการก่อกวนเมทริกซ์ระดับต่ำที่ได้รับการฝึก
เพื่อประสิทธิภาพสูงสุด ขอแนะนำให้ใช้ GPU A100 หรือ H100 Codebase ได้รับการปรับให้เหมาะสมสำหรับการตั้งค่าการฝึกแบบหลาย GPU-โหนดเดียว แต่สำหรับรุ่นที่เล็กกว่า เช่น 7B GPU ตัวเดียวก็เพียงพอแล้ว
บันทึก
เป้าหมายของพื้นที่เก็บข้อมูลนี้คือการจัดหาจุดเริ่มต้นที่เรียบง่ายและมีคำแนะนำในการปรับแต่งโมเดล Mistral ด้วยเหตุนี้ จึงค่อนข้างให้ความคิดเห็น (โดยเฉพาะอย่างยิ่งเกี่ยวกับการจัดรูปแบบข้อมูล) และไม่ได้มุ่งเป้าไปที่การทำให้สถาปัตยกรรมโมเดลหรือฮาร์ดแวร์หลายประเภทละเอียดถี่ถ้วน สำหรับแนวทางทั่วไปเพิ่มเติม คุณสามารถดูโปรเจ็กต์ดีๆ อื่นๆ เช่น Torchtune ได้
13.08.2024 : Mistral Large v2 เข้ากันได้กับ mistral-finetune
แล้ว!
ขอแนะนำให้ใช้อัตราการเรียนรู้ที่ต่ำกว่าเมื่อเทียบกับรุ่นอื่นๆ เช่น lr=1e-6 น่าจะทำงานได้ดีในกรณีส่วนใหญ่
การปรับแต่ง Mistral-Large v2 อย่างละเอียดต้องใช้หน่วยความจำเพิ่มขึ้นอย่างมากเนื่องจากขนาดโมเดลที่ใหญ่ขึ้น สำหรับตอนนี้ให้ตั้งค่า seq_len
เป็น <= 8192
ดาวน์โหลดคำสั่ง 123B ที่นี่ และตั้งค่า model_id_or_path
เป็น dir จุดตรวจสอบที่ดาวน์โหลด
19.07.2024 : Mistral Nemo เข้ากันได้กับ mistral-finetune
แล้ว!
ขอแนะนำให้ใช้ไฮเปอร์พารามิเตอร์เดียวกันกับ 7B v3
การปรับแต่ง Mistral-Nemo อย่างละเอียดนั้นต้องการหน่วยความจำมากขึ้นในปัจจุบันเนื่องจากขนาดคำศัพท์ที่ใหญ่ขึ้น ซึ่งทำให้ความต้องการหน่วยความจำสูงสุดของการสูญเสีย CE (เร็วๆ นี้เราจะเพิ่มการสูญเสีย CE ที่ปรับปรุงแล้วที่นี่) สำหรับตอนนี้ให้ตั้งค่า seq_len
เป็น <= 16384
เรียกใช้ pip install --upgrade mistral-common
เพื่อให้มีเวอร์ชันที่รองรับ Tekkenizer ( >=1.3.1
)
ดาวน์โหลด 12B Base หรือ Instruct ที่นี่ และตั้งค่า model_id_or_path
เป็น dir จุดตรวจสอบที่ดาวน์โหลด
หากต้องการเริ่มต้นการปรับแต่ง Mistral LoRA อย่างละเอียด ให้ทำตามขั้นตอนเหล่านี้:
โคลนที่เก็บนี้:
cd $HOME && git clone https://github.com/mistralai/mistral-finetune.git
ติดตั้งการขึ้นต่อกันที่จำเป็นทั้งหมด:
cd mistral-finetune pip install -r requirements.txt
เราขอแนะนำให้ปรับแต่งโมเดล Mistral อย่างเป็นทางการรุ่นใดรุ่นหนึ่งอย่างละเอียด ซึ่งคุณสามารถดาวน์โหลดได้ที่นี่:
แบบอย่าง | ลิงค์ | เช็คซัม |
---|---|---|
7B ฐาน V3 | ฐาน 7B | 0663b293810d7571dad25dae2f2a5806 |
คำสั่ง 7B เวอร์ชัน 3 | คำสั่ง 7B เวอร์ชัน 3 | 80b71fcb6416085bcb4efad86dfb4d52 |
ฐาน 8x7B V1 | ฐาน 8x7B | (ลิงค์ HF) |
8x7B สั่งสอน V1 | คำสั่ง 8x7B | 8e2d3930145dc43d3084396f49d38a3f |
8x22 คำสั่ง V3 | คำสั่ง 8x22 | 471a02a6902706a2f1e44a693813855b |
8x22B ฐาน V3 | ฐาน 8x22B | a2fa75117174f87d1197e3a4eb50371a |
คำสั่ง 12B | 12B สั่งสอน (มิสทรัล-นีโม) | 296fbdf911cb88e6f0be74cd04827fe7 |
ฐาน 12B | 12 ฐาน (มิสทรัล-นีโม) | c5d079ac4b55fc1ae35f51f0a3c0eb83 |
มิสทรัล ขนาดใหญ่ 2 | 123B คำสั่ง (ใหญ่ v2) | fc602155f9e39151fba81fcaab2fa7c4 |
ประกาศสำคัญ : สำหรับ 8x7B Base V1 และ 8x7B Instruct V1 จำเป็นต้องใช้โทเค็น v3 ของเราและขยายขนาดคำศัพท์เป็น 32768 ก่อนที่จะทำการปรับแต่งอย่างละเอียด สำหรับคำแนะนำโดยละเอียดเกี่ยวกับกระบวนการนี้ โปรดดูส่วน "ส่วนขยายโมเดล"
เช่น หากต้องการดาวน์โหลดโมเดลฐาน 7B คุณสามารถรันคำสั่งต่อไปนี้:
mkdir -p ~/${HOME}/mistral_modelscd ${HOME} && wget https://models.mistralcdn.com/mistral-7b-v0-3/mistral-7B-v0.3.tar tar -xf มิสทรัล-7B-v0.3.tar -C มิสทรัล_โมเดล
ตรวจสอบให้แน่ใจว่าได้แก้ไขสคริปต์การฝึกอบรมของคุณและเพิ่มเส้นทางไปยังโฟลเดอร์ที่ดาวน์โหลดเป็น model_id_or_path
เช่น แก้ไข example/7B.yaml เพื่อรวมพาธสัมบูรณ์ไปยัง $HOME/mistral_models/7B
:
model_id_or_path: "/Users/johndoe/mistral_models/7B"
เพื่อให้มั่นใจว่าการฝึกอบรมมีประสิทธิผล mistral-finetune
มีข้อกำหนดที่เข้มงวดเกี่ยวกับวิธีการจัดรูปแบบข้อมูลการฝึกอบรม
ไฟล์ข้อมูลทั้งหมดจะต้องจัดเก็บไว้ในไฟล์รูปแบบ jsonl
คุณสามารถสร้างไฟล์ข้อมูลได้สองประเภท:
ข้อมูลการฝึกล่วงหน้าสอดคล้องกับข้อมูลข้อความธรรมดาที่จัดเก็บไว้ในคีย์ "text"
เช่น:
{"text": "ข้อความที่อยู่ในเอกสาร n°1"} {"text": "ข้อความที่อยู่ในเอกสาร n°2"}
ปัจจุบันมีการสนับสนุนข้อมูลต่อไปนี้สองประเภทที่แตกต่างกัน:
คำแนะนำ : ข้อมูลการสนทนาที่เก็บไว้ในคีย์ "messages"
ในรูปแบบของรายการ แต่ละรายการเป็นพจนานุกรมที่มีคีย์ "content"
และ "role"
"role"
คือสตริงที่เป็นหนึ่งใน "ผู้ใช้", "ผู้ช่วย" หรือ "ระบบ" การสูญเสียจะถูกคำนวณก็ต่อเมื่อ "บทบาท" == "ผู้ช่วย" เช่น:
{ "ข้อความ": [ { "role": "user", "content": "การโต้ตอบของผู้ใช้ n°1 มีอยู่ในเอกสาร n°1" - { "role": "ผู้ช่วย", "เนื้อหา": "การโต้ตอบของบอท n°1 มีอยู่ในเอกสาร n°1" - { "role": "user", "content": "การโต้ตอบของผู้ใช้ n°2 มีอยู่ในเอกสาร n°1" - { "role": "ผู้ช่วย", "เนื้อหา": "การโต้ตอบของบอท n°2 มีอยู่ในเอกสาร n°1" - - - { "ข้อความ": [ { "role": "user", "content": "การโต้ตอบของผู้ใช้ n°1 มีอยู่ในเอกสาร n°2" - { "role": "ผู้ช่วย", "เนื้อหา": "การโต้ตอบของบอท n°1 มีอยู่ในเอกสาร n°2" - { "role": "user", "content": "การโต้ตอบของผู้ใช้ n°2 มีอยู่ในเอกสาร n°2" - { "role": "ผู้ช่วย", "เนื้อหา": "การโต้ตอบของบอท n°2 มีอยู่ในเอกสาร n°2", "น้ำหนัก": 0, # อย่าฝึกใน n°2 - { "role": "user", "content": "การโต้ตอบของผู้ใช้ n°3 มีอยู่ในเอกสาร n°2" - { "role": "ผู้ช่วย", "เนื้อหา": "การโต้ตอบของบอท n°3 มีอยู่ในเอกสาร n°2" - - -
การเรียกใช้ฟังก์ชัน : ข้อมูลการสนทนาที่เก็บไว้ในคีย์ "messages"
ในรูปแบบของรายการ แต่ละรายการเป็นพจนานุกรมที่มีคีย์ "role"
และ "content"
หรือ "tool_calls"
"role"
คือสตริงที่เป็นหนึ่งใน "ผู้ใช้", "ผู้ช่วย", "ระบบ" หรือ "เครื่องมือ" การสูญเสียจะถูกคำนวณก็ต่อเมื่อ "บทบาท" == "ผู้ช่วย"
หมายเหตุ : ในฟังก์ชันที่เรียก "id"
ของ "tool_calls"
และ "tool_call_id"
เป็นสตริงที่สร้างขึ้นแบบสุ่มซึ่งมีขนาด 9 ตัวอักษรพอดี เราขอแนะนำให้สร้างสิ่งนี้โดยอัตโนมัติในสคริปต์การเตรียมข้อมูลดังที่ทำที่นี่
เช่น:
{ "ข้อความ": [ { "role": "system", "content": "คุณเป็นผู้ช่วยที่เป็นประโยชน์ซึ่งสามารถเข้าถึงฟังก์ชันต่อไปนี้เพื่อช่วยเหลือผู้ใช้ คุณสามารถใช้ฟังก์ชันเหล่านี้ได้หากจำเป็น" - { "role": "user", "content": "คุณช่วยฉันสร้างแอนนาแกรมของคำว่า "listen" ได้ไหม?" - { "บทบาท": "ผู้ช่วย", "tool_calls": [ { "id": "TX92Jm8Zi", "type": "function", "function": { "name": "generate_anagram", "arguments": "{"word": "listen"}" - - - - { "role": "tool", "content": "{"anagram": "silent"}", "tool_call_id": "TX92Jm8Zi" - { "role": "assistant", "content": "แอนนาแกรมของคำว่า "listen" คือ "silent"" - { "role": "user", "content": "น่าทึ่งมาก! คุณสามารถสร้างแอนนาแกรมสำหรับคำว่า "race" ได้ไหม? - { "บทบาท": "ผู้ช่วย", "tool_calls": [ { "id": "3XhQnxLsT", "type": "function", "function": { "name": "generate_anagram", "arguments": "{"word": "race"}" - - - - ], "เครื่องมือ": [ { "type": "function", "function": { "name": "generate_anagram", "description": "สร้างแอนนาแกรมของคำที่กำหนด", "พารามิเตอร์": { "type": "object", " properties": { "word": { "type": "string", "description": "คำที่จะสร้างแอนนาแกรมของ" - }, "จำเป็น": [ "คำ" - - - - - -
ก่อนเริ่มการฝึกวิ่ง คุณควรตรวจสอบว่าชุดข้อมูลของคุณมีรูปแบบที่ถูกต้องและรับเวลาการฝึกโดยประมาณ คุณสามารถทำได้โดยใช้สคริปต์ ./utils/validate_data
โปรดทราบว่าขั้นตอนนี้มีความสำคัญเพื่อให้แน่ใจว่าข้อมูลมีรูปแบบที่ถูกต้อง
มาดูตัวอย่างง่ายๆ ในการฝึกโมเดลตามคำสั่งดังต่อไปนี้:
โหลด Ultachat_200k จำนวนหนึ่ง
สร้างโฟลเดอร์ข้อมูลและนำทางไปยังโฟลเดอร์
cd $HOME && mkdir -p data && cd $HOME/data.cd
โหลดข้อมูลลงใน Pandas Dataframe
หมายเหตุ : ตรวจสอบให้แน่ใจว่าได้ติดตั้ง pandas และ pyarrow แล้ว ( pip install pandas pyarrow
)
นำเข้าแพนด้าเป็น pddf = pd.read_parquet('https://huggingface.co/datasets/HuggingFaceH4/ultrachat_200k/resolve/main/data/test_gen-00000-of-00001-3d4cd8309148a71f.parquet')
แยกเป็นรถไฟและประเมินผล
df_train=df.sample(frac=0.95,random_state=200)df_eval=df.drop(df_train.index)
บันทึกข้อมูลลงใน jsonl
df_train.to_json("ultrachat_chunk_train.jsonl", orient="records", lines=True)df_eval.to_json("ultrachat_chunk_eval.jsonl", orient="บันทึก", lines=True)
แก้ไข yaml การฝึกอบรมของคุณเพื่อรวมชุดข้อมูล ultrachat และตรวจสอบ yaml
แก้ไข example/7B.yaml เพื่อรวมเส้นทางสัมบูรณ์ไปยัง $HOME/data/ultrachat_chunk_train.jsonl
รวมถึงชุดข้อมูลที่ผสมน้ำหนักสำหรับการฝึกอบรมและ $HOME/data/ultrachat_chunk_eval.jsonl
สำหรับ eval เช่น
data: instruct_data: "/Users/johndoe/data/ultrachat_chunk_train.jsonl" eval_instruct_data: "/Users/johndoe/data/ultrachat_chunk_eval.jsonl"
ตอนนี้คุณสามารถยืนยัน yaml การฝึกอบรมของคุณเพื่อให้แน่ใจว่าข้อมูลมีรูปแบบที่ถูกต้องและเพื่อรับเวลาการฝึกอบรมโดยประมาณ
cd $HOME/mistral-finetune python -m utils.validate_data --train_yaml example/7B.yaml
เมื่อดำเนินการเสร็จสิ้น คุณจะเห็นรายงานข้อผิดพลาดพร้อมข้อผิดพลาดหลายประการต่อไปนี้:
The data in line 1412 of dataset /Users/johndoe/data/ultrachat_chunk_eval.jsonl is incorrectly formatted. Expected last role to be one of: [assistant] but got user The data in line 1413 of dataset /Users/johndoe/data/ultrachat_chunk_eval.jsonl is incorrectly formatted. Expected last role to be one of: [assistant] but got user The data in line 1414 of dataset /Users/johndoe/data/ultrachat_chunk_eval.jsonl is incorrectly formatted. Expected last role to be one of: [assistant] but got user The data in line 1415 of dataset /Users/johndoe/data/ultrachat_chunk_eval.jsonl is incorrectly formatted. Expected last role to be one of: [assistant] but got user
การสนทนาจำนวนมากดูเหมือนจะจบลงด้วยบทบาท 'ผู้ใช้' ซึ่งไม่จำเป็น เนื่องจากเราฝึกเฉพาะข้อความ 'ผู้ช่วย' เท่านั้น และด้วยเหตุนี้จึงประมวลผลข้อมูลโดยไม่จำเป็น
คุณสามารถใช้ ./utils/reformat_data.py เพื่อแก้ไขข้อมูล:
cd $HOME/mistral-finetune python -m utils.reformat_data $HOME/data/ultrachat_chunk_train.jsonl python -m utils.reformat_data $HOME/data/ultrachat_chunk_eval.jsonl
คุณจะเห็นว่าตัวอย่างบางส่วนจะถูกข้ามไป
อาจเปลี่ยนจำนวนขั้นตอนการฝึก
เมื่อแก้ไขชุดข้อมูลแล้ว ให้เรียกใช้สคริปต์อีกครั้ง
cd $HOME/mistral-finetune python -m utils.validate_data --train_yaml example/7B.yaml
คุณควรได้รับข้อมูลสรุปของการป้อนข้อมูลและพารามิเตอร์การฝึกอบรม:
Train States -------------------- { "expected": { "eta": "00:52:44", "data_tokens": 25169147, "train_tokens": 131072000, "epochs": "5.21", "max_steps": 500, "data_tokens_per_dataset": { "/Users/johndoe/data/ultrachat_chunk_train.jsonl": "25169147.0" }, "train_tokens_per_dataset": { "/Users/johndoe/data/ultrachat_chunk_train.jsonl": "131072000.0" }, "epochs_per_dataset": { "/Users/johndoe/data/ultrachat_chunk_train.jsonl": "5.2" } }, }
การตั้งค่า max_steps
เป็น 500 จะทำให้มีการวนซ้ำชุดข้อมูลประมาณ 5 ครั้งซึ่งถือว่าสมเหตุสมผล แต่อาจมากเกินไปเล็กน้อย การตั้งค่าที่แนะนำแสดงอยู่ด้านล่าง ซึ่งจะใช้เวลาเพียง 30 นาทีบนคลัสเตอร์ 8xH100
ต่อไปเรามาดูกรณีการใช้งานขั้นสูงเพิ่มเติมเพื่อปรับแต่งโมเดลในการเรียกใช้ฟังก์ชันอย่างละเอียด การเรียกใช้ฟังก์ชันต้องการให้ข้อมูลอยู่ในรูปแบบตามที่อธิบายไว้ข้างต้น เรามาดูตัวอย่างกัน
โหลดชุดข้อมูลการเรียกใช้ฟังก์ชัน Glaive เวอร์ชันรูปแบบแชท
สร้างโฟลเดอร์ข้อมูลและนำทางไปยังโฟลเดอร์
cd $HOME && mkdir -p data && cd $HOME/data.cd
โหลดข้อมูลลงใน Pandas Dataframe
หมายเหตุ : ตรวจสอบให้แน่ใจว่าได้ติดตั้ง pandas และ pyarrow แล้ว ( pip install pandas pyarrow
)
นำเข้าแพนด้าเป็น pddf = pd.read_parquet('https://huggingface.co/datasets/Locutusque/function-calling-chatml/resolve/main/data/train-00000-of-00001-f0b56c6983b4a78f.parquet')
แยกเป็นรถไฟและประเมินผล
df_train=df.sample(frac=0.95,random_state=200)df_eval=df.drop(df_train.index)
บันทึกข้อมูลลงใน jsonl
df_train.to_json("glaive_train.jsonl", orient="records", lines=True)df_eval.to_json("glaive_eval.jsonl", orient="บันทึก", lines=True)
จัดรูปแบบชุดข้อมูลใหม่
ดังที่เห็นได้ว่าชุดข้อมูลไม่เป็นไปตามรูปแบบการเรียกใช้ฟังก์ชันที่ต้องการ ดังนั้นจึงจำเป็นต้องฟอร์แมตใหม่ เหนือสิ่งอื่นใด "from"
ควรเปลี่ยนชื่อเป็น "user"
และควรลบอักขระ "n"
ที่ไม่จำเป็นออก สำหรับชุดข้อมูลนี้คุณสามารถใช้ ./utils/reformat_data_glaive.py
:
cd $HOME/mistral-finetune python -m utils.reformat_data_glaive $HOME/data/glaive_train.jsonl python -m utils.reformat_data_glaive $HOME/data/glaive_eval.jsonl
การรันคำสั่งนี้จะช่วยให้แน่ใจว่าตัวอย่างส่วนใหญ่อยู่ในรูปแบบที่ถูกต้อง
หมายเหตุ : เป็นไปไม่ได้ที่จะเขียนสคริปต์ฟอร์แมตใหม่ที่ใช้ได้กับชุดข้อมูลทุกประเภท หากคุณมีชุดข้อมูลที่ยังไม่เป็นไปตามรูปแบบที่กำหนดข้างต้น คุณอาจต้องสร้างสคริปต์การจัดรูปแบบใหม่ด้วยตัวเอง (mistral-chat หรือ chat-gpt เป็นเพื่อนที่ดีที่สุดของคุณที่นี่!)
ตรวจสอบชุดข้อมูล
ตอนนี้คุณสามารถตรวจสอบชุดข้อมูลได้โดยการตั้งค่า data.instruct_data
และ data.eval_instruct_data
เป็น $HOME/data/glaive_train.jsonl
และ $HOME/data/glaive_eval.jsonl
ใน example/7B.yaml
ตามลำดับ
ชุดข้อมูลที่จัดรูปแบบใหม่ยังคงมีข้อผิดพลาดบางอย่างซึ่งสามารถลบออกได้ด้วย --create_corrected
สำหรับสิ่งนี้ ตรวจสอบให้แน่ใจว่าได้เพิ่ม --create_corrected
ดังนี้:
cd $HOME/mistral-finetune python -m utils.validate_data --train_yaml example/7B.yaml --create_corrected
การรันคำสั่งนี้จะแสดงข้อผิดพลาดสองสามรายการและบันทึกชุดข้อมูลใหม่สองชุด $HOME/data/glaive_train.jsonl.corrected
และ $HOME/data/glaive_eval.jsonl.corrected
ตรวจสอบให้แน่ใจว่าใช้ชุดข้อมูลทั้งสองนี้ใน example/7B.yaml
แล้วรันคำสั่งอีกครั้ง ตอนนี้ชุดข้อมูลควรได้รับการจัดรูปแบบอย่างถูกต้อง!
หลังจากทำตามส่วนการตรวจสอบชุดข้อมูลแล้ว เราก็สามารถเริ่มการฝึกอบรมได้แล้ว เพื่อการฝึกที่รวดเร็วยิ่งขึ้น เราขอแนะนำให้ตั้งค่า max_steps ไว้ที่ 300 เท่านั้น ตรวจสอบให้แน่ใจว่าได้กำหนด run_dir
ให้กับโฟลเดอร์การทดลองของคุณ และเลือกตั้งค่า wandb_project
เป็นโปรเจ็กต์ Weights & Biases สำหรับการบันทึก เช่น :
max_steps: 300 run_dir: "/Users/johndoe/ultra_chat_test" wandb.project: ultra_chat
คุณยังสามารถตั้ง wandb
ได้อีกด้วย
บันทึกการกำหนดค่าการฝึกและเริ่มการฝึก! ตรวจสอบให้แน่ใจว่าได้ตั้งค่า --nproc-per-node
เป็นจำนวน GPU ที่มีอยู่
cd $HOME/mistral-finetune torchrun --nproc-per-node 8 --master_port $RANDOM -m train example/7B.yaml
การฝึกสนทนาแบบพิเศษควรใช้เวลาประมาณ 30 นาทีบนโหนด 8xH100 และน้ำหนักที่ได้ควรให้คะแนน MT Bench ประมาณ 6.3
การฝึกอบรมเกี่ยวกับ Glaive ควรใช้เวลาประมาณ 1 ชั่วโมงบนโหนด 8xH100 และน้ำหนักที่ได้ควรทำงานได้ดีสำหรับการเรียกใช้ฟังก์ชัน
ตัวอย่าง mistral-finetune/examples/7B
กำหนดพารามิเตอร์ที่เหมาะสมสำหรับอัตราการเรียนรู้ การลดลงของน้ำหนัก ฯลฯ... แต่ขอแนะนำให้คุณปรับแต่งการตั้งค่าเหล่านี้สำหรับกรณีการใช้งานของคุณ
โดยทั่วไป การกำหนดค่าการฝึกควรกรอกพารามิเตอร์ต่อไปนี้:
model_id_or_path
กำหนดโมเดลเพื่อเริ่มการฝึก นี่อาจเป็นเส้นทางไปยังโมเดลที่ได้รับการฝึกอบรมล่วงหน้าหรือไดเร็กทอรีโมเดลในเครื่อง
run_dir
กำหนดไดเร็กทอรีที่เก็บจุดตรวจสอบและเมตริกการฝึกอบรม
seq_len
กำหนดความยาวของลำดับสำหรับการฝึก นี่คือความยาวสูงสุดของลำดับอินพุตที่โมเดลจะประมวลผล ตัวอย่างจะถูกบรรจุเพื่อให้มีความยาวถึง seq_len
เพื่อประสิทธิภาพการฝึกสูงสุด
batch_size
กำหนดจำนวนตัวอย่างการฝึกที่ใช้ต่อ GPU หมายเหตุ : ประสิทธิภาพโดยรวมของแบตช์_ขนาด (เป็นโทเค็น) ของ GPU ทั้งหมดเท่ากับ num_gpus
x batch_size
x seq_len
max_steps
กำหนดจำนวนขั้นตอนการฝึกสูงสุด นี่คือจำนวนการวนซ้ำทั้งหมดที่กระบวนการฝึกอบรมจะดำเนินการ สามารถปรับเปลี่ยนได้ตามความต้องการเฉพาะของสถานการณ์การฝึกอบรมของคุณ จำนวนโทเค็นทั้งหมดที่เห็นระหว่างการฝึกคือ max_steps
x num_gpus
batch_size
x seq_len
optim.lr
กำหนดอัตราการเรียนรู้ นี่คืออัตราการเรียนรู้เริ่มต้นสำหรับเครื่องมือเพิ่มประสิทธิภาพ
optim.weight_decay
กำหนดการสลายตัวของน้ำหนัก การลดน้ำหนักเป็นเทคนิคการทำให้เป็นมาตรฐานซึ่งใช้เพื่อป้องกันการออกกำลังกายมากเกินไปโดยการลงโทษน้ำหนักที่มาก เราแนะนำให้ปล่อยไว้ที่ 0.1
optim.pct_start
กำหนดเปอร์เซ็นต์ของขั้นตอนการฝึกทั้งหมดที่ใช้สำหรับระยะวอร์มอัพอัตราการเรียนรู้ก่อนที่จะเริ่มลดลง มันสอดคล้องกับ pct_start ของ OneCycleLR ของ PyTorch
lora.rank
กำหนดขนาดของอะแดปเตอร์ LoRA (Low-Rank Adaptation) เราขอแนะนำ 64 หรือน้อยกว่า ซึ่งจะปรับอันดับของการสลายตัวระดับต่ำที่ใช้ใน LoRA
seed
กำหนดเมล็ดสุ่มสำหรับการเริ่มต้นและการสับเปลี่ยน/สุ่มตัวอย่างข้อมูล การตั้งค่าเริ่มต้นช่วยให้มั่นใจถึงความสามารถในการทำซ้ำของผลลัพธ์
log_freq
กำหนดความถี่ในการบันทึก ซึ่งจะระบุความถี่ (เป็นขั้นตอน) ในการบันทึกเมตริกการฝึกอบรม
data.instruct_data
เป็นเส้นทางไปยังข้อมูลคำสั่งที่ใช้ในการฝึกอบรม ช่องนี้จะต้องกรอกแหล่งข้อมูลหนึ่งหรือหลายแหล่งในรูปแบบตามที่อธิบายไว้ข้างต้น แหล่งข้อมูลแต่ละแห่งควรเป็นเส้นทางไปยังไฟล์ jsonl หรือเส้นทางไปยังไดเร็กทอรีที่มีไฟล์ jsonl ตามด้วยการถ่วงน้ำหนักเพื่อกำหนดความสำคัญของชุดข้อมูลนี้:
เช่น data.instruct_data: "/path/to/data1.jsonl:5.,/path/to/data2.jsonl:1.,/path/to/dir_of_jsonls:1."
data.data
เป็นเส้นทางทางเลือกสำหรับข้อมูลการฝึกอบรมล่วงหน้าเพิ่มเติมในรูปแบบตามที่อธิบายไว้ข้างต้น โปรดทราบว่าช่องนี้สามารถเว้นว่างไว้ได้
data.eval_instruct_data
เป็นเส้นทางทางเลือกไปยังข้อมูลคำแนะนำการประเมินเพื่อดำเนินการตรวจสอบข้ามในทุกขั้นตอน eval_freq
ตัวชี้วัดการตรวจสอบข้ามจะแสดงเป็นการ loss
และ perplexity
eval_freq
กำหนดความถี่ (เป็นขั้นตอน) ในการประเมินโมเดล นี่เป็นการระบุช่วงเวลาที่โมเดลได้รับการประเมินในชุดการตรวจสอบความถูกต้อง
no_eval
คือแฟล็กสำหรับเปิดหรือปิดใช้งานการประเมินระดับกลาง การตั้งค่าเป็นเท็จจะทำให้มีการประเมินเป็นระยะระหว่างการฝึก
ckpt_freq
กำหนดความถี่ในการบันทึกจุดตรวจ นี่เป็นการระบุช่วงเวลาที่บันทึกสถานะของโมเดล
save_adapters
กำหนดว่าจะบันทึกเฉพาะจุดตรวจสอบ LoRA ที่ได้รับการฝึกอบรมแล้ว หรือ LoRA ที่ได้รับการฝึกอบรมควรรวมเข้ากับโมเดลพื้นฐานและบันทึกโดยตรงหรือไม่ หมายเหตุ : เมื่อตั้ง save_adapters=False
ตรวจสอบให้แน่ใจว่าคุณมีหน่วยความจำ CPU และ GPU เพียงพอที่จะบันทึกโมเดลเต็มในกระบวนการเดียว (โดยปกติจะเป็นไปได้สำหรับรุ่น 7B เท่านั้น)
wandb.key
ใช้เพื่อส่งคีย์ API Weights & Biases (wandb) ของคุณสำหรับการบันทึก สิ่งนี้ทำให้คุณสามารถบันทึกตัวชี้วัดการฝึกอบรมไปยังแดชบอร์ดไม้กายสิทธิ์
wandb.project
กำหนดชื่อโครงการ wandb นี่คือที่ที่การรันการฝึกจะถูกบันทึกในอินเทอร์เฟซของ Wandb
เมื่อโมเดลของคุณได้รับการฝึกฝนแล้ว คุณควรลองใช้โดยอนุมาน เราแนะนำให้ใช้การอนุมานแบบมิสทรัล
ตรวจสอบให้แน่ใจว่าได้ติดตั้ง mistral_inference
อย่างถูกต้อง:
pip install mistral_inference
สมมติว่า lora.safetensors
ของคุณถูกบันทึกไว้ภายใต้ $HOME/ultra_chat_test/checkpoints/checkpoint_000300/consolidated/lora.safetensors
คุณสามารถแชทกับโมเดลโดยใช้ mistral_inference
เช่น :
Mistral-chat /mnt/slow/runs/patrick/mistral-finetune/7B/ --max_tokens 256 --อุณหภูมิ 1.0 --instruct --lora_path $HOME/ultra_chat_test/checkpoints/checkpoint_000300/consolidated/lora.safetensors
เราได้เพิ่มการสนับสนุนที่ชัดเจนสำหรับน้ำหนักและอคติเพื่อช่วยคุณตรวจสอบและแสดงภาพการฝึกซ้อมของคุณ การผสานรวมนี้ทำให้คุณสามารถบันทึกการวัดต่างๆ และติดตามการทดสอบได้อย่างง่ายดาย
หากต้องการใช้ Weights and Biases กับ mistral-finetune
ให้ทำตามขั้นตอนเหล่านี้:
ติดตั้งตุ้มน้ำหนักและอคติ:
ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งไลบรารี wandb
แล้ว คุณสามารถติดตั้งได้โดยใช้ pip:
pip ติดตั้งไม้กายสิทธิ์
เมื่อการฝึกอบรมเริ่มต้น คุณสามารถติดตามความคืบหน้าแบบเรียลไทม์โดยไปที่แดชบอร์ดโครงการไม้กายสิทธิ์ของคุณ ตัวชี้วัดทั้งหมด รวมถึงการสูญเสียการฝึก การสูญเสียการประเมิน อัตราการเรียนรู้ ฯลฯ จะถูกบันทึกและแสดงเป็นภาพ
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีใช้ไม้กายสิทธิ์ โปรดดูเอกสารประกอบเรื่องน้ำหนักและอคติ
สิ่งสำคัญ : โปรดทราบว่าเราสามารถปรับแต่งโมเดลมิสทรัลที่เข้ากันได้กับโทเค็น v3 เท่านั้น ซึ่งระบุว่าโมเดลมีขนาดคำศัพท์ 32768 ไม่ใช่ 32000 อย่างไรก็ตาม เราสามารถขยายขนาดคำศัพท์รุ่นเก่า 32000 เพื่อให้มีขนาดคำศัพท์ได้อย่างง่ายดาย ของ 32768 โดยใช้:
python -m utils.extend_model_vocab --original_model_ckpt /folder/to/old/model --extended_model_ckpt /folder/to/extended/model
เมื่อส่วนขยายใช้งานได้ เราสามารถปรับแต่งโดยใช้จุดตรวจสอบโมเดลที่สร้างขึ้นใหม่ใน /folder/to/extended/model
แนวทางปฏิบัติที่ดีที่สุดในการปรับแต่ง MoE คืออะไร
เราเห็นความแปรปรวนของประสิทธิภาพในระดับที่สูงกว่าเมื่อทำการปรับแต่งโมเดล MoE อย่างละเอียด ไม่ใช่เรื่องแปลกที่จะพบว่าการปรับโมเดล MoE อย่างละเอียดด้วยเมล็ดที่แตกต่างกันสามารถนำไปสู่ความแปรปรวนในประสิทธิภาพที่สูงได้ เราไม่ได้สังเกตเห็นความแปรปรวนสูงเช่นนี้กับแบบจำลองที่มีความหนาแน่นสูง ดังนั้น เราขอแนะนำให้รันอินสแตนซ์หลายอินสแตนซ์ของกระบวนการปรับแต่งแบบละเอียดเดียวกันบนโมเดล MoE และเลือกโมเดลที่ทำงานได้ดีที่สุด
ฉันจะกำหนดจำนวนโทเค็นที่ใช้ระหว่างกระบวนการฝึกโมเดลได้อย่างไร
คุณสามารถใช้สคริปต์ต่อไปนี้เพื่อค้นหา: https://github.com/mistralai/mistral-finetune/blob/main/utils/validate_data.py สคริปต์นี้ยอมรับไฟล์การฝึก .yaml เป็นอินพุต และส่งคืนจำนวนโทเค็นที่โมเดลกำลังฝึกอยู่
ฉันควรทำอย่างไรหากพบข้อผิดพลาดหน่วยความจำไม่เพียงพอ CUDA
วิธีแก้ปัญหาหนึ่งที่เป็นไปได้คือลดขนาดแบตช์ต่อ GPU ขนาดแบตช์เท่ากับ seq_len
x batch_size
ลองตั้ง batch_size
เป็น 1 และลด seq_len
คุณสามารถกำหนด batch_size
และ seq_len
ในไฟล์ .yaml