แบ็กเอนด์ตัวเร่งความเร็ว X10 สามารถให้ปริมาณงานที่สูงขึ้นอย่างมากสำหรับการคำนวณแบบขนานที่ใช้กราฟ แต่การติดตามแบบเลื่อนเวลาและการคอมไพล์แบบทันเวลาอาจทำให้เกิดพฤติกรรมที่ไม่ชัดเจนในบางครั้ง ซึ่งอาจรวมถึงการคอมไพล์การติดตามซ้ำบ่อยครั้งเนื่องจากการเปลี่ยนแปลงรูปร่างของกราฟหรือเทนเซอร์ หรือกราฟขนาดใหญ่ที่นำไปสู่ปัญหาหน่วยความจำในระหว่างการคอมไพล์
วิธีหนึ่งในการวินิจฉัยปัญหาคือการใช้ตัววัดการดำเนินการและตัวนับที่ X10 มอบให้ สิ่งแรกที่ต้องตรวจสอบเมื่อโมเดลทำงานช้าคือการสร้างรายงานเมตริก
เมตริก
หากต้องการพิมพ์รายงานเมตริก ให้เพิ่มการเรียก PrintX10Metrics()
ในโปรแกรมของคุณ:
import TensorFlow
...
PrintX10Metrics()
...
การดำเนินการนี้จะบันทึกตัวชี้วัดและตัวนับต่างๆ ในระดับ INFO
ทำความเข้าใจกับรายงานเมตริก
รายงานประกอบด้วยสิ่งต่างๆ เช่น:
- กี่ครั้งที่เราทริกเกอร์การรวบรวม XLA และเวลาทั้งหมดที่ใช้ในการรวบรวม
- เราเปิดใช้การคำนวณ XLA กี่ครั้ง และเวลาทั้งหมดที่ใช้ในการดำเนินการ
- เราสร้าง / ทำลายข้อมูลอุปกรณ์จำนวนเท่าใด ฯลฯ
ข้อมูลนี้รายงานเป็นเปอร์เซ็นไทล์ของกลุ่มตัวอย่าง ตัวอย่างคือ:
Metric: CompileTime
TotalSamples: 202
Counter: 06m09s401ms746.001us
ValueRate: 778ms572.062us / second
Rate: 0.425201 / second
Percentiles: 1%=001ms32.778us; 5%=001ms61.283us; 10%=001ms79.236us; 20%=001ms110.973us; 50%=001ms228.773us; 80%=001ms339.183us; 90%=001ms434.305us; 95%=002ms921.063us; 99%=21s102ms853.173us
นอกจากนี้เรายังมีตัวนับซึ่งมีชื่อว่าตัวแปรจำนวนเต็มซึ่งติดตามสถานะซอฟต์แวร์ภายใน ตัวอย่างเช่น:
Counter: CachedSyncTensors
Value: 395
คำเตือนที่ทราบ
Tensor
ที่ได้รับการสนับสนุนจาก X10 มีพฤติกรรมเชิงความหมายเหมือนกับโหมดกระตือรือร้นที่เป็นค่าเริ่มต้น Tensor
s อย่างไรก็ตาม มีข้อควรระวังด้านประสิทธิภาพและความครบถ้วนบางประการ:
ประสิทธิภาพลดลงเนื่องจากการคอมไพล์ซ้ำมากเกินไป
การรวบรวม XLA มีราคาแพง X10 จะคอมไพล์กราฟใหม่โดยอัตโนมัติทุกครั้งที่พบรูปร่างใหม่ โดยที่ผู้ใช้ไม่ต้องดำเนินการใด ๆ โมเดลจำเป็นต้องเห็นรูปร่างที่มีความเสถียรภายในไม่กี่ขั้นตอนการฝึก และจากจุดนั้นก็ไม่จำเป็นต้องคอมไพล์ใหม่ นอกจากนี้ เส้นทางการดำเนินการจะต้องเสถียรอย่างรวดเร็วด้วยเหตุผลเดียวกัน: X10 คอมไพล์ใหม่เมื่อพบเส้นทางการดำเนินการใหม่ สรุปเพื่อหลีกเลี่ยงการคอมไพล์ซ้ำ:
- หลีกเลี่ยงรูปร่างไดนามิกที่แปรผันสูง อย่างไรก็ตาม รูปร่างที่แตกต่างกันจำนวนน้อยก็อาจใช้ได้ แพดเทนเซอร์ให้ได้ขนาดคงที่เมื่อเป็นไปได้
- หลีกเลี่ยงการวนซ้ำด้วยจำนวนครั้งที่แตกต่างกันระหว่างขั้นตอนการฝึกซ้อม ขณะนี้ X10 กำลังคลายลูป ดังนั้นจำนวนการวนซ้ำที่แตกต่างกันจึงแปลเป็นพาธการดำเนินการ (ที่ไม่ได้ม้วน) ที่แตกต่างกัน
X10 ยังไม่รองรับการดำเนินการจำนวนเล็กน้อย
ขณะนี้เรามีการดำเนินการจำนวนหนึ่งที่ไม่ได้รับการสนับสนุน เนื่องจากไม่มีวิธีที่ดีในการแสดงผ่าน XLA และรูปร่างคงที่ (ปัจจุบันเป็นเพียง
nonZeroIndices
) หรือการขาดกรณีการใช้งานที่ทราบ (การดำเนินการพีชคณิตเชิงเส้นหลายรายการและการเริ่มต้นพหุนาม) . แม้ว่าหมวดหมู่ที่สองจะจัดการได้ง่ายตามต้องการ แต่หมวดหมู่แรกสามารถแก้ไขได้ผ่านการทำงานร่วมกันกับ CPU เท่านั้น ซึ่งไม่ใช่การใช้งาน XLA การใช้การทำงานร่วมกันบ่อยเกินไปมีผลกระทบต่อประสิทธิภาพที่สำคัญ เนื่องจากการเดินทางไปกลับของโฮสต์และการแยกส่วนโมเดลที่หลอมรวมอย่างสมบูรณ์ในหลายการติดตาม ดังนั้นผู้ใช้จึงควรหลีกเลี่ยงการใช้การดำเนินการดังกล่าวในรุ่นของตนบน Linux ให้ใช้
XLA_SAVE_TENSORS_FILE
(บันทึกไว้ในส่วนถัดไป) เพื่อรับการติดตามสแต็ก Swift ซึ่งเรียกว่าการดำเนินการที่ไม่รองรับ ชื่อฟังก์ชันสามารถแยกส่วนได้ด้วยตนเองโดยใช้swift-demangle
การได้มาและการสร้างกราฟร่องรอย
หากคุณสงสัยว่ามีปัญหากับวิธีการติดตามกราฟ หรือต้องการทำความเข้าใจกระบวนการติดตาม จะมีเครื่องมือให้ไว้เพื่อออกจากระบบและแสดงภาพการติดตาม คุณสามารถให้ X10 ออกจากระบบการติดตามที่พบโดยการตั้งค่าตัวแปรสภาพแวดล้อม XLA_SAVE_TENSORS_FILE
:
export XLA_SAVE_TENSORS_FILE=/home/person/TraceLog.txt
บันทึกการติดตามเหล่านี้มีสามรูปแบบ: text
, hlo
และ dot
โดยมีรูปแบบที่ตั้งค่าได้ผ่านตัวแปรสภาพแวดล้อม XLA_SAVE_TENSORS_FMT:
export XLA_SAVE_TENSORS_FMT=text
เมื่อคุณเรียกใช้แอปพลิเคชัน การแสดง text
ที่ออกจากระบบจะแสดงการติดตามแต่ละรายการในรูปแบบข้อความระดับสูงที่ใช้โดย X10 การแสดง hlo
แสดงการแสดงระดับกลางที่ส่งผ่านไปยังคอมไพเลอร์ XLA คุณอาจต้องการจำกัดจำนวนการวนซ้ำภายในลูปการฝึกหรือการคำนวณของคุณ เพื่อป้องกันไม่ให้บันทึกเหล่านี้มีขนาดใหญ่เกินไป นอกจากนี้ การเรียกใช้แอปพลิเคชันของคุณแต่ละครั้งจะต่อท้ายไฟล์นี้ ดังนั้นคุณอาจต้องการลบออกระหว่างการเรียกใช้
การตั้งค่าตัวแปร XLA_LOG_GRAPH_CHANGES
เป็น 1 จะระบุภายในบันทึกการติดตามซึ่งมีการเปลี่ยนแปลงในกราฟเกิดขึ้น สิ่งนี้มีประโยชน์อย่างมากในการค้นหาตำแหน่งที่จะทำให้เกิดการคอมไพล์ใหม่
สำหรับการแสดงร่องรอยด้วยภาพ ตัวเลือก dot
จะออกจากระบบกราฟที่เข้ากันได้กับ Graphviz หากแยกส่วนของร่องรอยที่มีลักษณะดังนี้
digraph G {
...
}
ลงในไฟล์ของตัวเอง Graphviz (สมมติว่าติดตั้งไว้แล้ว) สามารถสร้างแผนภาพภาพได้ผ่านทาง
dot -Tpng trace.dot -o trace.png
โปรดทราบว่าการตั้งค่าตัวแปรสภาพแวดล้อม XLA_SAVE_TENSORS_FILE
โดยเฉพาะอย่างยิ่งเมื่อใช้ร่วมกับ XLA_LOG_GRAPH_CHANGES
จะส่งผลเสียต่อประสิทธิภาพอย่างมาก ใช้สิ่งเหล่านี้เมื่อทำการดีบักเท่านั้น และไม่ใช่สำหรับการทำงานปกติ
ตัวแปรสภาพแวดล้อมเพิ่มเติม
ตัวแปรสภาพแวดล้อมเพิ่มเติมสำหรับการดีบัก ได้แก่:
XLA_USE_BF16
: หากตั้งค่าเป็น 1 จะแปลงค่าFloat
ทั้งหมดเป็น BF16 ควรใช้สำหรับการดีบักเท่านั้นเนื่องจากเรามีความแม่นยำแบบผสมอัตโนมัติXLA_USE_32BIT_LONG
: หากตั้งค่าเป็น 1 จะจับคู่ประเภท S4TFLong
กับประเภทจำนวนเต็ม XLA 32 บิต บน TPU การคำนวณจำนวนเต็ม 64 บิตมีราคาแพง ดังนั้นการตั้งค่าสถานะนี้อาจช่วยได้ แน่นอนว่า ผู้ใช้ต้องแน่ใจว่าค่าต่างๆ ยังคงเป็นจำนวนเต็ม 32 บิต