microsoft / Quantum

Microsoft Quantum Development Kit Samples
https://docs.microsoft.com/quantum
MIT License
3.87k stars 918 forks source link

HalfMoon example on Quantum Hardware #764

Open wadeschulz opened 1 year ago

wadeschulz commented 1 year ago

Describe the bug We are trying to get the Azure Quantum ML classifier with the HalfMoon example running on quantum hardware/Azure simulator, but are running into issues with the job submission using the Python host file. Trying to determine if we're just doing something incorrectly in the submission or if running this on the remote system is not possible. Same error occurs with other Quantum targets, but works fine with the simulate command locally.

To Reproduce Steps to reproduce the behavior:

  1. Clone or copy the HalfMoon classifier code
  2. Change the "simulate" calls to the HalfMoon objectives to:
    qsharp.azure.execute(
      TrainHalfMoonModel,
      trainingVectors=data['TrainingData']['Features'],
      trainingLabels=data['TrainingData']['Labels'],
      initialParameters=parameter_starting_points,
      shots=1000,
      jobName=f"Train half moon model"
    )
  3. Attempt to run on IonQ simulator target
  4. See error
    {'text/plain': 'Connecting to Azure Quantum...', 'application/x-qsharp-data': '"Connecting to Azure Quantum..."'}
    Connected to Azure Quantum workspace refactorquantum in location eastus.
    Loading package Microsoft.Quantum.Providers.IonQ and dependencies...
    Active target is now ionq.simulator
    The Q# operation Microsoft.Quantum.Samples.TrainHalfMoonModel could not be compiled as an entry point for job execution.
    Invalid snippet code
    fail: Microsoft.Quantum.IQSharp.AzureClient.EntryPointGenerator[0]
      QS6235 (/entrypoint.qs:Microsoft.VisualStudio.LanguageServer.Protocol.Range): Multi-dimensional arrays are not supported in entry point arguments.
    fail: Microsoft.Quantum.IQSharp.AzureClient.EntryPointGenerator[0]
      QS6235 (/entrypoint.qs:Microsoft.VisualStudio.LanguageServer.Protocol.Range): Multi-dimensional arrays are not supported in entry point arguments.
    fail: Microsoft.Quantum.IQSharp.AzureClient.EntryPointGenerator[0]
      QS5027 (/entrypoint.qs:Microsoft.VisualStudio.LanguageServer.Protocol.Range): The callable TrainHalfMoonModel requires runtime capabilities which are not supported by the target ionq.simulator.
      Result Opacity: Transparent
      Classical Capability: Full
    fail: Microsoft.Quantum.IQSharp.AzureClient.EntryPointGenerator[0]
      QS6238 ((null):Microsoft.VisualStudio.LanguageServer.Protocol.Range): Missing entry point. Execution on a quantum processor requires that a Q# entry point is defined using the @EntryPoint() attribute. Any C# driver code should be defined in a separate project.
    fail: Microsoft.Quantum.IQSharp.AzureClient.EntryPointGenerator[0]
      Error compiling entry point for operation Microsoft.Quantum.Samples.TrainHalfMoonModel.
    fail: Microsoft.Quantum.IQSharp.AzureClient.AzureClient[0]
      The Q# operation Microsoft.Quantum.Samples.TrainHalfMoonModel could not be compiled as an entry point for job execution.
      Microsoft.Quantum.IQSharp.Common.CompilationErrorsException: Invalid snippet code
         at Microsoft.Quantum.IQSharp.AzureClient.EntryPointGenerator.Generate(String operationName, String executionTarget, TargetCapability capability, Boolean generateQir) in D:\a\1\s\submodules\iqsharp\src\AzureClient\EntryPoint\EntryPointGenerator.cs:line 166
         at Microsoft.Quantum.IQSharp.AzureClient.AzureClient.SubmitOrExecuteJobAsync(IChannel channel, AzureSubmissionContext submissionContext, Boolean execute, CancellationToken cancellationToken) in D:\a\1\s\submodules\iqsharp\src\AzureClient\AzureClient.cs:line 435
    /entrypoint.qs(5,69): error QS6235: Multi-dimensional arrays are not supported in entry point arguments.
    /entrypoint.qs(5,125): error QS6235: Multi-dimensional arrays are not supported in entry point arguments.
    /entrypoint.qs(7,32): error QS5027: The callable TrainHalfMoonModel requires runtime capabilities which are not supported by the target ionq.simulator.
    Result Opacity: Transparent
    Classical Capability: Full
    (1,1): error QS6238: Missing entry point. Execution on a quantum processor requires that a Q# entry point is defined using the @EntryPoint() attribute. Any C# driver code should be defined in a separate project.
    Traceback (most recent call last):
    File "run_remote.py", line 47, in <module>
    (parameters, bias) = qsharp.azure.execute(
    File "/Users/***/miniconda3/envs/quantum/lib/python3.9/site-packages/qsharp/azure.py", line 161, in execute
    if "error_code" in result: raise AzureError(result)
    qsharp.azure.AzureError: {'error_code': 1010, 'error_name': 'InvalidEntryPoint', 'error_description': 'The specified Q# operation cannot be used as an entry point for Azure Quantum job submission.'}

Additional context Add any other context about the problem here.

NikitaChernevskiy commented 10 months ago

Same issue - have you found a solution?

NikitaChernevskiy commented 10 months ago

Well, if it is still actual - I tried to pass arrays as 1-dimensional. I parsed them with this:

    parameter_starting_points = [
        [0.060057, 3.00522, 2.03083, 0.63527, 1.03771, 1.27881, 4.10186, 5.34396],
        [0.586514, 3.371623, 0.860791, 2.92517, 1.14616, 2.99776, 2.26505, 5.62137],
        [1.69704, 1.13912, 2.3595, 4.037552, 1.63698, 1.27549, 0.328671, 0.302282],
        [5.21662, 6.04363, 0.224184, 1.53913, 1.64524, 4.79508, 1.49742, 1.545]
    ]

    # Submit the Q# operation to Azure Quantum
    trainingVectors=data['TrainingData']['Features']
    trainingLabels=data['TrainingData']['Labels']
    initialParameters=parameter_starting_points

    data1 = [row[0] for row in trainingVectors]
    data2 = [row[1] for row in trainingVectors]

    _1 = [row[0] for row in initialParameters]
    _2 = [row[1] for row in initialParameters]
    _3 = [row[3] for row in initialParameters]
    _4 = [row[4] for row in initialParameters]
and then just passed them with this job

(parameters, bias) = qsharp.azure.execute(TrainHalfMoonModel, data1=data1, data2=data2, trainingLabels=trainingLabels, _1=_1, _2=_2, _3=_3, _4=_4, shots=100, jobName="Train", timeout=18000)

In q# I just combined them back
    operation TrainHalfMoonModel(
        data1 : Double[],
        data2 : Double[],
        trainingLabels : Int[],
        _1 : Double[],
        _2 : Double[],
        _3 : Double[],
        _4 : Double[],
    ) : (Double[], Double) {
        let trainingVectorsArray = Zipped(data1, data1);
        let trainingVectors = Mapped(CombineFunction, trainingVectorsArray);

        let initialParametersArray = Zipped4(_1, _2, _3, _4);
        let initialParameters = Mapped(CombineFunction4, initialParametersArray);

        ..........................

And few functions:

    function CombineFunction(a: Double, b: Double): Double[] {
        return [a, b];
    }

    function CombineFunction4(a: Double, b: Double, c: Double, d: Double): Double[] {
        return [a, b, c, d];
    }