DGX Spark を買いました。かわいいね
DGX Spark は、NVIDIA GPUと結構デカいUnifiedメモリを積んだ小型スパコンです。
会社マネーではなく、完全に自費で買っています。個人事業主じゃないので経費にもなりません。ボーナスが吹き飛びました。助けてください。
普通はAIのために使うのですが、量子回路動かしたいですよね?
Qiskitでつながるリモート量子回路シミュレーター
普通に DGX Spark に画面繋いだり SSH で繋いで、直接、シミュレーターを動かしてもいいのですが、リモートで動かした方が、自分だけのクラウド量子コンピューターを持っている感が出て盛り上がります。
とはいえ、そういう仕組みを完全に自作するのは大変です。既存の仕組みに乗っかりましょう。
qiskit-ibm-runtime を流用する
Qiskit は、 IBM のクラウド量子コンピューターに接続する仕組みを持っています。
qiskit-ibm-runtime ライブラリを使って接続ができます。
Qiskit のクライアント側は、このライブラリを使って接続できる形にしましょう。
一方で、サーバー側のソフトウェアは公開されていないので、自作する必要があります。
幸いにも REST API のドキュメント は公開されており、クライアントライブラリがオープンソースなため、サーバー側のソフトウェアは根性で作れます。いえ、根性がなくても Claude Code で作れます。
仕組みとしては、 qiskit-ibm-runtime が REST API で送るリクエストを受け取って、サーバー側で Qiskit を動かすというものです。
クライアントとサーバーで分けるのを諦めて直接Qiskitを動かした方が確実に楽なのですが、リモートで動かした方が、自分だけのクラウド量子コンピューターを持っている感が出て盛り上がります(再掲)。
サーバー側の実装はこちらに公開しました。
実機パラメーターは、 qiskit-ibm-runtime が用意しているダミーのものを返しています。
ノイズモデルに関するパラメーターも含まれていますが、ノイズなしのシミュレーターを動かした結果を返しています。
接続性 (coupling map) についても、全結合ではなく実機と同じダミーを返しています。それにより通常はクライアント側で適した形にトランスパイルされますが、サーバー側ではチェックしていません。
クライアントパッチの必要性
qiskit-ibm-runtime で提供されている方法では、サーバーの URL を指定しても IBM Cloud の認証が必要だと分かってきました。とてもつらいことです。
有効な crn (AWS でいう arn みたいなやつ) を探すくらいの役割しかしていなさそうなので、そんなんいらんのではという感じです。
とはいえ、 qiskit-ibm-runtime をフォークして自作するのもメンテナンスが面倒なので、通常はユニットテストに用いる方法でパッチを当てて、認証が必要な部分をバイパスします。
qiskit_ibm_runtime.accounts.account.CloudAccount.list_instances, qiskit_ibm_runtime.api.auth.CloudAuth.__init__, qiskit_ibm_runtime.api.auth.CloudAuth.get_headers にパッチが必要でした。
やりたくなかったのですが、仕方ないことです。
ともかく、これにより、Qiskit-aer のシミュレーターをリモートで動かすことが出来るようになりました。
cuStatevec を使う
cuStatevec は、シミュレーターを実装するためのライブラリで、直接使える感じではありません。
Qiskit-aer には cuStatevec を使う実装がありますが、 x86_64 しかビルド済みパッケージがなく、aarch64 の DGX Spark では利用できません。自分でビルドしたらいいのかもしれませんが試していません。
それとは別で NVIDIA が、 cuQuantum Appliance という形で、Qiskit-aer 互換のシミュレーター cusvaer を配布しています。こちらは aarch64 にも対応しているので、それを使うことにしました。
cuQuantum Appliance は、 pip では配布されておらず、Docker イメージで配布 されています。
なので、 Docker 上で、サーバー側のソフトウェアを動かせばいいわけですね。
Qiskit バージョンによるシリアライズ/デシリアライズ互換性の問題を乗り越える
cusvaer の入ったコンテナは、 Qiskit のバージョンが古いです。2025年12月15日時点での最新の Qiskit はバージョン 2.2.3 ですが、cusvaer の Qiskit は、バージョンが 1.4.5 でした。
クライアント側の Qiskit バージョンが新しいと、クライアントが量子回路を最新バージョンのエンコード方式で送信し、サーバーがそれをデコードできないというエラーが発生します。
実は Qiskit は、そのへんはちゃんと考えられており、エンコーディングのバージョンを指定するグローバル変数が用意されています。また、数世代前までなら、古いバージョンのエンコーディングも行えるようになっています。
しかし、 qiskit-ibm-runtime にはバージョンを指定する機能がなく、再びクライアント側にパッチを当てて対応することにしました。ともかく、 QISKIT_QPY_VERSION を 13 にすることで、 Qiskit 2.2.3 でエンコーディングできて Qiskit 1.4.5 でデコード出来るようになりました。
それにより、cuStatevec をリモートで使うことが出来るようになりました。
結果
-
qiskit-ibm-runtime互換の REST API サーバーを自作 - cuQuantum Appliance の Docker コンテナ上でサーバーソフトウェアを起動
- クライアントの
qiskit-ibm-runtimeにパッチをあてる-
CloudAccount,CloudAuth: IBM Cloud へのアクセスをバイパス -
QISKIT_QPY_VERSION:13に設定
-
によって、 DGX Spark 上で cuQuantum を動かし、自分だけのクラウド量子コンピューターもどきを作ることが出来ました。かわいいね。