รหัสข้อผิดพลาด: E0102

หมวดหมู่: รันไทม์: บัฟเฟอร์อินพุตของโปรแกรมไม่ตรงกัน

ข้อผิดพลาดนี้เกิดขึ้นเมื่อรันไทม์ 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 ครั้ง
  • เลย์เอาต์เฉพาะฮาร์ดแวร์/โทโพโลยี
    • ตรวจสอบว่าเวอร์ชันฮาร์ดแวร์และโทโพโลยีไม่ตรงกันหรือไม่ หากเปลี่ยนฮาร์ดแวร์ หรือโทโพโลยี