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_vec
とy_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_vec
とy_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)
終わりに
自作する際もこの関数のインターフェースを合わせながら実装する予定。
学んだポイント
- 環境構築:
requirements-dev.txt
を使った開発環境のセットアップ - テスト実行: unittestモジュールによる単体テストと統合テストの実行方法
- 実装理解: quantum kernelの評価関数の仕組みとバッチ処理
- インターフェース設計: 既存ライブラリとの互換性を保つ設計の重要性
量子機械学習ライブラリの内部実装を理解することで、独自のquantum kernel実装に向けた知見を得ることができた。