Cara mengelola sesi Anda
Dalam artikel ini, Anda mempelajari cara mengelola sesi Anda. Dengan sesi, Anda dapat mengelompokkan satu atau beberapa pekerjaan terhadap satu target, yang memungkinkan Anda mengelola pekerjaan secara efektif. Untuk informasi selengkapnya, lihat Mulai menggunakan sesi.
Prasyarat
Akun Azure dengan langganan aktif. Jika Anda tidak memiliki akun Azure, daftarkan secara gratis dan daftar untuk langganan prabayar.
Ruang kerja Azure Quantum. Untuk informasi selengkapnya, lihat Buat ruang kerja Azure Quantum.
Lingkungan Python dengan Python dan Pip terinstal.
Paket Azure Quantum
azure-quantum
. Jika Anda ingin menggunakan Qiskit atau Cirq, Anda perlu menginstalazure-quantum
paket dengan tag [qiskit] atau [cirq].pip install --upgrade azure-quantum[qiskit]
Catatan
Sesi dikelola dengan Python, bahkan saat menjalankan Q# kode sebaris.
Sesi pemantauan
Anda dapat menggunakan bilah Manajemen pekerjaan di ruang kerja Quantum Anda untuk melihat semua item yang dikirimkan tingkat atas, termasuk sesi dan pekerjaan individual yang tidak terkait dengan sesi apa pun.
- Pilih bilah Manajemen pekerjaan di ruang kerja Quantum Anda.
- Identifikasi pekerjaan jenis Sesi. Dalam tampilan ini Anda dapat melihat ID Unik Sesi di ID kolom dan memantau Statusnya. Status sesi adalah:
- Menunggu: Pekerjaan dalam sesi sedang dijalankan.
- Berhasil: Sesi telah berhasil berakhir.
- TimeOut: Jika tidak ada pekerjaan baru yang dikirimkan dalam sesi selama 10 menit, waktu sesi tersebut habis. Untuk informasi selengkapnya, lihat Batas waktu sesi.
- Gagal: Jika pekerjaan dalam sesi gagal, sesi tersebut berakhir dan melaporkan status Gagal. Untuk informasi selengkapnya, lihat Kebijakan kegagalan pekerjaan dalam sesi.
- Klik nama sesi untuk detail selengkapnya.
- Anda dapat melihat daftar Semua pekerjaan dalam sesi dan memantau statusnya.
Mengambil dan mencantumkan sesi
Tabel berikut ini memperlihatkan perintah Python untuk mendapatkan daftar semua sesi dan semua pekerjaan untuk sesi tertentu.
Perintah | Deskripsi |
---|---|
workspace.list_sessions() atau session.list_sessions() |
Ambil daftar semua sesi di Ruang Kerja Quantum. |
workspace.get_session(sessionId) atau session.get_session(sessionId) |
Ambil sesi dengan ID sessionId . Setiap sesi memiliki ID unik. |
workspace.list_session_jobs(sessionId) atau session.list_session_jobs(sessionId) |
Ambil daftar semua pekerjaan dalam sesi dengan ID sessionId . Setiap sesi memiliki ID unik. |
Misalnya, kode berikut mendefinisikan fungsi yang mendapatkan sesi dengan jumlah minimum pekerjaan. Kemudian, untuk sesi itu, ia mencantumkan semua pekerjaan, jumlah total pekerjaan, dan 10 pekerjaan pertama.
def get_a_session_with_jobs(min_jobs):
all_sessions = workspace.list_sessions() # list of all sessions
for session in all_sessions:
if len(workspace.list_session_jobs(session.id)) >= min_jobs:
return session
session = get_a_session_with_jobs(min_jobs=3) # Get a Session with at least 3 jobs
session_jobs = workspace.list_session_jobs(session.id) # List of all jobs within Session ID
print(f"Job count: {len(session_jobs)} \n")
print(f"First 10 jobs for session {session.id}:")
for job in session_jobs[0:10]:
print(f"Id: {job.id}, Name={job.details.name}")
Metode manual sesi pembukaan/penutupan
Sebaiknya ikuti langkah-langkah dalam Memulai sesi untuk membuat sesi baru. Anda juga dapat membuat sesi secara manual.
Pertama, buat objek Sesi.
from azure.quantum.job.session import Session, SessionDetails, SessionJobFailurePolicy import uuid session = Session( workspace=workspace, # required id=f"{uuid.uuid1()}", # optional, if not passed will use uuid.uuid1() name="", # optional, will be blank if not passed provider_id="ionq", # optional, if not passed will try to parse from the target target="ionq.simulator", # required job_failure_policy=SessionJobFailurePolicy.ABORT # optional, defaults to abort ) print(f"Session status: {session.details.status}")
Catatan
Pada titik ini, sesi hanya ada pada klien, dan Anda dapat melihat bahwa statusnya tidak ada. Untuk melihat status sesi, Anda juga perlu membuat sesi dalam layanan.
Untuk membuat sesi dalam layanan, Anda dapat menggunakan
workspace.open_session(session)
atausession.open()
.Anda dapat menyegarkan status dan detail sesi dengan
session.refresh()
, atau dengan mendapatkan objek sesi baru dari ID sesi.same_session = workspace.get_session(session.id) print(f"Session: {session.details} \n") print(f"Session: {same_session.details} \n")
Anda dapat menutup sesi dengan
session.close()
atauworkspace.close_session(session)
.Untuk melampirkan sesi ke target, Anda dapat menggunakan
target.latest_session
.Anda dapat menunggu sesi selesai:
session_jobs = session.list_jobs() [session_job.id for session_job in session_jobs] import time while (session.details.status != "Succeeded" and session.details.status != "Failed" and session.details.status != "TimedOut"): session.refresh() time.sleep(5)
Meneruskan argumen dalam Q#
Jika operasi Anda Q# mengambil argumen input, argumen tersebut diteruskan selama pengiriman pekerjaan, yaitu kode Python. Ini berarti Bahwa Anda perlu berhati-hati untuk memformat argumen Anda sebagai Q# objek.
Saat meneruskan argumen sebagai parameter ke pekerjaan, argumen tersebut diformat sebagai Q# kode saat memanggil qsharp.compile
, sehingga nilai dari Python perlu diformat ke dalam string sebagai sintaks yang valid Q# .
Pertimbangkan program berikut Q# , yang mengambil bilangan bulat, n
, dan array sudut, angle
, sebagai input.
import Std.Measurement.*;
import Std.Arrays.*;
operation GenerateRandomBits(n: Int, angle: Double[]) : Result[] {
use qubits = Qubit[n]; // n parameter as the size of the qubit array
for q in qubits {
H(q);
}
R(PauliZ, angle[0], qubits[0]); // arrays as entry-points parameters
R(PauliZ, angle[1], qubits[1]);
let results = MeasureEachZ(qubits);
ResetAll(qubits);
return results;
}
Anda ingin menjalankan GenerateRandomBits
operasi tiga kali dengan n=2
dan sudut yang berbeda. Anda dapat menggunakan kode Python berikut untuk mengirimkan tiga pekerjaan dengan sudut yang berbeda.
angle = [0.0, 0.0]
with target.open_session(name="Q# session of three jobs") as session:
target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 1", shots=100) # First job submission
angle[0] += 1
target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 2", shots=100) # Second job submission
angle[1] += 1
target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 3", shots=100) # Third job submission
session_jobs = session.list_jobs()
[session_job.details.name for session_job in session_jobs]
Dalam contoh ini, karena array di Python sudah dicetak sebagai [item0, item1, ...], argumen input cocok dengan Q# pemformatan. Untuk struktur data Python lainnya, Anda mungkin memerlukan lebih banyak penanganan untuk mendapatkan nilai string yang Q# disisipkan ke dalam dengan cara yang kompatibel. Misalnya, Q# tuple harus dalam tanda kurung dengan nilai yang dipisahkan koma.
Batas waktu sesi
Waktu sesi habis jika tidak ada pekerjaan baru yang dikirimkan dalam sesi selama 10 menit. Sesi melaporkan status TimedOut. Untuk menghindari situasi ini, tambahkan with
blok menggunakan backend.open_session(name="Name")
, sehingga sesi close()
dipanggil oleh layanan di akhir blok kode.
Catatan
Jika ada kesalahan atau bug dalam program Anda, mungkin perlu waktu lebih dari 10 menit untuk mengirimkan pekerjaan baru setelah pekerjaan sebelumnya dalam sesi semuanya selesai.
Cuplikan kode berikut menunjukkan contoh waktu sesi habis setelah 10 menit karena tidak ada pekerjaan baru yang dikirimkan. Untuk menghindarinya, cuplikan kode berikutnya menunjukkan cara menggunakan with
blok untuk membuat sesi.
#Example of a session that times out
session = backend.open_session(name="Qiskit circuit session") # Session times out because only contains one job
backend.run(circuit=circuit, shots=100, job_name="Job 1")
#Example of a session that includes a with block to avoid timeout
with backend.open_session(name="Qiskit circuit session") as session: # Use a with block to submit multiple jobs within a session
job1 = backend.run(circuit=circuit, shots=100, job_name="Job 1") # First job submission
job1.wait_for_final_state()
job2 = backend.run(circuit=circuit, shots=100, job_name="Job 2") # Second job submission
job2.wait_for_final_state()
job3 = backend.run(circuit=circuit, shots=100, job_name="Job 3") # Third job submission
job3.wait_for_final_state()
Kebijakan kegagalan pekerjaan dalam sesi
Kebijakan default untuk sesi ketika pekerjaan gagal adalah mengakhiri sesi tersebut. Jika Anda mengirimkan pekerjaan tambahan dalam sesi yang sama, layanan menolaknya dan sesi melaporkan status Gagal. Setiap pekerjaan yang sedang berlangsung dibatalkan.
Namun, perilaku ini dapat diubah dengan menentukan kebijakan job_failure_policy=SessionJobFailurePolicy.CONTINUE
kegagalan pekerjaan , bukan default SessionJobFailurePolicy.ABORT
, saat membuat sesi. Ketika kebijakan kegagalan pekerjaan adalah CONTINUE
, layanan terus menerima pekerjaan. Sesi melaporkan status Kegagalan dalam kasus ini, yang akan berubah menjadi Gagal setelah sesi ditutup.
Jika sesi tidak pernah ditutup dan waktu habis, statusnya adalah TimedOut meskipun pekerjaan telah gagal.
Misalnya, program berikut membuat sesi dengan tiga pekerjaan. Pekerjaan pertama gagal karena menentukan "garbage"
sebagai data input. Untuk menghindari akhir sesi pada titik ini, program menunjukkan cara menambahkan job_failure_policy=SessionJobFailurePolicy.CONTINUE
saat membuat sesi.
#Example of a session that does not close but reports Failure(s) when a jobs fails
with target.open_session(name="JobFailurePolicy Continue", job_failure_policy=SessionJobFailurePolicy.CONTINUE) as session:
target.submit(input_data="garbage", name="Job 1") #Input data is missing, this job fails
target.submit(input_data=quil_program, name="Job 2") #Subsequent jobs are accepted because of CONTINUE policy
target.submit(input_data=quil_program, name="Job 3")