การดีบักปัญหา X10

แบ็กเอนด์ตัวเร่งความเร็ว 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 อย่างไรก็ตาม มีข้อควรระวังด้านประสิทธิภาพและความครบถ้วนบางประการ:

  1. ประสิทธิภาพลดลงเนื่องจากการคอมไพล์ซ้ำมากเกินไป

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

    • หลีกเลี่ยงรูปร่างไดนามิกที่แปรผันสูง อย่างไรก็ตาม รูปร่างที่แตกต่างกันจำนวนน้อยก็อาจใช้ได้ แพดเทนเซอร์ให้ได้ขนาดคงที่เมื่อเป็นไปได้
    • หลีกเลี่ยงการวนซ้ำด้วยจำนวนครั้งที่แตกต่างกันระหว่างขั้นตอนการฝึกซ้อม ขณะนี้ X10 กำลังคลายลูป ดังนั้นจำนวนการวนซ้ำที่แตกต่างกันจึงแปลเป็นพาธการดำเนินการ (ที่ไม่ได้ม้วน) ที่แตกต่างกัน
  2. 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 จะจับคู่ประเภท S4TF Long กับประเภทจำนวนเต็ม XLA 32 บิต บน TPU การคำนวณจำนวนเต็ม 64 บิตมีราคาแพง ดังนั้นการตั้งค่าสถานะนี้อาจช่วยได้ แน่นอนว่า ผู้ใช้ต้องแน่ใจว่าค่าต่างๆ ยังคงเป็นจำนวนเต็ม 32 บิต