Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ゼロから始めるQ#

551 views

Published on

福岡.NET Conf 2018のセッション資料

Published in: Technology
  • Be the first to comment

ゼロから始めるQ#

  1. 1. ゼロから始めるQ# .NET Conf 福岡 2018/09/29 @tanaka_733
  2. 2. 自己紹介 Software Maintenance Engineer @ Red Hat K.K. ◦ OpenShift, Red Hat on Azure/Azure Stack, .NET Core/SQL Server on RHEL Microsoft MVP for Azure (2018 Jul- ) ◦ 今年6月までは MVP for VSDT (旧C#, ,NET)でした ソーシャル活動 ◦ Twitter: @tanaka_733 ◦ Blog: 銀の光と碧い空 ◦ Blog: Red Hat Developers
  3. 3. 九州でQ#
  4. 4. 今日のテーマ Microsoftがリリースした 量子コンピューター向けプログラミング言語Q#を使ってみよう ◦ 資料は多めなので、 目標: Visual Studio or Visual Studio Code を使って プロジェクトを作成してQ#プログラムを実行できるようになる 最初の10分 : 量子コンピューティングとQ#概要 次の15分 : Q#プロジェクトと文法概要 最後の 5分 : Quantum Katas紹介
  5. 5. なぜ量子コンピューターに興味が? 大学院時代: ◦ 博士論文(物理学)で希釈冷凍機温度(10mK)で動く超低温MRIを開発 ◦ というわけでそれなりに量子力学をやっていた (物理学から離れて約10年) 昨年のIgnite: ◦ 量子コンピューティングに力を入れていくということと、Q#が発表される ◦ JAZUGでのLT資料 ◦ 希釈冷凍機が展示されていたこともあり、なつかしさからQ#を始めてみる ◦ 量子コンピューターのコミュニティに参加してみる
  6. 6. Microsoft Quantumの 実例
  7. 7. 先進的なMRI研究への適用事例(意訳) Case Western Reserve UniversityとMicrosoft Quantumチームが協力 ガン性腫瘍の検知において量子アルゴリズムを利用 MRI画像診断の正確性向上、時間短縮のためMRF(Magnetic resonance fingerprinting)の利用を検討 MRIでは画像を構築して診断するが、MRFでは最適化したパルス列から単一の値を 測定できる。 量子アルゴリズムにより、最適化したパルス列を効率よく見つけたい 現状ではAzure上でのSimulatorで計算している スキャンした画像をHoloLensで可視化もしている https://blogs.microsoft.com/blog/2018/05/18/microsoft-quantum- helps-case-western-reserve-university-advance-mri-research/
  8. 8. 量子コンピューティング入門 Q#をはじめるために必要そうなことをざっくりと
  9. 9. 参考資料 QiitaファンミーティングLT: 量子コンピュータはじめました ◦ https://qiita.com/gyu-don/items/7d8e41b7653257ed4b46 量子コンピュータアプリ 勉強会オンラインコミュニティ ◦ connpassにて勉強会情報が載っています(週1回以上の高頻度) ◦ Slackがあるので、物理的に参加できない人も議論できます (福岡で開催したこともあるとのこと) ◦ https://qnn.connpass.com/ ◦ #microsoft-q-sharp というチャネルに過去の資料がリンクされています 私の発表資料 ◦ 5分でわかった気にさせないMicrosoft Quantum (JAZUG LT) ◦ https://www.slideshare.net/tanakata/microsoft-quantumn-in-5-mins ◦ 量子コンピューターを支える物理を覗いてみよう (JAZUG) ◦ https://www.slideshare.net/tanakata/20171219-84443097 ◦ 量子コンピューター向け冷凍機について ◦ https://www.slideshare.net/tanakata/ss-88589352 ◦ マヨラナ粒子によるスケーラブルな量子コンピューターの設計 ◦ https://www.slideshare.net/tanakata/ss-91004676
  10. 10. 量子コンピューターは大きく2種類ある 量子アニーリング方式と量子ゲート方式 ◦ 目的やいまできること、将来できるようになることも全然違う ◦ 量子アニーリングのほうが実用化が進んでいる ◦ マイクロソフトがやりたいのは量子ゲート方式の方 ◦ 目に見える範囲では量子アニーリングはやっていない ◦ Q#が扱うのも量子ゲート方式 巷の記事では混同して使われることも多いので注意 ◦ 区別して使ったほうがいろいろわかりやすくなるはず ◦ わざと混同して自分に有利になるようにする人もいるので……
  11. 11. Credits; Eric Brown, Creative Destruction Lab https://www.bohr.technology/blog/quantum-computing-landscape-july-2018
  12. 12. 量子ゲート方式 従来のコンピューターを発展させたもの ➔従来のプログラミング言語の拡張としてQ#を導入した 量子ビットを重ね合わせて計算、処理出来るデータ量が指数的に増大 実用化はまだ。動くものはあるけど、驚くほど役に立たないレベル。 ◦ 実用化できれば従来のスパコンを超えるといわれている 大手IT企業が開発を進めている ◦ IBM: IBM Qとしてすでに一般の人でもさわれるものを提供している ◦ Google: 論文などでは開発が進んでいることを示している ◦ Microsoft: 目に見える進捗としては出遅れている感じ。商用利用は一番乗りできるといっている ◦ そのほかの企業や大学の研究室も開発中
  13. 13. 量子ゲート方式 従来のコンピューターではビット(Bit): 0か1 これに論理ゲート(NOTとかANDとか)をかけて計算 量子コンピューターでは 量子ビット(Qubit): 0と1の重ね合わせ ◦ 実際には波の重ね合わせなので 振幅と位相を持つ ➔ Bloch球で表現できる ◦ https://docs.microsoft.com/en-us/quantum/quantum-concepts-4-qubit?view=qsharp-preview ◦ https://en.wikipedia.org/wiki/Bloch_sphere 量子ビットの状態はベクトルで、ゲート操作はテンソル積で表現できる
  14. 14. ブラケットとテンソル積 ◦ https://docs.microsoft.com/ja-jp/quantum/quantum-concepts-4-qubit?view=qsharp-preview ◦ https://docs.microsoft.com/ja-jp/quantum/quantum-concepts-5-multiplequbits?view=qsharp-preview ◦ https://docs.microsoft.com/ja-jp/quantum/quantum-concepts-6-diracnotation?view=qsharp-preview 𝛼 𝛽 = 𝛼 1 0 + 𝛽 0 1 = 𝛼ȁ ۧ0 + 𝛽ȁ ۧ1 1量子ビット 2量子ビット 𝛼 𝛽 ⊗ 𝛾 𝛿 = 𝛼𝛾 𝛼𝛿 𝛽𝛾 𝛽𝛿 = 𝛼𝛾ȁ ۧ00 + 𝛼𝛿ȁ ۧ01 +𝛽𝛾ȁ ۧ10 +𝛽𝛿ȁ ۧ11
  15. 15. 量子ビット操作 (物理的に存在する)量子ビットに対して物理的に実現可能な操作をいくつか用意する 量子ビットを行列(1次元なのでベクトルでもある)と見たとき、 この操作はユニタリ行列として表現できる 2量子ビットに対するCNOTゲート 量子ビットの数が増えるとそのぶん行列の次数が増えていき、記述が面倒だしわかりづらい そのため、 ȁ ۧ00 といったDirc記法を使うことがおおい 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
  16. 16. 量子コンピューター 量子ビットにゲート操作を行い、最終的に測定を行なって結果を取得 結果は波動関数により取得される。また、測定すると量子ビットの状態が変化する。 Qubitを操作する量子ゲートを多数用意しないといけない ◦ 制御できる量子ゲートを何個用意できるか ◦ ➔ あるところで従来のスパコンを超えることができるといわれている ◦ あわせてエラー制御などの仕組みも必要 超低温(10mK程度)下で量子ゲートを操作するのが現実的 (現時点では) ◦ この超低温を連続的に維持できるのが希釈冷凍機=Igniteで展示されていてやつ 理想的な量子コンピューターは、既存のコンピューターの完全上位互換になるはずだが お互いの得意な部分を組み合わせて使うほうがより早く実用化しそう
  17. 17. トポロジカル量子コンピューター Qubitや量子ゲートをどのような物質で実現するかは多数の方法が提唱されている Microsoftが実現しようとしているのが「トポロジカル量子コンピューター」 超伝導物質中に存在するといわれるマヨラナフェルミオンを用い、 トポロジカルという数学の概念を導入して、 量子ビットとゲート操作を実装する Q#のコードを書く上では、ここまでは知らなくてもいい。 ➔ .NET が動くなら、実行されるOSがWindowsでもmacでもLinuxでも気にすることなく C#を書けばいいよね。と似たイメージ ➔ Driverさえかけば、ほかの量子ゲートマシンでも動く可能性はある
  18. 18. 量子コンピューターモデル
  19. 19. 量子コンピューターモデル エラー訂正処理(今回は説明割愛)や 論理量子ビットを物理量子ビットに対応など Q#で表現する量子ビット(Qubit)がそのまま量子コンピューター上の 1量子ビットに対応するわけではない。 エラー訂正などのため複数物理量子ビットで1論理ビットを表す。 室温系と低温系の橋渡し トポロジカル超伝導体の デバイスを操作・測定する信号制御
  20. 20. Q#をはじめるにあたって 0か1の値の重ね合わせで表現されるQubitの集合を扱う Qubitの配列への操作をQ#で記述する ◦ bit配列への操作をプログラミングしていくイメージ ◦ Q#のライブラリには複数の操作を組み合わせた抽象度の高い処理もあるけど、今回は触れ ません 量子コンピューターの制約により、Q#でできない処理もある ◦ 任意のQubitの状態を作れるわけではない ◦ 0で初期化し、操作を加えることでほしい状態を生成する ◦ 測定するとQubitの状態が変わる (リセットされる) ◦ Qubitの状態を複製できない
  21. 21. Q#入門
  22. 22. Q#とは 量子コンピューティングのためのスケーラブルでマルチパラダイムでドメイン特化した言語 ◦ 関数型と命令型のマルチパラダイム 文法的にはC#やJavaに似たような構造 ◦ F#およびほかの関数型言語のキーワードも導入している 量子機械の上での操作を記述できる ◦ 抽象化の度合いや、シミュレーターから実機まで幅広く対象とする ◦ 数百Qubit程度の小さいマシンから百万Qubitオーダーまで対象とする (実機がまだ存在しないが) デバッグやプロファイル、利用リソースの推定や特定の目的のためのシミュレーション実行など 幅広く対象としている https://docs.microsoft.com/en-us/quantum/quantum-techniques-1- qsharp_filestructure?view=qsharp-preview
  23. 23. Q#開発の準備 Visual StudioかVisual Studio CodeでQ#を動かしてみよう! 必要なもの ◦ .NET Core が動くOS ◦ 初期のQ#では新し目のCPUが必須だったが、今はOK ◦ Visual Studio or Visual Studio Code ◦ Q#開発キット https://docs.microsoft.com/en-us/quantum/quantum- installconfig?view=qsharp-preview&tabs=tabid-vs2017
  24. 24. はじめてのQ#プロジェクト https://docs.microsoft.com/en-us/quantum/quantum- writeaquantumprogram?view=qsharp-preview&tabs=tabid-vs2017 $ dotnet new console ¥ -lang Q# --output Bell
  25. 25. Q#プロジェクトの構造 すべてのファイルを表示
  26. 26. Q#プロジェクトの構造 すべてのファイルを表示 Q#ソースファイル (qs) エントリポイント(Mainメソッド)を持つ C#ソースファイル Q#コンパイルコマンド結果 Q#ソースをC#にコンパイルした 中間ファイル(g.cs) Q#コンパイルコマンド詳細
  27. 27. Q#ソースのコンパイル qsファイル g.csファイル dll
  28. 28. Q#ソースのコンパイル qsファイル g.csファイル dll Q#開発キットでインストールされるバイナリを利用して dotnet qsc.dll … でコンパイル 通常のC#プロジェクトとしてコンパイル プロジェクトのビルドを明示的に行って Q#をコンパイルしないと C#コード側は変更を認識できない
  29. 29. Q#プロジェクト Internal 作成されたプロジェクトは普通のC#プロジェクトにQ#SDKが参照されているもの ◦ .NET Core 2.0 (netcoreapp2.0) Q#のソースはC#(g.cs)にいったんコンパイルされる ◦ WPFとかSilverlightのXAMLやASP.NETのcshtmlと同じイメージ ◦ ただし、プロジェクトのビルド時にしかビルドされない (コード編集中に自動ビルドされない) ◦ NuGetで配られる microsoft.quantum.development.kit の中にビルド定義があり、 プロジェクトのビルド時にトリガーされる == .NET Core標準の仕組みを利用 Q#コードの支援機能はない ◦ C#(Roslyn)のような Intellisence はおろか、コードフォーマットもない。つらい。 というのを頭に入れておくと、Q#コード書くときに(C#との感覚の違いがわかって)便利かも
  30. 30. Q. うまくコンパイルできないのですが? "QS0001 Internal error: Parsing produced an error node without logging an error“ という実質役に立たないメッセージしかでないのですが!!!111 (他にも同様の役立たずメッセージあり) A. 文法ミスがあるはずなので、がんばってコンパイルエラーを解消しましょう… Feedbackに登録されている通り、文法エラーのメッセージが不親切極まりないです あと、ドキュメントに書かれているサンプルが正しくないことがあります… C#のようなコーディング支援もないので、いまのところは気合と根性でがんばりましょう
  31. 31. Q#の文法 - ファイル構造 以下、記載のコードはQ# documentから引用 および一部改変 https://docs.microsoft.com/en-us/quantum
  32. 32. Q#の文法 - ファイル構造 名前空間の定義 他の名前空間の参照 (C#のimport) Operationの定義 Operationの引数 Operationの返り値の型
  33. 33. OperationとFunction Operation: 量子操作。副作用を伴う。 Function: 量子操作を行わない数値計算 voidに相当 引数と返り値の型の実体はTuple 返り値の型が()の場合に return文を記述する場合は return (); 組み込み済みの型については後で variantについては今日は省略
  34. 34. 3種類の制御構文 ◦ if…elif…else 文 ◦ elseじゃなくてelif ◦ forループ ◦ C#のforeachに相当 ◦ ループの変数を事前に定義する必要なし ◦ repeat-untilループ ◦ 今回は省略 ◦ Do-while文で、条件判定に複数の文が 記述できるイメージ ◦ 「当たるまで引けば当たる」
  35. 35. repeat-until (RUS)
  36. 36. First-Class Valueとしての OperationとFunction OperationやFunctionそのものを引数や返り値にできる ◦ 関数ポインタあるいはAction<T>, Function<T>なイメージ ◦ 見た目はラムダ式っぽい
  37. 37. OperationやFunctionの部分適用 引数に _ を指定することで、部分適用された関数を定義でき、関数の返り値にもできる
  38. 38. ローカル変数(letとmutable) letもしくはmutableで定義。letは変更不可、mutableは可能な変数に使う。
  39. 39. ローカル変数(letとmutable) letもしくはmutableで定義。letは変更不可、mutableは可能な変数に使う。 C#のvarと同じく 右辺の型推論で 変数の型が決まる 配列をmutableで宣言すると要素もmutable For文のindexは変数宣言不要 +=は使えない
  40. 40. ローカル変数(タプル) 任意のタプルに名前を付けて新しい型として定義できる
  41. 41. 型モデル Primitive ◦ Int 2, -107, 49 (64bit) ◦ Double 0.0, -43.2, 5e-7 ◦ Bool true, false ◦ Pauli PauliI, PauliX, PauliY, PauliZ ◦ Result Zero, One (測定結果を表現) ◦ Range 1..10, 5..-2..1 (start..step..end なので 5,3,1) ◦ String “qsharp” (ログメッセージに利用) ◦ Qubit Tuple (Int, (Qubit, Qubit)) 配列 [1; 4], new Int[13] Operation & Function型 ユーザー定義型 newtype Complex = (Double, Double); C#でいう暗黙的な型変換はない。 Microsoft.Quantum.Extensions.Convert 以下 のFunctionを使って明示的に変換しないといけない
  42. 42. Qubitの割り当て usingブロックを利用 (C#のusingと同じイメージ)
  43. 43. Qubitの割り当て usingブロックを利用 (C#のusingと同じイメージ) 5個のQubitを |0> で初期化 ➔ |00000> この変数も事前の定義不要 usingを抜ける際にQubitは リセットされないといけない。 測定もしくはリセットする
  44. 44. Qubitの操作 bool配列と初期化されたQubit配列を受け 取って、i番目の要素がtrueであればQubit を|1>に変化させるOperation
  45. 45. Qubitの測定
  46. 46. Qubitの測定
  47. 47. ログとデバッグ
  48. 48. ログとデバッグ メッセージを出力 デフォルトではコンソールに出力 生成された全量子ビットの状態を出力。 引数にファイル名指定。 空文字指定でコンソールに出力 処理の失敗 例外スローに似ている string interpolationもOK $”start {i}”
  49. 49. C#側のコード 現状シミュレーターのみが利用可能。 Q#のOperationがクラスとして参照できるので、Runで実行しTask<T>を取得する
  50. 50. もっとQ#
  51. 51. Q# をはじめてみよう(おさらい) まずは Q# ドキュメントを読む ◦ 量子コンピューティング概念 ◦ 量子コンピューター初めての人におすすめ ◦ インストール ◦ Q#開発基礎  今回の資料の大半はここ ◦ Q#標準ライブラリ ◦ 標準ライブラリに入っている操作の説明など。利用可能なゲートなども把握できる ◦ Q#プログラミング言語
  52. 52. Q#を実際に使ってみる QuantumKatas: ハンズオンに使われたチュートリアル集 ◦ https://github.com/Microsoft/QuantumKatas SDKとexamplesのGitHubリポジトリ: Q# Coding Contest: ◦ 7月に行われたQ#によるプログラミングコンテスト ◦ Warmup roundと本戦があり、解説公開ずみ ◦ こんなの来週やります@東京 ➔
  53. 53. うまくいかないときは 先ほど紹介したSlackなどに相談してみましょう ◦ stackoverflowやteratailでもあまり質問をみないので... ◦ Twitterでメンションしてもらえれば、Best Effortでがんばります 使い勝手が悪いとか、明確にバグとわかればフィードバックサイトへ https://quantum.uservoice.com/ ドキュメントについてはコメントのみ可能 ◦ 例: https://docs.microsoft.com/en-us/quantum/quantum-techniques-3- localvariables?view=qsharp-preview
  54. 54. Q#の今後 年内にはfirst qubitが発表できる(らしい) ローカルのシミュレーターで30Qubit程度 Azure シミュレーターで40Qibit程度が目標 5年以内に商用のためのアルゴリズムを動かせる マシンを用意したい(らしい) Empowering the quantum revolution with Q# : Build 2018 https://www.youtube.com/watch?v=S_Z GWmyPp7g
  55. 55. まとめ Visual StudioかVisual Studio Codeが動く環境があれば、今すぐQ#をはじめられる 量子コンピューターの原理は物理学や数学を知らないといけないが、 Q#はそこまで知らなくともはじめられる C#(やJava)に似た構造なので、比較的とっつきやすい(はず) Quantum KatasやCoding Contestなど実際に解いて学ぶ環境も増えてきた
  56. 56. 参考リンク Microsoft Quantum ◦ 公式ページ: https://cloudblogs.microsoft.com/quantum/ ◦ Quantum Development Kit: https://www.microsoft.com/en-us/quantum/development- kit ◦ 開発用ドキュメント: https://docs.microsoft.com/en-us/quantum/?view=qsharp-preview 学習リソース ◦ SDKとサンプルのリポジトリ: ◦ Quantum Katas: https://github.com/Microsoft/QuantumKatas ◦ Q# Coding Contest (warm up) ◦ Q# Coding Contest
  57. 57. 参考リンク Q#の設計を学術的に知りたい人向け ◦ Q#: Enabling scalable quantum computing and development with a high-level domain- specific language https://www.microsoft.com/en-us/research/publication/q-enabling-scalable-quantum- computing-and-development-with-a-high-level-domain-specific-language/ ◦ Programming Quantum Computers Using Design Automation https://www.microsoft.com/en-us/research/publication/programming-quantum- computers-using-design-automation/ MRFの学術的背景を知りたい人向け ◦ https://www.nature.com/articles/nature11971 ◦ http://case.edu/mrf/ ◦ Magnetic resonance fingerprintingとその最新動向 : http://www.innervision.co.jp/sp/ad/suite/siemens/technical_notes/1511techinfo ◦ 最新の高速撮像技術─fingerprinting─: http://www.innervision.co.jp/ad/suite/siemens/technical_notes/160976

×