5-OpenJij GPU

Open in Colab

OpenJijでは現在(0.0.6)キメラグラフ構造のみGPUでのSQAに対応しています。

このセクションではGPUでSQAを行ってきます。

一般にPCにはGPGPUは載っていないのでこのノートブックは実行できないことが多いかもしれませんが、Google colaboratory を使えば誰でもGPGPUを使うことができます。

このノートブックを Google colaboratory で開いて、

ランタイム -> ランタイムのタイプを変更 -> ハードウェアアクセラレータをGPUに選択

を行います。そのあとにopenjijをインストールすればGPU向けのコンパイルが行われるのでGPUのSamplerが使えるようになります。

[1]:
!pip install openjij
!pip show openjij  # openjij == 0.0.6 を仮定します
Requirement already satisfied: openjij in /usr/local/lib/python3.6/dist-packages (0.0.6)
Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from openjij) (1.16.3)
Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from openjij) (2.21.0)
Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->openjij) (1.24.3)
Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->openjij) (2.8)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->openjij) (3.0.4)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->openjij) (2019.3.9)
Name: openjij
Version: 0.0.6
Summary: Framework for the Ising model and QUBO
Home-page: https://openjij.github.io/OpenJij/
Author: Jij Inc.
Author-email: openjij@j-ij.com
License: Apache License 2.0
Location: /usr/local/lib/python3.6/dist-packages
Requires: requests, numpy
Required-by:

キメラグラフ

OpenJijのGPUではキメラグラフのみが扱えます。
キメラグラフは以下の画像のような形です。

キメラグラフを満たさない添字の相互作用を指定するとエラーになります。 GPUSQASampler では

  • キメラグラフのノードに一つずつ番号をつけた添字

が使えます。

早速具体的なコードをみてみましょう。

まずは GPUSQASampler のインスタンスを作ります。

[ ]:
import openjij as oj

sampler=oj.GPUSQASampler(iteration=100, unit_num_L=2)
ここで unit_num_L はキメラユニットセルが並ぶ2次元格子の1辺の長さを指定します。
unit_num_L=2では 2×2=4つのキメラユニットセルが並んでいる系を作ることになります。

GPUSQASampler では のちに sample_qubo などで少ない変数を指定しても、 ここで作ったキメラグラフの系のサイズだけ SQAを回すので unit_num_Lは無駄に大きすぎないようにしてください。

またunit_num_Lはコンストラクタで指定しなくても、sample_quboを実行するときに引数に指定できます。

ではSQAを回してみましょう。他のsampler と一緒で sample_qubo (or sample_ising) でOKです。

[3]:
Q = {(0, 4): -1, (0, 5): -1, (4, 12): 1}
response = sampler.sample_qubo(Q)
response
[3]:
iteration : 100, minimum energy : -2.0, var_type : BINARY
indices: [0, 12, 4, 5]
minmum energy state sample : [1, 0, 1, 1]