เทคนิคการฝึกอบรมโครงข่ายประสาทเทียมขนาดใหญ่ PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่

เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่

โครงข่ายประสาทเทียมขนาดใหญ่เป็นหัวใจสำคัญของความก้าวหน้าใน AI ล่าสุด แต่การฝึกอบรมพวกเขาเป็นความท้าทายด้านวิศวกรรมและการวิจัยที่ยาก ซึ่งต้องมีการจัดกลุ่ม GPU เพื่อทำการคำนวณแบบซิงโครไนซ์เพียงครั้งเดียว เมื่อขนาดของคลัสเตอร์และโมเดลเติบโตขึ้น ผู้ปฏิบัติงานการเรียนรู้ด้วยเครื่องได้พัฒนาเทคนิคที่หลากหลายขึ้นเพื่อขนานกับการฝึกโมเดลบน GPU หลายตัว เมื่อมองแวบแรก การทำความเข้าใจเทคนิคการขนานเหล่านี้อาจดูยากเย็น แต่ด้วยการสันนิษฐานเพียงเล็กน้อยเกี่ยวกับโครงสร้างของการคำนวณ เทคนิคเหล่านี้จะชัดเจนขึ้นมาก ณ จุดนั้น คุณเพียงแค่ส่งผ่านบิตทึบแสงจาก A ไป B ราวกับเป็นเครือข่าย เปลี่ยนรถรับส่งไปรอบๆ แพ็กเก็ต

ข้อมูลคู่ขนาน

เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่

เส้นขนานของท่อ

เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่

เทนเซอร์ขนาน

เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่

ผู้เชี่ยวชาญ Parallelism

เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่

ข้อมูลคู่ขนาน

เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่

เส้นขนานของท่อ

เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่

เทนเซอร์ขนาน

เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่

ผู้เชี่ยวชาญ Parallelism

เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่

ภาพประกอบของกลยุทธ์การขนานที่หลากหลายในแบบจำลองสามชั้น แต่ละสีหมายถึงชั้นเดียวและเส้นประแยก GPU ที่ต่างกันออกไป

ไม่มีความเท่าเทียม

การฝึกอบรมโครงข่ายประสาทเทียมเป็นกระบวนการที่ทำซ้ำได้ ในการทำซ้ำทุกครั้ง เราจะส่งต่อผ่านแบบจำลองของ ชั้น เพื่อคำนวณผลลัพธ์สำหรับตัวอย่างการฝึกอบรมแต่ละรายการในชุดข้อมูล จากนั้นก็ผ่านไปอีกทางหนึ่ง ย้อนกลับ ผ่านชั้นต่างๆ เผยแพร่ว่าแต่ละพารามิเตอร์ส่งผลต่อผลลัพธ์สุดท้ายโดยการคำนวณ a . มากน้อยเพียงใด ลาด เกี่ยวกับแต่ละพารามิเตอร์ การไล่ระดับสีเฉลี่ยสำหรับชุดงาน พารามิเตอร์ และสถานะการปรับให้เหมาะสมต่อพารามิเตอร์บางส่วนจะถูกส่งไปยังอัลกอริธึมการปรับให้เหมาะสม เช่น อาดัมซึ่งคำนวณพารามิเตอร์ของการวนซ้ำครั้งถัดไป (ซึ่งควรมีประสิทธิภาพที่ดีขึ้นเล็กน้อยในข้อมูลของคุณ) และสถานะการปรับให้เหมาะสมต่อพารามิเตอร์ใหม่ เมื่อการฝึกอบรมซ้ำไปซ้ำมากับชุดข้อมูล แบบจำลองจะพัฒนาเพื่อสร้างผลลัพธ์ที่แม่นยำยิ่งขึ้น

