.NET 用 Azure Quantum Jobs クライアント ライブラリ - バージョン 1.0.0-beta.3

Azure Quantum は、量子コンピューティング プログラムを実行したり、クラウドでの最適化の問題を解決したりするために使用できる Microsoft Azure サービスです。 Azure Quantum のツールと SDK を使用して、量子プログラムを作成し、さまざまな量子シミュレーターとマシンに対して実行することができます。 Azure.Quantum.Jobs クライアント ライブラリを使用すると、次のことができます。

作業の開始

このセクションには、最初のクライアント接続を 非常に迅速にインストールして作成するために開発者が行う必要があるすべてが含まれている必要があります。

パッケージをインストールする

NuGet を使用して .NET 用の Azure Quantum Jobs クライアント ライブラリをインストールします。

dotnet add package Azure.Quantum.Jobs --prerelease -v 1.0.0-beta.1

前提条件

」セクションのすべてのスニペットを開発者が認証してテストする前に満たす必要がある要件を詳しく説明するセクションをインストール コマンドの後に含めます。 たとえば、Cosmos DB の場合:

このパッケージを使用するには、 Azure サブスクリプションCosmos DB アカウント (SQL API)、 Python 3.6 以降 が必要です。

クライアントを認証する

サービスで認証するために、ワークスペースは内部的に DefaultAzureCredential を 使用します。 これにより、環境 (環境変数、ManagedIdentity、CachedTokens など) に基づいてさまざまな認証メカニズムが試され、最後に InteractiveBrowserCredential にフォールバックします。

ワークスペースでは、ユーザーが独自の TokenCredential を渡すことによって、上記の動作をオーバーライドすることもできます。

TokenCredential は、Azure SDK で使用される既定の認証メカニズムです。

主要な概念

QuantumJobClient は、ジョブの認証、作成、列挙、取り消しに使用するルート クラスです。

JobDetails には、ジョブのすべてのプロパティが含まれます。

ProviderStatus には、プロバイダーの状態情報が含まれています。

QuantumJobQuota にはクォータ プロパティが含まれています。

スレッド セーフ

すべてのクライアント インスタンス メソッドがスレッド セーフであり、相互に独立していることを保証します (ガイドライン)。 これにより、スレッド間であっても、クライアント インスタンスの再利用に関する推奨事項が常に安全になります。

その他の概念

クライアント オプション | 応答 | へのアクセス実行時間の長い操作 | エラーの | 処理診断 | あざける | クライアントの有効期間

クライアントを作成する

次のパラメーターを渡して QuantumJobClient のインスタンスを作成します。

  • サブスクリプション - XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXXX のようになります。Azure 上のサブスクリプションの一覧にあります
  • リソース グループ - Azure ソリューションの関連リソースを保持するコンテナー
  • ワークスペース - 量子または最適化アプリケーションの実行に関連付けられている資産のコレクション
  • 場所 - 地理的リージョン別に最適なデータ センターを選択する
  • StorageContainerName - BLOB ストレージ
  • 資格情報 - 認証に使用されます
// Create a QuantumJobClient
var subscriptionId = "your_subscription_id";
var resourceGroupName = "your_resource_group_name";
var workspaceName = "your_quantum_workspace_name";
var location = "your_location";
var storageContainerName = "your_container_name";

var credential = new DefaultAzureCredential(true);

var quantumJobClient =
    new QuantumJobClient(
        subscriptionId,
        resourceGroupName,
        workspaceName,
        location,
        credential);

コンテナー SAS URI を取得する

データを格納するストレージ コンテナーを作成します。

// Get container Uri with SAS key
var containerUri = (quantumJobClient.GetStorageSasUri(
    new BlobDetails(storageContainerName))).Value.SasUri;

入力データのアップロード

SAS URI を使用して、圧縮された json 入力データを BLOB クライアントにアップロードします。 BLOB ストレージにアップロードする前に、json 入力データを圧縮する必要があることに注意してください。 これには、Quantum Inspired 最適化で使用されるパラメーターが含まれています

