Aracılığıyla paylaş


Oturumları yönetme

Bu makalede oturumlarla çalışmayı öğreneceksiniz. Oturumlarla, bir veya daha fazla işi tek targetbir üzerinde gruplandırabilir ve bu sayede işleri etkili bir şekilde yönetebilirsiniz. Daha fazla bilgi için bkz . Etkileşimli kuantum bilişimi: oturumlar.

Not

Oturumlar, satır içi kod çalıştırılırken Q# bile Python ile yönetilir. Daha fazla bilgi için Oturumları kullanmaya başlama'nın "Q# + Python" bölümüne bakın.

Oturumları alma, oturumları listeleme ve oturumların işlerini listeleme

Aşağıdaki tabloda, belirli bir oturum için tüm oturumların ve tüm işlerin listesini almak için Python komutları gösterilmektedir.

Komut Açıklama
workspace.list_sessions() veya session.list_sessions() Kuantum Çalışma Alanı'ndaki tüm oturumların listesini alın.
workspace.get_session(sessionId) veya session.get_session(sessionId) kimliğine sessionIdsahip oturumu alın. Her oturumun benzersiz bir kimliği vardır.
workspace.list_session_jobs(sessionId) veya session.list_session_jobs(sessionId) Kimliğiyle sessionIdoturumdaki tüm işlerin listesini alın. Her oturumun benzersiz bir kimliği vardır.

Örneğin, aşağıdaki kod en az sayıda iş içeren bir oturum alan bir işlevi tanımlar. Ardından bu oturumda tüm işler, toplam iş sayısı ve ilk 10 iş listelenir.

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}")

Oturumları el ile açma/kapatma yöntemleri

Yeni bir oturum oluşturmak için Oturumları kullanmaya başlama bölümünde yer alan adımların izlenmesini öneririz. Ancak, oturumları el ile oluşturabilirsiniz.

  1. İlk olarak bir Session nesnesi oluşturun.

    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}")
    

    Not

    Bu noktada oturum yalnızca istemcide bulunur ve durumunun Yok olduğunu görebilirsiniz. Oturumun durumunu görüntülemek için, hizmette oturumu da oluşturmanız gerekir.

  2. Hizmette oturum oluşturmak için veya session.open()kullanabilirsinizworkspace.open_session(session).

  3. durumu ve oturum ayrıntılarını ile session.refresh()veya bir oturum kimliğinden yeni bir oturum nesnesi alarak yenileyebilirsiniz.

    same_session = workspace.get_session(session.id) 
    print(f"Session: {session.details} \n")
    print(f"Session: {same_session.details} \n")
    
  4. veya ile bir oturumu kapatabilirsiniz.workspace.close_session(session)session.close()

  5. Oturumu bir targetöğesine eklemek için kullanabilirsiniztarget.latest_session.

  6. Oturumun tamamlanmasını bekleyebilirsiniz:

    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)
    

bağımsız değişkenleri geçirme Q#

İşleminiz Q# giriş bağımsız değişkenlerini alırsa, bu bağımsız değişkenler python kodu olan iş gönderimi sırasında geçirilir. Bu, bağımsız değişkenlerinizi nesne olarak Q# biçimlendirmeye dikkat etmeniz gerektiği anlamına gelir.

Bağımsız değişkenler işe parametre olarak geçirilirken, çağrılırken qsharp.compilekod olarak Q# biçimlendirilirler, bu nedenle Python'dan gelen değerlerin geçerli Q# söz dizimi olarak bir dize olarak biçimlendirilmesi gerekir.

Giriş olarak bir tamsayı, nve bir açı angledizisi alan aşağıdaki Q# programı göz önünde bulundurun.

open Microsoft.Quantum.Measurement;
open Microsoft.Quantum.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;
}

İşlemi farklı açılarla n=2 üç kez çalıştırmak GenerateRandomBits istiyorsunuz. Farklı açılarda üç iş göndermek için aşağıdaki Python kodunu kullanabilirsiniz.

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]

Bu örnekte, Python'daki diziler zaten [item0, item1, ...] olarak yazdırıldığından, giriş bağımsız değişkenleri biçimlendirmeyle Q# eşleşir. Diğer Python veri yapılarında, içine eklenen Q# dize değerlerini uyumlu bir şekilde almak için daha fazla işlemeye ihtiyacınız olabilir. Örneğin, bir Q# tanımlama grubu virgülle ayrılmış değerlerle parantez içinde olmalıdır.

Oturum zaman aşımları

Oturumda 10 dakika boyunca yeni bir iş gönderilmezse oturum zaman aşımına uğradı. Oturum, TimedOut durumunu bildirir. Bu durumu önlemek için kullanarak backend.open_session(name="Name")bir with blok ekleyin; böylece oturumclose(), kod bloğunun sonunda hizmet tarafından çağrılır.

Not

Programınızda hatalar veya hatalar varsa, oturumdaki önceki işlerin tümü tamamlandıktan sonra yeni bir iş göndermek 10 dakikadan fazla sürebilir.

Aşağıdaki kod parçacıkları, yeni iş gönderilmediği için 10 dakika sonra oturumun zaman aşımına uğradıklarının bir örneğini gösterir. Bunu önlemek için, bir sonraki kod parçacığında oturum oluşturmak için bir bloğun nasıl kullanılacağı with gösterilir.

#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()

Oturumlar içinde iş hatası ilkesi

bir iş başarısız olduğunda oturum için varsayılan ilke, bu oturumu sonlandırmaktır. Aynı oturum içinde ek bir iş gönderirseniz, hizmet işi reddeder ve oturum Başarısız durumunu bildirir. Devam eden işler iptal edilir.

Ancak bu davranış, oturum oluşturulurken varsayılan SessionJobFailurePolicy.ABORTyerine bir iş hatası ilkesi job_failure_policy=SessionJobFailurePolicy.CONTINUEbelirtilerek değiştirilebilir. İş hatası ilkesi olduğunda CONTINUE, hizmet işleri kabul etmeye devam eder. Oturum, bu durumda Başarısız(lar) durumunu bildirir ve bu durum oturum kapatıldıktan sonra Başarısız olarak değişir.

Oturum hiçbir zaman kapatılıp zaman aşımına uğradıysa, işler başarısız olsa bile durum Zaman Aşımı olur.

Örneğin, aşağıdaki program üç iş içeren bir oturum oluşturur. giriş verileri olarak belirttiğinden "garbage" ilk iş başarısız olur. Bu noktada oturumun bitmesini önlemek için, program oturumu oluştururken nasıl ekleneceğini job_failure_policy=SessionJobFailurePolicy.CONTINUE gösterir.

#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")

Sonraki adım