Bagikan melalui


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 menginstal azure-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.

  1. Pilih bilah Manajemen pekerjaan di ruang kerja Quantum Anda.
  2. 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.
  3. Klik nama sesi untuk detail selengkapnya.
  4. 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.

  1. 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.

  2. Untuk membuat sesi dalam layanan, Anda dapat menggunakan workspace.open_session(session) atau session.open().

  3. 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")
    
  4. Anda dapat menutup sesi dengan session.close() atau workspace.close_session(session).

  5. Untuk melampirkan sesi ke target, Anda dapat menggunakan target.latest_session.

  6. 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.CONTINUEkegagalan 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")