เทคนิคการขนานแบบต่างๆ แบ่งกระบวนการฝึกอบรมนี้ในมิติต่างๆ ซึ่งรวมถึง:

  • ความเท่าเทียมกันของข้อมูล—เรียกใช้ชุดย่อยต่างๆ ของแบทช์บน GPU ที่ต่างกัน
  • ไปป์ไลน์ขนาน—เรียกใช้เลเยอร์ต่างๆ ของโมเดลบน GPU ที่ต่างกัน
  • ความขนานของเทนเซอร์—แบ่งการคำนวณสำหรับการดำเนินการเดียว เช่น การคูณเมทริกซ์เพื่อแยกเป็น GPU
  • ส่วนผสมของผู้เชี่ยวชาญ—ประมวลผลแต่ละตัวอย่างเพียงเศษเสี้ยวของแต่ละเลเยอร์

(ในโพสต์นี้ เราจะถือว่าคุณกำลังใช้ GPU เพื่อฝึกโครงข่ายประสาทเทียมของคุณ แต่แนวคิดเดียวกันกับที่ใช้เครือข่ายอื่น ตัวเร่งโครงข่ายประสาทเทียม.)

ข้อมูลคู่ขนาน

ข้อมูลแบบขนาน การฝึกอบรมหมายถึงการคัดลอกพารามิเตอร์เดียวกันไปยัง GPU หลายตัว (มักเรียกว่า "คนงาน") และกำหนดตัวอย่างที่แตกต่างกันให้กับแต่ละรายการเพื่อประมวลผลพร้อมกัน ความเท่าเทียมกันของข้อมูลเพียงอย่างเดียวยังคงต้องการให้โมเดลของคุณพอดีกับหน่วยความจำของ GPU ตัวเดียว แต่ให้คุณใช้ประโยชน์จากการคำนวณของ GPU จำนวนมากโดยเสียค่าใช้จ่ายในการจัดเก็บสำเนาพารามิเตอร์ที่ซ้ำกันจำนวนมาก ดังที่กล่าวไปแล้ว มีกลยุทธ์ในการเพิ่ม RAM ที่มีประสิทธิภาพสำหรับ GPU ของคุณ เช่น การถ่ายโอนพารามิเตอร์ไปยังหน่วยความจำ CPU ชั่วคราวระหว่างการใช้งาน

เนื่องจากแต่ละข้อมูลผู้ปฏิบัติงานคู่ขนานอัปเดตสำเนาของพารามิเตอร์ พวกเขาจำเป็นต้องประสานงานเพื่อให้แน่ใจว่าผู้ปฏิบัติงานแต่ละคนยังคงมีพารามิเตอร์ที่คล้ายคลึงกัน แนวทางที่ง่ายที่สุดคือการแนะนำการสื่อสารแบบบล็อคระหว่างพนักงาน: (1) คำนวณระดับความลาดชันของผู้ปฏิบัติงานแต่ละคนอย่างอิสระ (2) เฉลี่ยการไล่ระดับข้ามคนงาน; และ (3) คำนวณพารามิเตอร์ใหม่เดียวกันของผู้ปฏิบัติงานแต่ละคนอย่างอิสระ ขั้นตอนที่ (2) เป็นค่าเฉลี่ยการบล็อกซึ่งต้องมีการถ่ายโอนข้อมูลค่อนข้างมาก (ตามสัดส่วนกับจำนวนพนักงานคูณด้วยขนาดของพารามิเตอร์ของคุณ) ซึ่งอาจส่งผลเสียต่อปริมาณการฝึกอบรมของคุณ มีหลากหลาย แผนการซิงโครไนซ์แบบอะซิงโครนัส เพื่อขจัดค่าใช้จ่ายนี้ แต่ส่งผลเสียต่อประสิทธิภาพการเรียนรู้ ในทางปฏิบัติ ผู้คนมักยึดติดกับวิธีการแบบซิงโครนัส

เส้นขนานของท่อ

กับ ท่อคู่ขนานline การฝึกอบรม เราแบ่งส่วนโมเดลตามลำดับระหว่าง GPU GPU แต่ละตัวมีพารามิเตอร์เพียงเศษเสี้ยว ดังนั้นรุ่นเดียวกันจึงใช้หน่วยความจำต่อ GPU ตามสัดส่วนที่น้อยลง

