ประกาศ dependency
managed workflow รันในสภาพแวดล้อม Python ที่เตรียมไว้ล่วงหน้า job เข้าถึงอินเทอร์เน็ตไม่ได้ จึง pip install แพ็กเกจไม่ได้ แต่ Qiskit และรายการแพ็กเกจที่รองรับติดตั้งไว้แล้ว และคุณอัปโหลด wheelสำหรับแพ็กเกจอื่นที่ workflow ต้องใช้ได้
ตรวจสอบว่าติดตั้งแพ็กเกจใดไว้บ้าง
ทุก job รันด้วย Python 3.12 บน Linux (x86_64) โดยมีแพ็กเกจต่อไปนี้ติดตั้งอยู่:
-
qiskit,qiskit-ibm-runtime,qiskit-serverlessและ dependency ของแพ็กเกจเหล่านี้ เช่นnumpy -
แพ็กเกจที่รองรับ เช่น
qiskit-aer,qiskit-addon-sqd,qiskit-addon-utils,qiskit-mitigation,qiskit-addon-slc,qiskit-paulice,ffsimและpyscfแต่ละแพ็กเกจติดตั้งที่เวอร์ชันคงที่หนึ่งเวอร์ชัน
หากต้องการดูแพ็กเกจที่รองรับและเวอร์ชันของแพ็กเกจเหล่านั้น ให้เรียก dependencies_versions() จาก notebook ในเครื่องของคุณ:
run_workflow_remotely.ipynb
from qiskit_ibm_catalog import ManagedWorkflowClient
client = ManagedWorkflowClient()
client.dependencies_versions()
workflow ของคุณ import แพ็กเกจเหล่านี้ตัวใดก็ได้โดยไม่ต้องตั้งค่า workflow ติดตั้งแพ็กเกจเหล่านี้ตอนสร้างสภาพแวดล้อม ไม่ใช่ตอนเริ่ม job ดังนั้นจึงไม่เพิ่มเวลาเริ่มต้นของ job
workflow ไม่อ่านไฟล์ requirements.txt หรือ pyproject.toml จึงไม่ติดตั้งแพ็กเกจที่ไฟล์เหล่านี้ระบุ อาร์กิวเมนต์ dependencies ของ ManagedWorkflow เลิกใช้แล้วและถูกละเว้น จึงไม่ติดตั้งแพ็กเกจเช่นกัน ให้ลบออกจากโค้ดอัปโหลดของคุณ และอัปโหลด wheel แทน
แพ็กเกจบน GPU compute profile
job ที่รันบน GPU compute profile จะมีแพ็กเกจ CUDA ต่อไปนี้ติดตั้งไว้ด้วย แพ็กเกจเหล่านี้ใช้ได้เฉพาะบน GPU profile และ dependencies_versions() ไม่แสดงรายการเหล่านี้ อย่าอัปโหลด CUDA wheel ของคุณเอง เพราะจะขัดแย้งกับเวอร์ชันเหล่านี้
| แพ็กเกจ | เวอร์ชัน |
|---|---|
gpu4pyscf-cuda12x | 1.8.1 |
gpu4pyscf-libxc-cuda12x | 0.8.1 |
cupy-cuda12x | 14.2.0 |
cutensor-cu12 | 2.8.0 |
cuda-pathfinder | 1.8.5 |
nvidia-cublas-cu12 | 12.9.3.13 |
nvidia-cuda-nvrtc-cu12 | 12.9.86 |
nvidia-cuda-runtime-cu12 | 12.9.79 |
nvidia-cufft-cu12 | 11.4.1.4 |
nvidia-curand-cu12 | 10.3.10.19 |
nvidia-cusolver-cu12 | 11.7.5.82 |
nvidia-cusparse-cu12 | 12.5.10.65 |
nvidia-nvjitlink-cu12 | 12.9.86 |
เวอร์ชันของ nvidia-*-cu12 อาจเปลี่ยนไปเมื่อมีการสร้างสภาพแวดล้อมใหม่ โค้ดที่ขึ้นอยู่กับเวอร์ชันของไลบรารี CUDA แบบเจาะจงอาจต้องอัปเดตหลังมีรุ่นใหม่ออกมา
ขอแพ็กเกจ
ถ้าผู้ใช้คนอื่นก็ต้องใช้แพ็กเกจนี้ด้วย ขอแพ็กเกจได้บน GitHub แพ็กเกจที่ได้รับการอนุมัติจะถูกเพิ่มเข้าไปในสภาพแวดล้อมในรุ่นถัดไป ระหว่างนี้ หรือถ้าเป็นแพ็กเกจส่วนตัว ให้ เพิ่มเป็น wheel
เพิ่มแพ็กเกจของคุณเอง
ถ้าต้องการใช้แพ็กเกจที่ยังไม่ได้ติดตั้ง ให้รวบรวมไฟล์ wheel ของแพ็กเกจนั้นไว้ในคอมพิวเตอร์ของคุณ อัปโหลดไปยังพื้นที่จัดเก็บไฟล์ของเวิร์กโฟลว์ แล้วติดตั้งตอนเริ่มเวิร์กโฟลว์ คุณต้องอัปโหลดใหม่เฉพาะเมื่อไฟล์มีการเปลี่ยนแปลง
สร้าง wheel
งานจะติดตั้ง wheel โดยไม่มีการเชื่อมต่ออินเทอร์เน็ต ดังนั้นทุก wheel ต้องใช้งานได้กับ Python 3.12 บน Linux (x86_64) รวบรวม wheel ไว้ในโฟลเดอร์เดียว:
Local terminal
# Your own package
pip wheel --no-deps --wheel-dir wheels ./mypkg
# A package from PyPI, for the job's platform
pip download --only-binary=:all: --platform manylinux_2_28_x86_64 \
--python-version 3.12 --dest wheels pendulum==3.1.0
เมื่อใช้ --platform และ --python-version คำสั่ง pip download จะดึง wheel สำหรับแพลตฟอร์มของงาน แม้คุณจะรันบน macOS หรือ Windows ก็ตาม นอกจากนี้ยังดาวน์โหลด dependency ของแพ็กเกจด้วย เช่น python-dateutil, six และ tzdata สำหรับ pendulum เนื่องจากงานติดตั้งแต่ละ wheel โดยไม่ติดตั้ง dependency ให้อัปโหลด wheel ของทุก dependency ที่สภาพแวดล้อมไม่มี และลบ wheel อื่นออกจากโฟลเดอร์
wheel แบบ pure-Python (py3-none-any.whl) ใช้ได้กับทุกแพลตฟอร์ม ถ้าแพ็กเกจที่มีโค้ดคอมไพล์ไม่มี wheel สำหรับ Linux x86_64 บน PyPI ให้สร้างบน Linux เช่นในคอนเทนเนอร์ python:3.12 เก็บชื่อไฟล์เดิมไว้ เพราะ pip อ่านชื่อแพ็กเกจ เวอร์ชัน และแพลตฟอร์มจากชื่อไฟล์
อัปโหลด wheel
อัปโหลด wheel จากโน้ตบุ๊กในเครื่องของคุณด้วย add_wheels():
run_workflow_remotely.ipynb
from qiskit_ibm_catalog import ManagedWorkflowClient
client = ManagedWorkflowClient()
my_workflow = client.load("my-workflow")
client.add_wheels(my_workflow, ["wheels/*.whl"])
print(client.list_wheels(my_workflow))
แต่ละพาธอาจเป็นชื่อไฟล์หรือรูปแบบ glob และ add_wheels() จะคืนชื่อของ wheel ที่อัปโหลด ถ้ารูปแบบไม่ตรงกับไฟล์ใดเลย หรือตรงกับไฟล์ที่ไม่ใช่ไฟล์ .whl แล้ว add_wheels() จะ raise QiskitServerlessException
อัปโหลดเวิร์กโฟลว์ก่อนเพิ่ม wheel เพราะ wheel ถูกเก็บไว้พร้อมกับเวิร์กโฟลว์ โดยจะอยู่ในโฟลเดอร์ wheels ในพื้นที่จัดเก็บไฟล์ของเวิร์กโฟลว์ แยกจากไฟล์อื่นของคุณ
แทนที่หรือลบ wheel
หากต้องการดู wheel ที่อัปโหลดไว้ในเวิร์กโฟลว์ ให้เรียก list_wheels() หากต้องการลบ wheel ให้ส่งชื่อไฟล์ไปที่ remove_wheels():
run_workflow_remotely.ipynb
client.list_wheels(my_workflow)
# ['mypkg-1.0-py3-none-any.whl']
client.remove_wheels(my_workflow, ["mypkg-1.0-py3-none-any.whl"])
หากต้องการอัปเกรดแพ็กเกจ ให้ลบ wheel เก่าก่อน แล้วค่อยเพิ่มอันใหม่ เวอร์ชันใหม่มีชื่อไฟล์ต่างออกไป ดังนั้นถ้าคุณเก็บ wheel เก่าไว้ install_uploaded_wheels() จะติดตั้งทั้งสองเวอร์ชัน
run_workflow_remotely.ipynb
client.remove_wheels(my_workflow, ["mypkg-1.0-py3-none-any.whl"])
client.add_wheels(my_workflow, ["wheels/mypkg-1.1-*.whl"])
ติดตั้ง wheel ในเวิร์กโฟลว์ของคุณ
แก้ไขโค้ดเวิร์กโฟลว์ของคุณให้เรียก install_uploaded_wheels() ก่อน import แพ็กเกจ:
source_files/my_workflow.py
from qiskit_serverless import install_uploaded_wheels
install_uploaded_wheels()
import pendulum # Installed from an uploaded wheel
install_uploaded_wheels() ติดตั้งทุก wheel ในโฟลเดอร์ wheels ถ้าเวิร์กโฟลว์ไม่มี wheel การเรียกนี้จะไม่ทำอะไร wheel จะถูกติดตั้งใหม่ทุกครั้งที่รัน ดังนั้นถ้ามี wheel จำนวนมาก เวลาเริ่มต้นของแต่ละงานจะเพิ่มขึ้น
แนวปฏิบัติที่ดี: นำมาเฉพาะแพ็กเกจที่ขาด
ตามแนวปฏิบัติที่ดี ให้อัปโหลด wheel เฉพาะแพ็กเกจที่สภาพแวดล้อมไม่มี wheel ของแพ็กเกจที่ติดตั้งอยู่แล้ว เช่น numpy จะติดตั้งสำเนาที่สอง และโค้ดที่ import อาจได้สำเนาใดสำเนาหนึ่ง ข้อผิดพลาดจากความไม่ตรงกันจะปรากฏเฉพาะตอนที่งานรัน
ก่อนอัปโหลด ให้ตรวจสอบ requirement ของคุณด้วย dependency_report() จากโน้ตบุ๊กในเครื่อง:
run_workflow_remotely.ipynb
print(client.dependency_report(["pendulum==3.1.0", "qiskit-aer", "qiskit-addon-sqd==0.10.0"]))
requirement status note
pendulum==3.1.0 bring not in image — upload a wheel
qiskit-aer baked already in image (qiskit-aer==0.17.2)
qiskit-addon-sqd==0.10.0 clash image ships qiskit-addon-sqd==0.13.1
รายงานจะระบุสถานะหนึ่งในต่อไปนี้ให้แต่ละ requirement:
-
baked: สภาพแวดล้อมมีแพ็กเกจนี้อยู่แล้ว อย่าอัปโหลด wheel ของแพ็กเกจนี้ -
bring: สภาพแวดล้อมไม่มีแพ็กเกจนี้ ให้อัปโหลด wheel ของแพ็กเกจนี้ -
clash: สภาพแวดล้อมมีเวอร์ชันที่ต่างออกไป ให้เปลี่ยนเวอร์ชันที่โค้ดของคุณต้องการ หรือสร้างแพ็กเกจของคุณใหม่ให้ตรงกับเวอร์ชันที่ติดตั้งอยู่
รายงานจะตรวจสอบเฉพาะแพ็กเกจที่รองรับ จึงแสดง qiskit, qiskit-ibm-runtime, qiskit-serverless และ numpy เป็น bring ทั้งที่สภาพแวดล้อมมีแพ็กเกจเหล่านี้อยู่แล้ว ดังนั้นอย่าอัปโหลด wheel ของแพ็กเกจเหล่านี้ รายงานจะแสดง clash เฉพาะเวอร์ชันแบบ == ที่ระบุตรงตัว ส่วนช่วงเวอร์ชัน เช่น >=0.10 จะแสดงเป็น baked รายงานนี้ไม่อัปโหลดไฟล์ใดเลย
แก้ปัญหา dependency
| ปัญหา | สาเหตุ |
|---|---|
pip install ล้มเหลวภายในเวิร์กโฟลว์ | งานเชื่อมต่ออินเทอร์เน็ตไม่ได้ ให้ อัปโหลด wheel แทน |
ModuleNotFoundError กับแพ็กเกจที่คุณอัปโหลดไว้ | เวิร์กโฟลว์ import แพ็กเกจก่อนที่จะเรียก install_uploaded_wheels() |
ModuleNotFoundError กับ dependency ของแพ็กเกจที่คุณอัปโหลดไว้ | wheel ถูกติดตั้งโดยไม่มี dependency ให้อัปโหลด wheel ของ dependency ที่ขาดไป |
ข้อผิดพลาดระบุว่า wheel is not a supported wheel on this platform | wheel นั้นสำหรับระบบปฏิบัติการหรือ Python เวอร์ชันอื่น ให้หา wheel สำหรับ Python 3.12 บน Linux x86_64 |
install_uploaded_wheels() ล้มเหลวด้วย ResolutionImpossible | โฟลเดอร์ wheels มีแพ็กเกจเดียวกันสองเวอร์ชัน ให้ลบ wheel เก่าด้วย remove_wheels() |
แพ็กเกจ CUDA เช่น cupy ล้มเหลวบนโปรไฟล์คอมพิวต์ GPU หลังจากอัปโหลด wheel | wheel ไปแทนที่หนึ่งในแพ็กเกจ CUDAที่สภาพแวดล้อมมีให้ ให้ลบ wheel นั้นด้วย remove_wheels() |
แพ็กเกจที่ติดตั้งไว้ เช่น numpy ล้มเหลวหลังจากอัปโหลด wheel | wheel ติดตั้งสำเนาที่สองของแพ็กเกจที่สภาพแวดล้อมมีให้อยู่แล้ว ให้ลบ wheel นั้นด้วย remove_wheels() |