หมวดหมู่: รันไทม์: บัฟเฟอร์อินพุตของโปรแกรมไม่ตรงกัน
ข้อผิดพลาดนี้เกิดขึ้นเมื่อรันไทม์ XLA ตรวจพบว่าขนาดของบัฟเฟอร์หน่วยความจำที่โปรแกรมที่คอมไพล์แล้วคาดหวังไม่ตรงกับขนาดของบัฟเฟอร์ที่ระบุจริงในเวลาที่ดำเนินการ
ตัวอย่างข้อความแสดงข้อผิดพลาด:
XlaRuntimeError: INVALID_ARGUMENT: Executable(jit_embedding_pipeline_step_fn) expected parameter 2482 of size 5242880 (bf16[16,1280,40]{2,1,0:T(8,128)(2,1)}) but got buffer with incompatible size 1638400 (bf16[16,1280,40]{1,2,0:T(8,128)(2,1)}): while running replica 0 and partition 0 of a replicated computation (other replicas may have failed as well).
แบ็กเอนด์ XLA: TPU
ภาพรวม
ข้อความแสดงข้อผิดพลาดจะระบุทั้งขนาดที่คาดไว้และขนาดจริง รวมถึง รูปร่างและเลย์เอาต์ของเทนเซอร์ โปรดทราบว่าข้อผิดพลาดเหล่านี้อาจเกิดขึ้นแม้ว่าเทนเซอร์ 2 รายการจะมีรูปร่างเดียวกัน แต่ขนาดในหน่วยความจำอาจแตกต่างกันหากเลย์เอาต์จริง (วิธีเรียงต่อกันและจัดเรียงข้อมูลในฮาร์ดแวร์) แตกต่างกัน
ข้อผิดพลาดเหล่านี้ส่วนใหญ่เกิดจากสาเหตุต่อไปนี้
- การกำหนดค่าจุดตรวจสอบและ XLA ไม่ตรงกัน - มีการฝึกโมเดลและบันทึกจุดตรวจสอบ เลย์เอาต์จริงของน้ำหนักในจุดตรวจสอบนั้นจะกำหนดโดยเวอร์ชันและการกำหนดค่า XLA ที่แน่นอน (เช่น แฟล็ก XLA) ณ เวลานั้น ต่อมา ระบบจะโหลดจุดตรวจสอบนี้ในสภาพแวดล้อมอื่นที่มีการเปลี่ยนแปลงการกำหนดค่า แฟล็กใหม่ ค่าเริ่มต้นที่แตกต่างกัน หรือการเปลี่ยนแปลง ในโมเดล/โค้ด XLA อาจทำให้รันไทม์คาดหวังเลย์เอาต์จริงที่แตกต่างกัน สำหรับน้ำหนัก เมื่อส่งบัฟเฟอร์เก่าจากจุดตรวจสอบไปยังโปรแกรม XLA ที่คอมไพล์ใหม่ รันไทม์จะแสดงข้อผิดพลาด
- เลย์เอาต์เฉพาะฮาร์ดแวร์/โทโพโลยี - คอมไพเลอร์ XLA มีอิสระในการ เลือกเลย์เอาต์จริงที่แตกต่างกันสำหรับเทนเซอร์เพื่อเพิ่มประสิทธิภาพบน ฮาร์ดแวร์ต่างๆ เลย์เอาต์ที่เหมาะสำหรับ TPU v4 อาจแตกต่างจาก TPU v5 หรือแม้แต่สำหรับพ็อดสไลซ์ที่แตกต่างกันของชิปเดียวกัน (เช่น 4x4x4 เทียบกับ 4x8) ข้อผิดพลาดจะเกิดขึ้นเมื่อคอมไพล์โมเดลโดยมีสมมติฐานเกี่ยวกับเลย์เอาต์ของโทโพโลยีหนึ่ง แต่ในเวลาเรียกใช้จะมีการกำหนดเวลาในโทโพโลยีอื่น หรือมีข้อบกพร่องในตรรกะเลย์เอาต์ของคอมไพเลอร์สำหรับฮาร์ดแวร์ชิ้นหนึ่ง
การแก้ไขข้อบกพร่อง
- ตรวจสอบว่าการกำหนดค่าระหว่างการส่งออกโมเดลและการเรียกใช้ซ้ำจากจุดตรวจสอบมีความสอดคล้องกัน โดยทำดังนี้
- หลีกเลี่ยงการใช้จุดตรวจสอบเก่ากับโค้ดใหม่ เว้นแต่คุณจะมั่นใจว่าไม่มีการเปลี่ยนแปลงที่ส่งผลต่อเลย์เอาต์
- ส่งออกโมเดลที่บันทึกไว้ซ้ำ: หากสงสัยว่ามีข้อผิดพลาดในการจับคู่จุดตรวจ/การกำหนดค่า โซลูชันที่เชื่อถือได้มากที่สุดคือการส่งออกโมเดลที่บันทึกไว้ซ้ำ โดยใช้ฐานโค้ดและการกำหนดค่าเดียวกัน (และปัจจุบัน) กับที่คุณ ใช้สำหรับการอนุมานหรือการปรับแต่ง
- ตรวจสอบการเปลี่ยนแปลงการกำหนดค่า (เช่น แฟล็ก XLA) ระหว่างการเรียกใช้ทั้ง 2 ครั้ง
- เลย์เอาต์เฉพาะฮาร์ดแวร์/โทโพโลยี
- ตรวจสอบว่าฮาร์ดแวร์และโทโพโลยีมีเวอร์ชันไม่ตรงกันหรือไม่ หากเปลี่ยนฮาร์ดแวร์ หรือโทโพโลยี