หมวดหมู่: เวลาคอมไพล์: เอาต์พุตการออฟโหลดโฮสต์ไม่ตรงกัน
ข้อผิดพลาดนี้เกิดขึ้นเมื่อมีการส่งคืนเทนเซอร์ที่ออฟโหลดไปยังหน่วยความจำของโฮสต์อย่างชัดเจน เป็นเอาต์พุตของโปรแกรม แต่ไม่ได้กำหนดค่าลายเซ็นเอาต์พุตของโปรแกรมให้ คาดหวังหน่วยความจำของโฮสต์
ตัวอย่างข้อความแสดงข้อผิดพลาด:
INVALID_ARGUMENT: Tensor which is moved to host (starting from tuple.64) is returned from the entry computation but the layout for this output is not set to host memory.
แบ็กเอนด์ XLA: TPU, GPU
ภาพรวม
เมื่อคอมไพเลอร์พบคำอธิบายประกอบเพื่อลดภาระเทนเซอร์ไปยังโฮสต์ (CPU) คอมไพเลอร์จะติดตามตำแหน่งของเทนเซอร์ผ่านกราฟการคำนวณจนกว่าจะเกิดเหตุการณ์ใดเหตุการณ์หนึ่งต่อไปนี้
- ย้ายไปยังอุปกรณ์: คำอธิบายประกอบที่ตรงกันจะย้าย Tensor กลับไปยังตัวเร่ง
- การคำนวณโฮสต์: การดำเนินการฝั่งโฮสต์ใช้ Tensor
- สิ้นสุดโปรแกรม: เทนเซอร์จะสิ้นสุดโปรแกรมและกลายเป็นเอาต์พุต
ข้อผิดพลาดนี้จะทริกเกอร์ในสถานการณ์ #3 Tensor จะอยู่ในหน่วยความจำของโฮสต์เมื่อสิ้นสุดการดำเนินการ แต่ลายเซ็นการคำนวณรายการของโปรแกรม XLA จะกำหนดเอาต์พุตที่เฉพาะเจาะจงนั้นให้อยู่ในหน่วยความจำของอุปกรณ์ เนื่องจากคอมไพเลอร์ไม่สามารถเปลี่ยนอินเทอร์เฟซของการคำนวณรายการโดยนัย จึงทำให้เกิดข้อผิดพลาด
การแก้ไขข้อบกพร่อง
หากต้องการแก้ไขข้อผิดพลาดนี้ ให้พิจารณาว่าคุณต้องการให้เทนเซอร์นี้เป็นเอาต์พุตในโฮสต์หรือไม่ หรือควรย้ายกลับไปยังอุปกรณ์ก่อนที่จะส่งคืนหรือไม่
ตั้งใจจะส่งคืนในโฮสต์: หากต้องการให้ส่งคืนเทนเซอร์นี้ใน หน่วยความจำของโฮสต์อย่างชัดแจ้ง (หลีกเลี่ยงการโอนกลับไปยังอุปกรณ์) คุณควร ตั้งค่าพื้นที่หน่วยความจำเอาต์พุตของการคำนวณรายการเป็นหน่วยความจำของโฮสต์ อย่างชัดแจ้งสำหรับเอาต์พุตนี้
ตั้งใจจะส่งคืนในอุปกรณ์: หากตั้งใจจะเก็บ Tensor ไว้ในอุปกรณ์หรือส่งคืนไปยังอุปกรณ์ก่อนที่โปรแกรมจะสิ้นสุดลง คุณอาจพลาดคำอธิบายประกอบ แทรกคำอธิบายประกอบที่ตรงกันเพื่อย้าย Tensor กลับไปยังอุปกรณ์
หากไม่แน่ใจว่าเทนเซอร์ที่ออฟโหลดมาจากไหน หรือไม่พบว่าคำอธิบายประกอบ "ย้ายไปยังอุปกรณ์" หายไปที่ใด ให้ใช้การบันทึก XLA เพื่อติดตามคำสั่ง
- เปิดใช้การบันทึก: หากใช้ Google Cloud TPU ให้เรียกใช้โปรแกรมอีกครั้งโดยใช้แฟล็ก
--vmodule=host_offloader=1 - วิเคราะห์บันทึก: มองหาเอาต์พุต "trace" ในบันทึก ซึ่งจะแสดงเส้นทางของเทนเซอร์ที่เริ่มต้นจากคำสั่งการออฟโหลด ใช้เพื่อระบุตำแหน่งที่แน่นอนที่เทนเซอร์ไปถึงขอบเขตของโปรแกรมโดยไม่ต้องย้ายกลับไปยังอุปกรณ์