microsoft / azure-quantum-python

The azure-quantum python package submits jobs to the Azure Quantum service.
https://learn.microsoft.com/azure/quantum/
MIT License
126 stars 92 forks source link

Job operations are not parallelizable #300

Open george-moussa opened 2 years ago

george-moussa commented 2 years ago

I'm trying to submit and process results of multiple jobs in parallel but I'm noticing that, in many cases, jobs are submitted sequentially.

import datetime
import imp
from multiprocessing import Pool
from azure.quantum import Workspace
from azure.quantum.optimization import Problem, ProblemType, Term
from azure.quantum.target.toshiba import SimulatedBifurcationMachine
import logging

def create_problem():
    problem = Problem('Test_Problem', problem_type=ProblemType.pubo)
    problem.add_terms([
        Term(c=1, indices=[]),
        Term(c=2, indices=[1, 2]),
        Term(c=-3, indices=[1, 2]),
        Term(c=1, indices=[0, 2])
    ])
    return problem

def exec_job(no):
    workspace = Workspace (
        resource_id = "<workspace-id>",
        location= "<location>"
    )

    problem = create_problem()
    solver = SimulatedBifurcationMachine(workspace, loops=0, timeout=10)
    print(str(datetime.datetime.utcnow()), "\t[%d] solver.submit() start" % no)
    job = solver.submit(problem)
    print(str(datetime.datetime.utcnow()), "\t[%d] job.id=%s" % (no, str(job.id)))

    print(str(datetime.datetime.utcnow()), "\t[%d] job.get_results() start" % no)
    result = job.get_results()
    print(str(datetime.datetime.utcnow()), "\t[%d] job.details=%s" % (no, str(job.details)))

if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)

    njobs = 2
    with Pool(processes=njobs) as pool:
        pool.map(func=exec_job, iterable=range(njobs))

For the above, output is: 2022-04-21 18:40:23.466530 [0] solver.submit() start 2022-04-21 18:40:23.542727 [1] solver.submit() start 2022-04-21 18:40:28.752803 [1] job.id=810bc3bb-c1a2-11ec-baa1-b831b575aea6 2022-04-21 18:40:28.752803 [1] job.get_results() start ..........2022-04-21 18:40:52.826348 [1] job.details={..........} 2022-04-21 18:44:19.108243 [0] job.id=81018a8e-c1a2-11ec-adf4-b831b575aea6 2022-04-21 18:44:19.109211 [0] job.get_results() start ..........2022-04-21 18:44:42.799796 [0] job.details={..............}

You can see that job 1 was submitted and awaited while job 0 hasn't been submitted at the same time and was done 4 mins after the first job.

guenp commented 2 years ago

Another solution to submitting multiple jobs in parallel would be through async i/o, see https://github.com/microsoft/qdk-python/issues/94.

anpaz commented 2 years ago

Unfortunately, I'm seeing the same problem when using the aio library. There seems to be some deadlock happening on a low-level http library. I have opened a ticket with the azure-sdk team to get their help: https://github.com/Azure/azure-sdk-for-python/issues/24443

anpaz commented 2 years ago

More analysis suggests this is a service problem, which we're investigating and might have a solution soon.