ตรงไปตรงมาในการแบ่งโมเดลขนาดใหญ่ออกเป็นชิ้นๆ ของเลเยอร์ที่ต่อเนื่องกัน อย่างไรก็ตาม มีการขึ้นต่อกันตามลำดับระหว่างอินพุตและเอาต์พุตของเลเยอร์ ดังนั้นการใช้งานแบบไร้เดียงสาอาจนำไปสู่เวลาว่างจำนวนมากในขณะที่ผู้ปฏิบัติงานรอเอาต์พุตจากเครื่องก่อนหน้าเพื่อใช้เป็นอินพุต ช่วงเวลารอเหล่านี้เรียกว่า "ฟองสบู่" ซึ่งสิ้นเปลืองการคำนวณที่เครื่องเดินเบาสามารถทำได้

เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่ ข้างหน้า
เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่ ย้อนกลับ
เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่ อัปเดตการไล่ระดับสี
เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่ Idle
เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่

ภาพประกอบของการตั้งค่าไปป์ไลน์แบบขนานที่ไร้เดียงสาซึ่งโมเดลถูกแบ่งออกเป็น 4 พาร์ติชั่นตามแนวตั้งในแนวตั้ง ผู้ปฏิบัติงาน 1 โฮสต์พารามิเตอร์โมเดลของเลเยอร์แรกของเครือข่าย (ใกล้กับอินพุตมากที่สุด) ในขณะที่ผู้ปฏิบัติงาน 4 โฮสต์เลเยอร์ 4 (ซึ่งใกล้กับเอาต์พุตมากที่สุด) “F”, “B” และ “U” หมายถึงการดำเนินการไปข้างหน้า ย้อนกลับ และอัปเดตตามลำดับ ตัวห้อยบ่งชี้ว่าการดำเนินการทำงานของผู้ปฏิบัติงานคนใด ข้อมูลถูกประมวลผลโดยผู้ปฏิบัติงานทีละคนเนื่องจากการพึ่งพาตามลำดับ ซึ่งนำไปสู่ ​​"ฟองสบู่" ขนาดใหญ่ของเวลาว่าง

เราสามารถนำแนวคิดจากความเท่าเทียมของข้อมูลมาใช้ใหม่เพื่อลดค่าใช้จ่ายของฟองสบู่ โดยให้พนักงานแต่ละคนประมวลผลชุดย่อยขององค์ประกอบข้อมูลในคราวเดียว ซึ่งช่วยให้เราสามารถซ้อนการคำนวณใหม่กับเวลารอได้อย่างชาญฉลาด แนวคิดหลักคือการแบ่งหนึ่งชุดออกเป็นหลายไมโครแบตช์ แต่ละไมโครแบตช์ควรจะเร็วกว่าตามสัดส่วนในการประมวลผล และผู้ปฏิบัติงานแต่ละคนเริ่มทำงานกับไมโครแบตช์ถัดไปทันทีที่พร้อมใช้งาน ดังนั้นจึงเป็นการเร่งการดำเนินการไปป์ไลน์ ด้วยไมโครแบตช์ที่เพียงพอ พนักงานสามารถใช้งานได้เกือบตลอดเวลาโดยมีฟองอากาศน้อยที่สุดที่จุดเริ่มต้นและจุดสิ้นสุดของขั้นตอน การไล่ระดับสีจะถูกเฉลี่ยในไมโครแบตช์ และการอัปเดตพารามิเตอร์จะเกิดขึ้นก็ต่อเมื่อไมโครแบตช์ทั้งหมดเสร็จสิ้น

จำนวนคนงานที่แบบจำลองถูกแบ่งออกโดยทั่วไปเรียกว่า ความลึกของท่อ.

