{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "tcLyUtUqhkTr" }, "source": [ "# 5-OpenJij GPU" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "view-in-github" }, "source": [ "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/OpenJij/OpenJijTutorial/blob/master/source/ja/005-OpenJijGPU.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> (追記: 2021/05)このセクションは2021/05 現在、サポートされていません。次の章へ進むことをおすすめします。" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Vrd0CwLJhvVQ" }, "source": [ "このセクションではGPUを用いてSimulated Quantum Annealing(SQA)を行う方法をご紹介します。\n", "\n", "## Google Colabでの設定とインストール\n", "\n", "一般のPCにはCUDA環境が整っていない、もしくはCUDAに対応するNVIDIAのGPUが搭載されていないこともあります。しかし**Google colaboratory**を使えば誰でもGPGPUを使うことができます。\n", "\n", "### GPU設定\n", "\n", "GPU実行したいJupyter NotebookをGoogle Colabで開きます。 \n", "\n", "```\n", "ランタイム > ランタイムのタイプを変更 > ハードウェアアクセラレータをGPUに選択\n", "```\n", "\n", "この設定を行うことでGPUを用いたJupyter Notebookの実行が可能となります。\n", "\n", "### OpenJijのインストール\n", "\n", "OpenJijからGPUを用いたモジュールを呼び出すためには、まずpipからのインストールの際にOpenJijをソースコードからビルドする必要があります。\n", "この操作のためにCMakeと呼ばれるツールが必要ですが、Google ColabにプリインストールされているCMakeは古いバージョンです。まずはそれをバージョンアップしましょう。" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 173 }, "colab_type": "code", "id": "o8UaiBs1hkwh", "outputId": "3a0075b7-00ea-4cad-9ff1-47b0965e833f" }, "outputs": [], "source": [ "!pip install -U cmake" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "-DuFQsPK90LI" }, "source": [ "その後、OpenJijをインストールし直します。一度アンインストールしてから、ソースコードからビルドするオプションである `--no-binary :all:`をpipに付け加えてインストールします。\n", "インストールにはしばらく時間がかかります。\n", "> 通常pipは一度インストールしたことのあるアプリケーションであればキャッシュからデータを取ってきてしまうので、それも無効化する `--no--cache-dir`もつけます。初めてOpenJijをインストールする際にはこのオプションは不要です。" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 377 }, "colab_type": "code", "id": "s1pjFhAa95Zs", "outputId": "e398ccc6-abca-420b-8e9b-0626ab3283bc" }, "outputs": [], "source": [ "!pip uninstall openjij -y\n", "!pip install openjij --no-binary :all: --no-cache-dir" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "JMgqfmZ-h8X3" }, "source": [ "## GPUSQA計算\n", "\n", "OpenJijのGPUでサポートしているのはキメラグラフ上でのモンテカルロ計算です。 \n", "まずは GPUSQASampler のインスタンスを作ります。\n", "もし、GPU関連のモジュールが見つからないとエラーが出た際には、以前のバージョンが読み込まれている可能性があるので、一度再起動するといいかもしれません。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": {}, "colab_type": "code", "id": "TYhWp0eqh3Yb" }, "outputs": [], "source": [ "import openjij as oj\n", "\n", "sampler = oj.GPUChimeraSQASampler(num_reads=100, unit_num_L=2)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "oOmEWWBxh_3O" }, "source": [ "ここで `unit_num_L` はキメラユニットセルが並ぶ2次元格子の1辺の長さを指定します。 \n", "上の例では 2×2=4つのキメラユニットセルが並んでいる系を作成しています。キメラユニットセルは8bitで1つを構成しているため、総ビット数は\n", " \n", "${\\rm total\\_num} = {\\rm unit\\_num\\_L}^2 \\times 8$\n", "\n", "のように計算されます。\n", "\n", "GPUSQASamplerでは、のちに sample_qubo などで少ない変数を指定しても、ここで作ったキメラグラフの系のサイズだけSQA計算を行います。 \n", "`unit_num_L`は無駄に大きすぎないように注意しましょう。また`unit_num_L`はコンストラクタで指定しなくても、`sample_qubo`を実行するときの引数としても指定できます。\n", "\n", "## 実行\n", "\n", "ではSQAを実行してみましょう。これまで紹介してきたSamplerと同様に、sample_qubo (or sample_ising) で計算を行うことができます。\n", "ただし、キメラグラフを満たさない添字の相互作用を指定するとエラーになります。" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "colab_type": "code", "id": "_XIsZ9z2h_Rv", "outputId": "be24e99d-b0b9-4766-c686-815ca027694c" }, "outputs": [ { "data": { "text/plain": [ "Response(rec.array([([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1),\n", " ([1, 1, 1, 0], -2., 1), ([1, 1, 1, 0], -2., 1)],\n", " dtype=[('sample', 'i1', (4,)), ('energy', '