qiskit-machine-learningの環境構築+unittestを動作させる

qiskit-machine-learningの環境構築+unittestを動作させる

qiskit-machine-learning

主に量子機械学習系のライブラリが置かれている。

https://github.com/Qiskit/qiskit-machine-learning

quantum-kernelを自前で実装してた方が何かと都合が良かったので動作確認をしながら(参考にする)ために、環境構築をした。

環境情報

ローカルの環境

Python 3.9.10
pip 22.1.2 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)

環境構築の際に使用したコマンド

git clone git@github.com:Qiskit/qiskit-machine-learning.git
cd qiskit-machine-learning
pip3 install -r requirements-dev.txt
pip3 install .

テストの実行

全体テストの実行

テストを実行してみる(実行時間が長いので動くことを確認したら打ち切る):

python3 -m unittest discover -v test

単一ファイルテストの実行

PythonのStandard Libraryにunittestという標準テストランナーがありそれが使用されている。

https://docs.python.org/3.6/library/unittest.html#module-unittest

具体例にもある通り、以下のコマンドで実行できる:

python -m unittest tests/test_something.py

quantum_kernelのテストっぽいファイルを見つけ出し実行してテストが通ることを確認できた:

> python3 -m unittest test/kernels/test_qkernel.py
...........................
----------------------------------------------------------------------
Ran 27 tests in 2.686s

OK

Quantum Kernelの実装詳細

kernelの評価関数のインターフェース

x_vecy_vecを受け取ってkernelを返却している:

def evaluate(self, x_vec: np.ndarray, y_vec: np.ndarray = None) -> np.ndarray:

kernelの初期化

kernel = np.zeros((x_vec.shape[0], y_vec.shape[0]))

量子回路の実行部分

量子回路を動かしている部分はここ。引数で受け取ったx_vecy_vecをそれぞれ量子回路にかけて内積を取得して結果を取得している。これを繰り返して量子カーネルを生成して返却するようになっている模様:

for idx in range(0, len(mus), self._batch_size):
    to_be_computed_data_pair = []
    to_be_computed_index = []
    for sub_idx in range(idx, min(idx + self._batch_size, len(mus))):
        i = mus[sub_idx]
        j = nus[sub_idx]
        x_i = x_vec[i]
        y_j = y_vec[j]
        if not np.all(x_i == y_j):
            to_be_computed_data_pair.append((x_i, y_j))
            to_be_computed_index.append((i, j))

    circuits = [
        parameterized_circuit.assign_parameters(
            {feature_map_params_x: x, feature_map_params_y: y}
        )
        for x, y in to_be_computed_data_pair
    ]
    if self._quantum_instance.bound_pass_manager is not None:
        circuits = self._quantum_instance.transpile(
            circuits, pass_manager=self._quantum_instance.bound_pass_manager
        )

    results = self._quantum_instance.execute(circuits, had_transpiled=True)

終わりに

自作する際もこの関数のインターフェースを合わせながら実装する予定。

学んだポイント

  1. 環境構築: requirements-dev.txtを使った開発環境のセットアップ
  2. テスト実行: unittestモジュールによる単体テストと統合テストの実行方法
  3. 実装理解: quantum kernelの評価関数の仕組みとバッチ処理
  4. インターフェース設計: 既存ライブラリとの互換性を保つ設計の重要性

量子機械学習ライブラリの内部実装を理解することで、独自のquantum kernel実装に向けた知見を得ることができた。