ในระหว่างการส่งต่อ ผู้ปฏิบัติงานจำเป็นต้องส่งเอาต์พุต (เรียกว่าการเปิดใช้งาน) ของชั้นเลเยอร์ไปยังผู้ปฏิบัติงานคนถัดไปเท่านั้น ระหว่างการย้อนกลับ จะส่งเฉพาะการไล่ระดับของการเปิดใช้งานเหล่านั้นไปยังผู้ปฏิบัติงานคนก่อน มีพื้นที่การออกแบบขนาดใหญ่ในการกำหนดเวลาบัตรผ่านเหล่านี้และวิธีรวมการไล่ระดับสีในไมโครแบตช์ GPipe ให้แต่ละกระบวนการของผู้ปฏิบัติงานส่งต่อและย้อนกลับอย่างต่อเนื่อง จากนั้นจึงรวมการไล่ระดับสีจากไมโครแบตช์หลายชุดพร้อมกันในตอนท้าย ไปป์ดรีม แทนที่จะกำหนดเวลาให้พนักงานแต่ละคนดำเนินการส่งผ่านไปข้างหน้าและข้างหลังแทน

เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่ ข้างหน้า
เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่ ย้อนกลับ
เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่ บันทึก
เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่ Idle
GPipe

เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่

ไปป์ดรีม

เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่

การเปรียบเทียบรูปแบบการวางท่อของ GPipe และ PipeDream โดยใช้ไมโครแบตช์ 4 ตัวต่อแบทช์ ไมโครแบตช์ 1-8 สอดคล้องกับชุดข้อมูลสองชุดที่ต่อเนื่องกัน ในภาพ “(หมายเลข)” บ่งชี้ว่าไมโครแบตช์ตัวใดที่ดำเนินการและตัวห้อยจะทำเครื่องหมาย ID ผู้ปฏิบัติงาน โปรดทราบว่า PipeDream มีประสิทธิภาพมากขึ้นโดยทำการคำนวณบางอย่างด้วยพารามิเตอร์ที่เก่าแล้ว

เทนเซอร์ขนาน

ความเท่าเทียมของไปป์ไลน์แยกโมเดล "ในแนวตั้ง" ทีละชั้น นอกจากนี้ยังสามารถ "แบ่งแนวนอน" การดำเนินการบางอย่างภายในเลเยอร์ ซึ่งมักจะเรียกว่า เทนเซอร์ขนาน การฝึกอบรม. สำหรับโมเดลที่ทันสมัยมากมาย (เช่น the หม้อแปลงไฟฟ้า) คอขวดของการคำนวณกำลังคูณเมทริกซ์แบตช์การเปิดใช้งานกับเมทริกซ์น้ำหนักขนาดใหญ่ การคูณเมทริกซ์ สามารถคิดได้ว่าเป็นผลิตภัณฑ์ดอทระหว่างคู่ของแถวและคอลัมน์ เป็นไปได้ที่จะคำนวณผลิตภัณฑ์ dot อิสระบน GPU ต่างๆ หรือคำนวณส่วนต่างๆ ของผลิตภัณฑ์ dot แต่ละรายการบน GPU ที่ต่างกันและสรุปผลลัพธ์ ด้วยกลยุทธ์ใดวิธีหนึ่ง เราสามารถแบ่งเมทริกซ์น้ำหนักเป็น "ชาร์ด" ที่มีขนาดเท่ากัน โฮสต์ชาร์ดแต่ละรายการบน GPU ที่แตกต่างกัน และใช้ชาร์ดนั้นเพื่อคำนวณส่วนที่เกี่ยวข้องของผลิตภัณฑ์เมทริกซ์โดยรวมก่อนที่จะสื่อสารในภายหลังเพื่อรวมผลลัพธ์

ตัวอย่างหนึ่งคือ เมกะทรอน-LMซึ่งขนานกับการคูณเมทริกซ์ภายในเลเยอร์การเอาใจใส่ตนเองของ Transformer และ MLP PTD-ป ใช้เทนเซอร์ ข้อมูล และความเท่าเทียมกันของไปป์ไลน์ กำหนดการของไปป์ไลน์กำหนดเลเยอร์ที่ไม่ต่อเนื่องกันหลายชั้นให้กับแต่ละอุปกรณ์ ลดค่าใช้จ่ายของบับเบิ้ลที่ค่าใช้จ่ายในการสื่อสารในเครือข่ายมากขึ้น

