คู่มือผู้ใช้ SPANK plugin
SPANK plugin สำหรับ Quantum Resource Management Interface (QRMI) ใช้สำหรับกำหนดค่าการเข้าถึงทรัพยากรควอนตัมจาก user job ในสภาพแวดล้อมการประมวลผลที่ดูแลโดย Slurm workload manager นี่คือคู่มือสำหรับผู้ใช้ plugin เพื่อกำหนดค่าการจัดสรรทรัพยากร QPU เมื่อสร้าง Slurm job
การกำหนด QPU resource ของ Slurm กำหนดว่าทรัพยากรทางกายภาพใดสามารถใช้งานโดย Slurm job ในสภาพแวดล้อม high-performance compute (HPC) ซอร์สโค้ดของผู้ใช้ควรเป็นอิสระจาก backend instance เฉพาะ และแม้แต่ประเภท backend เมื่อเป็นไปได้ การทำแบบนี้ทำให้ซอร์สโค้ดพกพาได้ ในขณะที่เกณฑ์การเลือก QPU เป็นส่วนหนึ่งของ resource definition (ซึ่งถือเป็น configuration ไม่ใช่ซอร์สโค้ด)
กำหนดค่าทรัพยากร QPU ในการสร้าง job
หมายเหตุ: plugin นี้อยู่ระหว่างการพัฒนา และ syntax ที่แน่นอนอาจมีการเปลี่ยนแปลง
ขอบเขตของผู้ดูแลระบบ
ผู้ดูแลระบบ HPC กำหนดค่า SPANK plugin เพื่อระบุว่าทรัพยากรทางกายภาพใดสามารถให้บริการแก่ Slurm job ได้ การกำหนดค่านี้ประกอบด้วยข้อมูลทั้งหมดที่จำเป็นสำหรับให้ Slurm job เข้าถึงทรัพยากรทางกายภาพ เช่น endpoint และ access credentials
อ่าน qrmi_config.json.example สำหรับตัวอย่างการกำหนดค่าแบบครบถ้วน
ใน slurm.conf สามารถกำหนด QPU resource ให้กับบางโหนดหรือทุกโหนดสำหรับการใช้งาน:
...
GresTypes=qpu,name
NodeName=node[1-5000] Gres=qpu,name:ibm_fez
...
ขอบเขตของผู้ใช้
ผู้ใช้ HPC ส่ง job โดยใช้ QPU resource ที่เชื่อมโยงกับ Slurm QPU resource แอตทริบิวต์ name อ้างอิงถึงสิ่งที่ผู้ดูแลระบบ HPC กำหนดไว้ ในระหว่างที่ Slurm job กำลังทำงาน การเลือก backend สามารถอิงตามเกณฑ์อื่นนอกจากชื่อที่กำหนดไว้ล่วงหน้าซึ่งอ้างถึง backend เฉ พาะ (เช่น โดยตัวกำหนดความจุและอัตราข้อผิดพลาด เพื่อช่วยคัดกรองจากชุด backend ที่กำหนดไว้)
อาจมี environment variable เพิ่มเติมที่จำเป็น ขึ้นอยู่กับประเภท backend
พารามิเตอร์ SBATCH จะชี้ไปที่ QPU resource หนึ่งรายการหรือมากกว่าที่กำหนดให้กับแอปพลิเคชันเป็น generic resource
Environment variable ที่ให้ผ่าน plugin จะให้ข้อมูลที่จำเป็นแก่แอปพลิเคชัน (ดูส่วน ขอบเขตแอปพลิเคชัน HPC สำหรับรายละเอียด)
#SBATCH --time=100
#SBATCH --output=<LOGS_PATH>
#SBATCH --gres=qpu:1
#SBATCH --qpu=ibm_fez
#SBATCH --... # other options
srun ...
หากต้องการใช้ QPU resource เพิ่มเติม ให้เพิ่ม QPU ลงในพารามิเตอร์ --qpu:
#SBATCH --time=100
#SBATCH --output=<LOGS_PATH>
#SBATCH --gres=qpu:3
#SBATCH --qpu=my_local_qpu,ibm_fez,ibm_marrakesh
#SBATCH --... # other options
srun ...
ขอบเขตแอปพลิเคชัน HPC
แอปพลิเคชัน HPC ใช้ Slurm QPU resource ที่กำหนดให้กับ Slurm job
Environment variable ให้รายละเอียดเพิ่มเติมสำหรับการใช้งานของแอปพลิเคชัน เช่น SLURM_JOB_QPU_RESOURCES แสดงรายชื่อ quantum resource (คั่นด้วยเครื่องหมายจุลภาคหากมีหลายรายการ)
QRMI จะใช้ตัวแปรเหล่านี้ (ดูไฟล์ README ในไดเรกทอรี QRMI ต่างๆ (IBM, pasqal) สำหรับรายละเอียดเพิ่มเติม)
from qiskit import QuantumCircuit
# Using an IBM QRMI flavor:
from qrmi.primitives import QRMIService
from qrmi.primitives.ibm import SamplerV2, get_backend
# define circuit
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
circuit.measure_all()
# instantiate QRMI service and get quantum resource (we'll take the first one should there be several of them)
# inject credentials needed for accessing the service at this point
load_dotenv()
service = QRMIService()
resources = service.resources()
qrmi = resources[0]
# Generate transpiler target from backend configuration & properties and transpile
backend = get_backend(qrmi)
pm = generate_preset_pass_manager(
optimization_level=1,
backend=backend,
)
isa_circuit = pm.run(circuit)
# Run the circuit
options = {}
sampler = SamplerV2(qrmi, options=options)
job = sampler.run([(isa_circuit, isa_observable, param_values)])
print(f">>> Job ID: {job.job_id()}")
result = job.result()
if job.done():
pub_result = result[0]
print(f"Counts for the 'meas' output register: {pub_result.data.meas.get_counts()}")
elif job.cancelled():
print("Cancelled")
elif job.errored():
print(qrmi.task_logs(job.job_id()))
ดูตัวอย่างไฟล์ได้ที่ ไดเรกทอรี examples
ข้อมูลเฉพาะของ Backend
IBM Direct Access API
ขอบเขตของผู้ดูแลระบบ
การกำหนดค่า Direct Access API backend (ขอบเขตผู้ดูแลระบบ HPC) ประกอบด้วย endpoint และ credentials ไปยัง Direct Access endpoint และบริการ authentication รวมถึง S3 endpoint โดยเฉพาะอย่างยิ่ง ซึ่งรวมถึง:
- IBM Cloud® API key สำหรับสร้าง bearer token
- Endpoint ของ Direct Access API
- S3 bucket และรายละเอียดการเข้าถึง
Access credentials ไม่ควรมองเห็นได้สำหรับผู้ใช้ HPC หรือผู้ใ ช้ที่ไม่มีสิทธิ์อื่นๆ บนระบบ ดังนั้น ข้อมูลที่ละเอียดอ่อนสามารถวางในไฟล์แยกต่างหาก ซึ่งสามารถป้องกันการเข้าถึงได้ตามต้องการ
หมายเหตุ: Slurm มีสิทธิ์เข้าถึง backend ได้อย่างสมบูรณ์ ซึ่งมีนัยสำคัญหลายประการ:
- SPANK plugin รับผิดชอบด้าน multi-tenancy (ทำให้แน่ใจว่าผู้ใช้ไม่เห็นผลลัพธ์ของ job ของผู้ใช้คนอื่น)
- ฝั่ง HPC cluster รับผิดชอบการตรวจสอบผู้ใช้ (ใครได้รับอนุญาตให้เข้าถึง QPU) และรับรองการเข้าถึงตามที่กำหนด
- ความจุและลำดับความสำคัญของการใช้งาน QPU จัดการผ่าน Slurm แต่เพียงผู้เดียว ไม่มีการจัดตารางเวลาผู้ใช้อื่นนอกเหนือจาก Slurm
ขอบเขตของผู้ใช้
Execution lane ไม่เปิดเผยต่อผู้ดูแลระบบ HPC หรือผู้ใช้โดยตรง แต่ในระหว่างรันไทม์ มีสองโหมดที่ต่างกันที่ผู้ใช้ HPC สามารถระบุได้:
exclusive=trueระบุว่า job อื่นไม่สามารถใช้ทรัพยากรพร้อมกันได้ Job ในโหมด exclusive จะได้รับ execution lane ทั้งหมดและไม่สามารถทำงานพร้อมกันกับ job ที่ไม่ exclusive ได้exclusive=falseอนุญาตให้ job อื่นทำงานแบบ parallel ในกรณีนี้ มีได้มากเท่ากับจำนวน execution lane ที่มีอยู่ ทั้งหมดทำงานพร้อมกัน และ job จะได้รับหนึ่ง lane
Qiskit Runtime Service
ขอบเขตของผู้ใช้
คาดว่าผู้ใช้จะระบุรายละเอียดการเข้าถึงเพิ่มเติมใน environment variable โดยเฉพาะอย่างยิ่ง ซึ่งรวมถึงสิ่งต่อไปนี้:
- Qiskit Runtime service instance (CRN, Cloud Resource Name)
- Endpoint สำหรับ Qiskit Runtime (เว้นแต่จะตรวจพบโดยอัตโนมัติจาก CRN)
- API key ที่มีสิทธิ์เข้าถึง CRN
- S3 instance, bucket และ access token/credentials สำหรับการถ่ายโอนข้อมูล
รายละเอียดเหล่านี้กำหนดว่า Qiskit Runtime service จะถูกใช้ภายใต้ผู้ใช้และ service instance ใด ดังนั้น IBM Quantum® Platform scheduling จึงพิจารณาความสามารถของผู้ใช้และ service instance สำหรับการจัดตารางเวลา
ในขณะนี้ ผู้ใช้ต้องให้รายละเอียดข้างต้นด้วยตนเอง (ไม่มีการเข้าถึงควอนตัมร่วมกันทั่วทั้ง cluster)
Pasqal Cloud Services
ขอบเขตผู้ดูแลระบบ HPC
ไม่จำเป็นต้องมีการตั้งค่าเฉพาะจากผู้ดูแลระบบ HPC สำหรับการใช้งาน PCS