XProf เป็นวิธีที่ยอดเยี่ยมในการรับและแสดงภาพร่องรอยและโปรไฟล์ประสิทธิภาพของโปรแกรม รวมถึงกิจกรรมใน GPU และ TPU ผลลัพธ์สุดท้ายจะมีลักษณะ ดังนี้

การจับภาพแบบเป็นโปรแกรม
คุณสามารถวัดโค้ดเพื่อบันทึกการติดตามโปรไฟล์สำหรับโค้ด JAX ผ่านเมธอด
jax.profiler.start_trace
และ jax.profiler.stop_trace
ได้ Call
jax.profiler.start_trace
พร้อมไดเรกทอรีที่จะเขียนไฟล์การติดตาม ซึ่งควรเป็น--logdir
ไดเรกทอรีเดียวกับที่ใช้เริ่ม XProf จากนั้นคุณจะใช้ XProf เพื่อดูการติดตามได้
เช่น หากต้องการบันทึกการติดตามของโปรไฟล์เลอร์ ให้ทำดังนี้
import jax
jax.profiler.start_trace("/tmp/profile-data")
# Run the operations to be profiled
key = jax.random.key(0)
x = jax.random.normal(key, (5000, 5000))
y = x @ x
y.block_until_ready()
jax.profiler.stop_trace()
โปรดทราบว่า jax.block_until_ready
โทร เราใช้ข้อมูลนี้เพื่อให้มั่นใจว่าการดำเนินการในอุปกรณ์จะได้รับการบันทึกโดยการติดตาม ดูรายละเอียดเกี่ยวกับเหตุผลที่ต้องดำเนินการนี้ได้ที่การส่งแบบอะซิงโครนัส
คุณยังใช้เครื่องจัดการบริบท
jax.profiler.trace
แทน start_trace และ stop_trace ได้ด้วย
import jax
with jax.profiler.trace("/tmp/profile-data"):
key = jax.random.key(0)
x = jax.random.normal(key, (5000, 5000))
y = x @ x
y.block_until_ready()
การดูการติดตาม
หลังจากบันทึกการติดตามแล้ว คุณจะดูได้โดยใช้ UI ของ XProf
คุณเปิดใช้ UI ของโปรไฟล์เลอร์ได้โดยตรงโดยใช้คำสั่ง XProf แบบสแตนด์อโลนโดย ชี้ไปยังไดเรกทอรีบันทึก
$ xprof --port=8791 /tmp/profile-data
Attempting to start XProf server:
Log Directory: /tmp/profile-data
Port: 8791
Worker Service Address: 0.0.0.0:50051
Hide Capture Button: False
XProf at http://localhost:8791/ (Press CTRL+C to quit)
ไปที่ URL ที่ระบุ (เช่น http://localhost:8791/) ในเบราว์เซอร์
เพื่อดูโปรไฟล์
ร่องรอยที่ใช้ได้จะปรากฏในเมนูแบบเลื่อนลง "เซสชัน" ทางด้านซ้าย เลือกเซสชันที่สนใจ แล้วเลือก "Trace Viewer" ในเมนูแบบเลื่อนลง "เครื่องมือ" ตอนนี้คุณควรเห็นไทม์ไลน์ของการดำเนินการ คุณใช้ ปุ่ม WASD เพื่อไปยังส่วนต่างๆ ของการติดตาม และคลิกหรือลากเพื่อเลือกเหตุการณ์สำหรับ รายละเอียดเพิ่มเติมได้ ดูรายละเอียดเพิ่มเติมเกี่ยวกับการใช้เครื่องมือดูการติดตามได้ในเอกสารประกอบของเครื่องมือดูการติดตาม
การจับภาพด้วยตนเองผ่าน XProf
ต่อไปนี้เป็นวิธีการบันทึกการติดตาม N วินาทีที่ทริกเกอร์ด้วยตนเอง จากโปรแกรมที่กําลังทํางาน
เริ่มเซิร์ฟเวอร์ XProf
xprof --logdir /tmp/profile-data/คุณควรโหลด XProf ได้ที่
<http://localhost:8791/>คุณสามารถระบุพอร์ตอื่นได้ด้วยแฟล็ก--portในโปรแกรมหรือกระบวนการ Python ที่ต้องการสร้างโปรไฟล์ ให้เพิ่มโค้ดต่อไปนี้ ที่ใดที่หนึ่งใกล้กับจุดเริ่มต้น
import jax.profiler jax.profiler.start_server(9999)ซึ่งจะเริ่มเซิร์ฟเวอร์โปรไฟล์ที่ XProf เชื่อมต่อ เซิร์ฟเวอร์ Profiler ต้องทำงานก่อนที่คุณจะไปยังขั้นตอนถัดไป เมื่อใช้งานเซิร์ฟเวอร์เสร็จแล้ว คุณสามารถโทรหา
jax.profiler.stop_server()เพื่อปิดเซิร์ฟเวอร์ได้หากต้องการสร้างโปรไฟล์ของข้อมูลโค้ดในโปรแกรมที่ทำงานเป็นเวลานาน (เช่น ลูปการฝึกที่ใช้เวลานาน ) คุณสามารถวางไว้ที่จุดเริ่มต้นของโปรแกรมและเริ่มโปรแกรมได้ตามปกติ หากต้องการสร้างโปรไฟล์โปรแกรมสั้นๆ (เช่น Microbenchmark) ตัวเลือกหนึ่งคือการเริ่มเซิร์ฟเวอร์โปรไฟล์ในเชลล์ IPython และเรียกใช้โปรแกรมสั้นๆ ด้วย
%runหลังจากเริ่มการจับภาพใน ขั้นตอนถัดไป อีกทางเลือกหนึ่งคือการเริ่มเซิร์ฟเวอร์โปรไฟล์ที่ จุดเริ่มต้นของโปรแกรมและใช้time.sleep()เพื่อให้มีเวลาเพียงพอในการ เริ่มการจับภาพเปิด
<http://localhost:8791/>แล้วคลิกปุ่ม "CAPTURE PROFILE" ที่ด้านซ้ายบน ป้อน "localhost:9999" เป็น URL ของบริการโปรไฟล์ (นี่คือที่อยู่ของเซิร์ฟเวอร์โปรไฟล์ที่คุณเริ่มต้นในขั้นตอนก่อนหน้า) ป้อน จำนวนมิลลิวินาทีที่ต้องการสร้างโปรไฟล์ แล้วคลิก "จับภาพ"หากโค้ดที่คุณต้องการสร้างโปรไฟล์ยังไม่ได้ทำงาน (เช่น หากคุณเริ่มเซิร์ฟเวอร์โปรไฟล์ในเชลล์ Python) ให้รันโค้ดขณะที่การจับภาพกำลังทำงาน
หลังจากจับภาพเสร็จแล้ว XProf ควรจะรีเฟรชโดยอัตโนมัติ (ฟีเจอร์การสร้างโปรไฟล์ XProf บางอย่างไม่ได้เชื่อมต่อกับ JAX ดังนั้นในตอนแรกจึงอาจดูเหมือนว่าไม่มีการบันทึกอะไรเลย) ทางด้านซ้ายในส่วน "เครื่องมือ" ให้เลือก "Trace Viewer"
ตอนนี้คุณควรเห็นไทม์ไลน์ของการดำเนินการ คุณสามารถใช้ปุ่ม WASD เพื่อ ไปยังส่วนต่างๆ ของการติดตาม และคลิกหรือลากเพื่อเลือกเหตุการณ์เพื่อดูรายละเอียดเพิ่มเติมที่ ด้านล่าง ดูรายละเอียดเพิ่มเติมเกี่ยวกับการใช้เครื่องมือ Trace Viewer ได้ที่เอกสารประกอบของเครื่องมือ Trace Viewer
XProf และ Tensorboard
XProf เป็นเครื่องมือพื้นฐานที่ขับเคลื่อนฟังก์ชันการทำงานของการสร้างโปรไฟล์และการบันทึกการติดตามใน Tensorboard
ตราบใดที่ติดตั้ง xprof แล้ว แท็บ "โปรไฟล์"
จะอยู่ใน Tensorboard การใช้ฟีเจอร์นี้จะเหมือนกับการเปิดใช้ XProf
แยกกัน ตราบใดที่เปิดใช้โดยชี้ไปยังไดเรกทอรีบันทึกเดียวกัน
ซึ่งรวมถึงฟังก์ชันการจับภาพ การวิเคราะห์ และการดูโปรไฟล์ XProf
จะแทนที่tensorboard_plugin_profileฟังก์ชันการทำงานที่ก่อนหน้านี้เรา
แนะนำ
$ tensorboard --logdir=/tmp/profile-data
[...]
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.19.0 at http://localhost:6006/ (Press CTRL+C to quit)
การเพิ่มเหตุการณ์การติดตามที่กำหนดเอง
โดยค่าเริ่มต้น เหตุการณ์ในเครื่องมือแสดงข้อมูลการติดตามส่วนใหญ่จะเป็นฟังก์ชัน JAX
ภายในระดับต่ำ คุณเพิ่มเหตุการณ์และฟังก์ชันของคุณเองได้โดยใช้
jax.profiler.TraceAnnotation
และ jax.profiler.annotate_function
ในโค้ด
การกำหนดค่าตัวเลือกโปรไฟล์
เมธอด start_trace รับพารามิเตอร์ profiler_options ที่ไม่บังคับ ซึ่ง
ช่วยให้ควบคุมลักษณะการทำงานของโปรไฟล์เลอร์ได้อย่างละเอียด พารามิเตอร์นี้
ควรเป็นอินสแตนซ์ของ jax.profiler.ProfileOptions
เช่น หากต้องการปิดใช้การติดตามทั้งหมดของ Python และโฮสต์ ให้ทำดังนี้
import jax
options = jax.profiler.ProfileOptions()
options.python_tracer_level = 0
options.host_tracer_level = 0
jax.profiler.start_trace("/tmp/profile-data", profiler_options=options)
# Run the operations to be profiled
key = jax.random.key(0)
x = jax.random.normal(key, (5000, 5000))
y = x @ x
y.block_until_ready()
jax.profiler.stop_trace()
ตัวเลือกทั่วไป
host_tracer_level: ตั้งค่าระดับการติดตามสำหรับกิจกรรมฝั่งโฮสต์ค่าที่รองรับ
0: ปิดใช้การติดตามโฮสต์ (CPU) ทั้งหมด1: เปิดใช้การติดตามเฉพาะเหตุการณ์ TraceMe ที่ผู้ใช้สร้างเครื่องมือ2: มีการติดตามระดับ 1 พร้อมรายละเอียดการดำเนินการโปรแกรมระดับสูง เช่น การดำเนินการ XLA ที่มีค่าใช้จ่ายสูง (ค่าเริ่มต้น)3: มีการติดตามระดับ 2 พร้อมรายละเอียดการดำเนินการโปรแกรมระดับต่ำที่ละเอียดมากขึ้น เช่น การดำเนินการ XLA ที่มีราคาถูก
device_tracer_level: ควบคุมว่าจะเปิดใช้การติดตามอุปกรณ์หรือไม่ค่าที่รองรับ
0: ปิดใช้การติดตามอุปกรณ์1: เปิดใช้การติดตามอุปกรณ์ (ค่าเริ่มต้น)
python_tracer_level: ควบคุมว่าจะเปิดใช้การติดตาม Python หรือไม่ค่าที่รองรับ
0: ปิดใช้การติดตามการเรียกฟังก์ชัน Python (ค่าเริ่มต้น)1: เปิดใช้การติดตาม Python
ตัวเลือกการกำหนดค่าขั้นสูง
ตัวเลือก TPU
tpu_trace_mode: ระบุโหมดสำหรับการติดตาม TPUค่าที่รองรับ
TRACE_ONLY_HOST: ซึ่งหมายความว่าจะมีการติดตามเฉพาะกิจกรรมฝั่งโฮสต์ (CPU) และจะไม่มีการรวบรวมการติดตามอุปกรณ์ (TPU/GPU)TRACE_ONLY_XLA: ซึ่งหมายความว่าจะมีการติดตามเฉพาะการดำเนินการระดับ XLA ในอุปกรณ์TRACE_COMPUTE: ติดตามการดำเนินการประมวลผลในอุปกรณ์TRACE_COMPUTE_AND_SYNC: ติดตามทั้งการดำเนินการประมวลผลและ เหตุการณ์การซิงค์ในอุปกรณ์
หากไม่ได้ระบุ "tpu_trace_mode" ค่าเริ่มต้นของ trace_mode จะเป็น
TRACE_ONLY_XLAtpu_num_sparse_cores_to_trace: ระบุจำนวน Sparse Core ที่จะ ติดตามใน TPUtpu_num_sparse_core_tiles_to_trace: ระบุจำนวนไทล์ภายใน แต่ละคอร์แบบกระจัดกระจายที่จะติดตามใน TPUtpu_num_chips_to_profile_per_task: ระบุจำนวนชิป TPU ที่จะ สร้างโปรไฟล์ต่อชิ้นงาน
ตัวเลือก GPU
ตัวเลือกต่อไปนี้ใช้ได้สำหรับการสร้างโปรไฟล์ GPU
gpu_max_callback_api_events: กำหนดจำนวนเหตุการณ์สูงสุดที่รวบรวมโดย API การเรียกกลับของ CUPTI ค่าเริ่มต้นคือ2*1024*1024gpu_max_activity_api_events: กำหนดจำนวนเหตุการณ์สูงสุดที่รวบรวมโดย API กิจกรรม CUPTI ค่าเริ่มต้นคือ2*1024*1024gpu_max_annotation_strings: กำหนดจำนวนสูงสุดของสตริงคำอธิบายประกอบ ที่รวบรวมได้ ค่าเริ่มต้นคือ1024*1024gpu_enable_nvtx_tracking: เปิดใช้การติดตาม NVTX ใน CUPTI ค่าเริ่มต้นคือFalsegpu_enable_cupti_activity_graph_trace: เปิดใช้การติดตามกราฟกิจกรรม CUPTI สำหรับกราฟ CUDA ค่าเริ่มต้นคือFalsegpu_pm_sample_counters: สตริงที่คั่นด้วยคอมมาของเมตริกการตรวจสอบประสิทธิภาพ GPU เพื่อรวบรวมโดยใช้ฟีเจอร์การสุ่มตัวอย่าง PM ของ CUPTI (เช่น"sm__cycles_active.avg.pct_of_peak_sustained_elapsed") การสุ่มตัวอย่าง PM จะ ปิดใช้โดยค่าเริ่มต้น ดูเมตริกที่ใช้ได้ในเอกสารประกอบ CUPTI ของ NVIDIAgpu_pm_sample_interval_us: กำหนดช่วงเวลาการสุ่มตัวอย่างในหน่วยไมโครวินาทีสำหรับ การสุ่มตัวอย่าง PM ของ CUPTI ค่าเริ่มต้นคือ500gpu_pm_sample_buffer_size_per_gpu_mb: กำหนดขนาดบัฟเฟอร์หน่วยความจำของระบบต่อ อุปกรณ์เป็น MB สำหรับการสุ่มตัวอย่าง PM ของ CUPTI ค่าเริ่มต้นคือ 64 MB ค่าสูงสุดที่รองรับคือ 4 GBgpu_num_chips_to_profile_per_task: ระบุจำนวนอุปกรณ์ GPU ที่จะ สร้างโปรไฟล์ต่อ 1 งาน หากไม่ได้ระบุ ตั้งค่าเป็น 0 หรือตั้งค่าเป็นค่าที่ไม่ถูกต้อง ระบบจะสร้างโปรไฟล์ GPU ที่พร้อมใช้งานทั้งหมด ซึ่งใช้เพื่อลดขนาดการรวบรวม การติดตามได้gpu_dump_graph_node_mapping: หากเปิดใช้ จะทิ้งข้อมูลการแมปโหนดกราฟ CUDA ลงในการติดตาม ค่าเริ่มต้นคือFalse
เช่น
options = ProfileOptions()
options.advanced_configuration = {"tpu_trace_mode" : "TRACE_ONLY_HOST", "tpu_num_sparse_cores_to_trace" : 2}
แสดงผล InvalidArgumentError หากพบคีย์หรือค่าตัวเลือกที่ไม่รู้จัก