บางครั้งอินพุตไปยังเครือข่ายสามารถขนานกันข้ามมิติด้วยการคำนวณแบบขนานในระดับสูงที่สัมพันธ์กับการสื่อสารข้าม ความเท่าเทียมกันของลำดับ เป็นแนวคิดหนึ่งที่ลำดับอินพุตถูกแบ่งออกเป็นหลายตัวอย่างตามช่วงเวลา ซึ่งลดการใช้หน่วยความจำสูงสุดตามสัดส่วนโดยอนุญาตให้การคำนวณดำเนินการกับตัวอย่างที่มีขนาดที่ละเอียดยิ่งขึ้น

ส่วนผสมของผู้เชี่ยวชาญ (MoE)

กับ ส่วนผสมของผู้เชี่ยวชาญ (MoE) วิธีการ ใช้เพียงเศษเสี้ยวของเครือข่ายในการคำนวณเอาท์พุตสำหรับอินพุทตัวใดตัวหนึ่ง ตัวอย่างหนึ่งคือต้องมีชุดน้ำหนักจำนวนมาก และเครือข่ายสามารถเลือกชุดที่จะใช้ผ่านกลไกเกตในเวลาอนุมานได้ ซึ่งช่วยให้มีพารามิเตอร์มากขึ้นโดยไม่ต้องเสียค่าใช้จ่ายในการคำนวณเพิ่มขึ้น ตุ้มน้ำหนักแต่ละชุดเรียกว่า "ผู้เชี่ยวชาญ" ด้วยความหวังว่าเครือข่ายจะเรียนรู้ที่จะมอบหมายการคำนวณและทักษะเฉพาะทางให้กับผู้เชี่ยวชาญแต่ละคน ผู้เชี่ยวชาญที่แตกต่างกันสามารถโฮสต์บน GPU ต่างๆ ได้ ซึ่งเป็นวิธีที่ชัดเจนในการขยายจำนวน GPU ที่ใช้สำหรับโมเดล

เทคนิคการฝึกโครงข่ายประสาทเทียมขนาดใหญ่

ภาพประกอบของเลเยอร์ส่วนผสมของผู้เชี่ยวชาญ (MoE) เพียง 2 จาก n ผู้เชี่ยวชาญถูกเลือกโดยเครือข่ายเกท (ภาพที่ดัดแปลงมาจาก: ชาเซียร์ และคณะ, 2017)

จีฮาร์ด ปรับขนาด MoE Transformer ได้สูงถึง 600 พันล้านพารามิเตอร์ด้วยโครงร่างที่แยกเฉพาะเลเยอร์ MoE ผ่านอุปกรณ์ TPU หลายเครื่อง และเลเยอร์อื่นๆ จะถูกทำซ้ำอย่างสมบูรณ์ สวิตช์หม้อแปลง ปรับขนาดโมเดลเป็นพารามิเตอร์หลายล้านล้านรายการโดยมีค่าพื้นที่ว่างที่สูงกว่าโดยกำหนดเส้นทางอินพุตหนึ่งรายการไปยังผู้เชี่ยวชาญเพียงรายเดียว

การออกแบบการประหยัดหน่วยความจำอื่น ๆ