string problemFilePath = "./problem.json";

// Get input data blob Uri with SAS key
string blobName = Path.GetFileName(problemFilePath);
var inputDataUri = (quantumJobClient.GetStorageSasUri(
    new BlobDetails(storageContainerName)
    {
        BlobName = blobName,
    })).Value.SasUri;

using (var problemStreamToUpload = new MemoryStream())
{
    using (FileStream problemFileStream = File.OpenRead(problemFilePath))
    {
        // Check if problem file is a gzip file.
        // If it is, just read its contents.
        // If not, read and compress the content.
        var fileExtension = Path.GetExtension(problemFilePath).ToLower();
        if (fileExtension == ".gz" ||
            fileExtension == ".gzip")
        {
            problemFileStream.CopyTo(problemStreamToUpload);
        }
        else
        {
            using (var gzip = new GZipStream(problemStreamToUpload, CompressionMode.Compress, leaveOpen: true))
            {
                byte[] buffer = new byte[8192];
                int count;
                while ((count = problemFileStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    gzip.Write(buffer, 0, count);
                }
            }
        }
    }
    problemStreamToUpload.Position = 0;

    // Upload input data to blob
    var blobClient = new BlobClient(new Uri(inputDataUri));
    var blobHeaders = new BlobHttpHeaders
    {
        ContentType = "application/json",
        ContentEncoding = "gzip"
    };
    var blobUploadOptions = new BlobUploadOptions { HttpHeaders = blobHeaders };
    blobClient.Upload(problemStreamToUpload, options: blobUploadOptions);
}

ジョブを作成する

問題の定義を Azure Storage にアップロードしたので、 を使用 CreateJob して Azure Quantum ジョブを定義できます。

// Submit job
var jobId = $"job-{Guid.NewGuid():N}";
var jobName = $"jobName-{Guid.NewGuid():N}";
var inputDataFormat = "microsoft.qio.v2";
var outputDataFormat = "microsoft.qio-results.v2";
var providerId = "microsoft";
var target = "microsoft.paralleltempering-parameterfree.cpu";
var inputParams = new Dictionary<string, object>() { { "params", new Dictionary<string, object>() } };
var createJobDetails = new JobDetails(containerUri, inputDataFormat, providerId, target)
{
    Id = jobId,
    InputDataUri = inputDataUri,
    Name = jobName,
    InputParams = inputParams,
    OutputDataFormat = outputDataFormat
};

JobDetails myJob = (quantumJobClient.CreateJob(jobId, createJobDetails)).Value;

ジョブの取得

GetJob は、その ID で特定のジョブを取得します。

// Get the job that we've just created based on its jobId
myJob = (quantumJobClient.GetJob(jobId)).Value;

ジョブを取得する

ワークスペース内のすべてのジョブを列挙するには、 メソッドを GetJobs 使用します。

foreach (JobDetails job in quantumJobClient.GetJobs())
{
   Console.WriteLine($"{job.Name}");
}

トラブルシューティング

すべての Quantum ジョブ サービス操作は、役に立つ ErrorCodes を使用して失敗した場合に RequestFailedException をスローします。 これらのエラーの多くは回復可能です。

次のステップ

共同作成

このライブラリのビルド、テスト、および投稿の詳細については、 CONTRIBUTING.md を参照してください。

このプロジェクトでは、共同作成と提案を歓迎しています。 ほとんどの共同作成では、共同作成者使用許諾契約書 (CLA) にご同意いただき、ご自身の共同作成内容を使用する権利を Microsoft に供与する権利をお持ちであり、かつ実際に供与することを宣言していただく必要があります。 詳細については、 https://cla.microsoft.com を参照してください。

このプロジェクトでは、Microsoft オープン ソースの倫理規定を採用しています。 詳しくは、「Code of Conduct FAQ (倫理規定についてよくある質問)」を参照するか、opencode@microsoft.com 宛てに質問またはコメントをお送りください。

インプレッション数