หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

พัฒนาแบ็กเอนด์ใหม่สำหรับ XLA

คำแนะนำเบื้องต้นนี้สำหรับผู้ใช้งานยุคแรกที่ต้องการตั้งค่า TensorFlow ใหม่ให้กับฮาร์ดแวร์ของพวกเขาในลักษณะที่มีประสิทธิภาพ คู่มือไม่ได้เป็นขั้นเป็นตอนและใช้ความรู้เกี่ยวกับ LLVM , Bazel และ TensorFlow

XLA ให้อินเทอร์เฟซแบบนามธรรมที่สถาปัตยกรรมหรือตัวเร่งความเร็วใหม่สามารถนำไปใช้เพื่อสร้างแบ็กเอนด์เพื่อเรียกใช้กราฟ TensorFlow การกำหนดเป้าหมายใหม่ XLA ควรง่ายและปรับขนาดได้ง่ายกว่าการใช้ TensorFlow Op ที่มีอยู่ทุกครั้งสำหรับฮาร์ดแวร์ใหม่

การใช้งานส่วนใหญ่จะตกอยู่ในหนึ่งในสถานการณ์ต่อไปนี้:

  1. สถาปัตยกรรม CPU ที่มีอยู่ยังไม่ได้รับการสนับสนุนอย่างเป็นทางการจาก XLA โดยมีหรือไม่มีแบ็กเอนด์ LLVM ที่มีอยู่
  2. ฮาร์ดแวร์ที่ไม่เหมือน CPU ที่มีแบ็กเอนด์ LLVM ที่มีอยู่
  3. ฮาร์ดแวร์ที่ไม่เหมือน CPU โดยไม่มีแบ็กเอนด์ LLVM ที่มีอยู่

สถานการณ์ที่ 1: สถาปัตยกรรม CPU ที่มีอยู่ซึ่งยังไม่รองรับ XLA อย่างเป็นทางการ

ในสถานการณ์สมมตินี้เริ่มต้นด้วยการดู แบ็กเอนด์ CPU XLA ที่มีอยู่ XLA ทำให้ง่ายต่อการกำหนดเป้าหมาย TensorFlow ไปยัง CPU อื่นโดยใช้ LLVM เนื่องจากความแตกต่างที่สำคัญระหว่างแบ็กเอนด์ XLA สำหรับ CPU คือโค้ดที่สร้างโดย LLVM Google ทดสอบ XLA สำหรับสถาปัตยกรรม x64 และ ARM64

หากผู้จำหน่ายฮาร์ดแวร์มีแบ็กเอนด์ LLVM สำหรับฮาร์ดแวร์ของพวกเขามันเป็นเรื่องง่ายที่จะเชื่อมโยงแบ็กเอนด์กับ LLVM ที่สร้างขึ้นด้วย XLA ในโหมด JIT แบ็คเอนด์ XLA CPU ปล่อยโค้ดสำหรับโฮสต์ CPU สำหรับการรวบรวมล่วงหน้า xla::AotCompilationOptions สามารถจัดเตรียม LLVM triple เพื่อกำหนดค่าสถาปัตยกรรมเป้าหมาย

หากไม่มีแบ็กเอนด์ LLVM ที่มีอยู่ แต่มีตัวสร้างโค้ดประเภทอื่นอยู่มันควรจะเป็นไปได้ที่จะนำ CPU แบ็กเอนด์ CPU ที่มีอยู่มาใช้ใหม่

สถานการณ์ที่ 2: ฮาร์ดแวร์ที่ไม่เหมือน CPU ที่มีแบ็กเอนด์ LLVM ที่มีอยู่

เป็นไปได้ที่จะสร้างโมเดลการนำ xla::Compiler ไปใช้กับคลาส xla::CPUCompiler และ xla::GPUCompiler มีอยู่เนื่องจากสิ่งเหล่านี้ปล่อย LLVM IR แล้ว ขึ้นอยู่กับลักษณะของฮาร์ดแวร์เป็นไปได้ว่าหลายแง่มุมการสร้าง LLVM IR จะต้องเปลี่ยน แต่รหัสจำนวนมากสามารถใช้ร่วมกับแบ็กเอนด์ที่มีอยู่

ตัวอย่างที่ดีในการติดตามคือ แบ็กเอนด์ GPU ของ XLA แบ็คเอนด์ของ GPU ตั้งเป้าไปที่ ISA ที่ไม่ใช่ซีพียูและดังนั้นบางแง่มุมของการสร้างรหัสของมันจึงเป็นเอกลักษณ์ของโดเมน GPU ฮาร์ดแวร์ชนิดอื่นเช่น DSPs เช่น Hexagon (ซึ่งมีแบ็กเอนด์ LLVM อัปสตรีม) สามารถนำชิ้นส่วนของตรรกะการปล่อย IRVVM IR กลับคืนมาได้ แต่ส่วนอื่น ๆ จะไม่ซ้ำกัน

สถานการณ์ที่ 3: ฮาร์ดแวร์ที่ไม่เหมือน CPU โดยไม่มีแบ็กเอนด์ LLVM ที่มีอยู่

หากไม่สามารถใช้ LLVM ได้ตัวเลือกที่ดีที่สุดคือการใช้แบ็กเอนด์ใหม่สำหรับ XLA สำหรับฮาร์ดแวร์ที่ต้องการ ตัวเลือกนี้ต้องใช้ความพยายามมากที่สุด คลาสที่ต้องดำเนินการมีดังนี้:

  • StreamExecutor : สำหรับอุปกรณ์จำนวนมากไม่จำเป็นต้องใช้วิธีการทั้งหมดของ StreamExecutor ดูการใช้งาน StreamExecutor ที่มีอยู่สำหรับรายละเอียด
  • xla::Compiler : คลาสนี้ encapsulate การคอมไพล์ของการคำนวณ HLO เป็น xla::Executable
  • xla::Executable : คลาสนี้ใช้เพื่อเริ่มต้นการคำนวณที่คอมไพล์แล้วบนแพลตฟอร์ม
  • xla::TransferManager : คลาสนี้ช่วยให้แบ็กเอนด์จัดเตรียมกลไกเฉพาะแพลตฟอร์มสำหรับการสร้างข้อมูลตัวอักษร XLA จากหน่วยความจำอุปกรณ์ที่กำหนด กล่าวอีกนัยหนึ่งมันช่วยห่อหุ้มการถ่ายโอนข้อมูลจากโฮสต์ไปยังอุปกรณ์และย้อนกลับ