มีกลยุทธ์การคำนวณอื่น ๆ อีกมากมายที่จะทำให้การฝึกอบรมโครงข่ายประสาทเทียมขนาดใหญ่มีความสะดวกมากขึ้น ตัวอย่างเช่น:

  • ในการคำนวณการไล่ระดับสี คุณต้องบันทึกการเปิดใช้งานดั้งเดิมไว้ ซึ่งสามารถใช้ RAM ของอุปกรณ์ได้มาก จุดตรวจ (เรียกอีกอย่างว่าการเปิดใช้งานการคำนวณใหม่) เก็บชุดย่อยของการเปิดใช้งานและคำนวณค่ากลางใหม่ในเวลาที่เหมาะสมระหว่างการย้อนกลับ วิธีนี้ช่วยประหยัดหน่วยความจำได้มากโดยต้องเสียค่าประมวลผลในการส่งต่อแบบเต็มเพิ่มเติมอย่างน้อยหนึ่งครั้ง เรายังสามารถแลกเปลี่ยนระหว่างการคำนวณและต้นทุนหน่วยความจำได้อย่างต่อเนื่องโดย การคำนวณการเปิดใช้งานแบบเลือกใหม่ซึ่งเป็นส่วนย่อยของจุดตรวจสอบของการเปิดใช้งานที่ค่อนข้างแพงในการจัดเก็บ แต่ถูกกว่าในการคำนวณ

  • การฝึกอบรมความแม่นยำแบบผสม คือการฝึกโมเดลโดยใช้ตัวเลขที่มีความแม่นยำต่ำกว่า (โดยทั่วไป FP16). คันเร่งสมัยใหม่สามารถเข้าถึงการนับ FLOP ที่สูงขึ้นได้มากด้วยตัวเลขที่มีความแม่นยำต่ำกว่า และคุณยังประหยัด RAM ของอุปกรณ์อีกด้วย ด้วยความระมัดระวังอย่างเหมาะสม โมเดลที่ได้จะสูญเสียความแม่นยำไปแทบไม่มี

  • การขนถ่าย คือการโหลดข้อมูลที่ไม่ได้ใช้ชั่วคราวไปยัง CPU หรือระหว่างอุปกรณ์ต่างๆ และอ่านกลับในภายหลังเมื่อจำเป็น การใช้งานที่ไร้เดียงสาจะทำให้การฝึกอบรมช้าลงอย่างมาก แต่การใช้งานที่ซับซ้อนจะดึงข้อมูลล่วงหน้าเพื่อให้อุปกรณ์ไม่ต้องรอ การนำแนวคิดนี้ไปใช้อย่างหนึ่งคือ ศูนย์ ซึ่งจะแยกพารามิเตอร์ การไล่ระดับสี และสถานะของเครื่องมือเพิ่มประสิทธิภาพในฮาร์ดแวร์ที่มีอยู่ทั้งหมด และทำให้เป็นจริงตามความจำเป็น

  • เครื่องมือเพิ่มประสิทธิภาพหน่วยความจำที่มีประสิทธิภาพ ได้รับการเสนอให้ลดขนาดหน่วยความจำของสถานะการทำงานที่ดูแลโดยตัวเพิ่มประสิทธิภาพเช่น อดาแฟกเตอร์.

  • การอัด สามารถใช้สำหรับเก็บผลลัพธ์ระดับกลางในเครือข่าย ตัวอย่างเช่น, ส่วนสำคัญ บีบอัดการเปิดใช้งานที่บันทึกไว้สำหรับการย้อนกลับ ดัล·อี บีบอัดการไล่ระดับสีก่อนที่จะซิงโครไนซ์


ที่ OpenAI เรากำลังฝึกอบรมและปรับปรุงโมเดลขนาดใหญ่จากโครงสร้างพื้นฐานที่อยู่ภายใต้ทุกวิถีทางเพื่อปรับใช้สำหรับปัญหาในโลกแห่งความเป็นจริง หากคุณต้องการนำแนวคิดจากโพสต์นี้ไปปฏิบัติ โดยเฉพาะอย่างยิ่งที่เกี่ยวข้องกับทีมวิจัยด้านการปรับขนาดและการวิจัยประยุกต์ของเรา การว่าจ้าง!


กิตติกรรมประกาศ
ขอขอบคุณ Nikolas Tezak, Sam Altman, Daniel Gackle, Ilya Sutskever และ Steven Adler สำหรับข้อเสนอแนะเกี่ยวกับร่างจดหมาย ขอขอบคุณ Justin Jay Wang, Bianca Martin และ Steve Dowling สำหรับการสื่อสารและการออกแบบ

ประทับเวลา:

เพิ่มเติมจาก OpenAI