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.

これからのコンピューティングの変化とこれからのプログラミング at 広島

6,607 views

Published on

最近のコンピューティングの変化と、それがプログラミングにどのようにかかわってくるかをまとめました。

Published in: Software

これからのコンピューティングの変化とこれからのプログラミング at 広島

  1. 1. これからの コンピューティングの変化と これからの プログラミング 2018/6/9 きしだ なおき
  2. 2. 自己紹介 ● きしだ なおき ● LINE Fukuokaで働いています ● プログラミング言語は主にJava ● Twitter:@kis
  3. 3. 今日の話 ● プログラマが知っておくこと ● ここ最近の変化
  4. 4. プログラマが知っておくこと
  5. 5. プログラマが知っておくこと ● コンピュータサイエンス – プログラムとはなにか – 広義にはここに挙げてるものを全部含む ● ソフトウェア工学 – プログラムをどう作るか ● アーキテクチャ – プログラムをどう動かすか ● UI/UX – プログラムをどう使うか
  6. 6. コンピュータサイエンス ● 計算理論 ● アルゴリズム ● データ構造 ● ラムダ計算 ● 型理論 ● コンパイラ ● etc…
  7. 7. アーキテクチャ ● プロセッサ ● メモリ ● ストレージ ● ネットワーク
  8. 8. ソフトウェア工学 ● プロジェクト管理 ● プロセス ● 設計手法 ● プログラミング言語 ● テスト
  9. 9. ムーアの法則 ● 18-24ヶ月でトランジスタの数が倍になる ● 寸法半減→スピード2倍、消費電力1/4 https://en.wikipedia.org/wiki/Moore's_law
  10. 10. ムーアの法則の終焉 ● 物理的に配置できない – 5nm=水素原子50個分 ● 電子が漏洩する – 電気を余分に消耗する ● 歩留まりがあがらない – 製造コスト増
  11. 11. 微細化が進んでも今までとは違う ● コストが下がらない ● 低消費電力と高速化を同時に実現できない ● たくさん回路をつんでも、発熱の問題ですべての回路 に電気を流せない – ダークシリコン問題 ● 電力あたりで動かせるトランジスタ数が決まっている
  12. 12. 処理を速くするには ● CPUを載せ換えたら勝手に速くなる時代は 10年以上前に終わった ● 並列度をあげる ● より近いところにデータを置く ● 処理に適した計算ユニットを使う
  13. 13. コンピュータの種類 ● 古典コンピュータ – ノイマン型アーキテクチャ – 非ノイマン型アーキテクチャ ● 量子コンピュータ – 量子アニーリング – 量子ゲート
  14. 14. ノイマン型アーキテクチャ ● メモリから命令をよびだして、命令にしたがっ た回路で処理を行う ● CPU ● GPU
  15. 15. CPU ● 高機能・高性能・高粒度 ● 割り込み、権限制御、仮想化、など実行以外の機能 ● OSが実行できる ● 演算器はコアあたり10個程度 – 一チップに100個程度 ● コアは多くて数十コア ● 明示的にメモリを制御できない – いかにキャッシュに載せるか = いかにメモリをまとめて扱うか
  16. 16. GPU ● GPU – ちょうたくさんコアがある – 同じ処理を行う – 行列計算に向いてる ● GTX 1080Ti – 3584コア!
  17. 17. GPUの構成 ● いくつかのコアでグループを作る – 同時に同じ命令を実行する – グループだけからアクセスできるメモリをもつ ● 明示的にデータを転送する ● コアのグループが多数ある ● コアあたり数個の演算器 – 数千から数万の演算器
  18. 18. 非ノイマン型アーキテクチャ ● ノイマン型では命令の読み込みや解析にトランジス タを使う – 電力を食う – やりたいこと通りに演算器を並べればいいじゃない ● ノイマン型じゃないコンピュータ全体 – FPGA – ニューラルネット型コンピュータ
  19. 19. FPGA ● Field Programmable Gate Array – Field 現場で – Programmable プログラム可能な – Gate 論理素子が – Array いっぱい並んだやつ ● 現場でプログラムできる論理回路
  20. 20. 回路の入出力の組み合わせ 入力 出力 000 0 100 0 010 0 110 1 001 1 101 1 011 1 111 1
  21. 21. LUT(LookUp Table) ● 入出力をあらかじめメモリにもっておく ● 製品としては4入力LUTや6入力LUT 入力 出力 000 0 100 0 010 0 110 1 001 1 101 1 011 1 111 1
  22. 22. 論理ブロック ● Logical Element(LE) Altera ● Logical Cell(LC) Xilinx
  23. 23. 配線 ● 論理ブロックが格子状に配置 ● 周囲に配線 ● アイランドスタイル
  24. 24. 乗算回路とメモリ ● 乗算やメモリを論理ブロックの組み合わせで 実現すると効率がわるい ● 乗算回路やメモリ(SRAM)がのってる – 演算器は数百から数千
  25. 25. FPGAの構成
  26. 26. FPGAなら ● 命令を読み込む必要なく、回路をやりたい 処理のとおり並べることができる
  27. 27. FPGAの利点 ● 命令を読み込む必要がない – 処理を行うまでのタイムラグが少ない ● 低レイテンシ – 命令解析のための回路が不要 ● 余分な回路がないので低消費電力 ● 細かな並列化
  28. 28. ディープラーニング(深層学習) ● 階層の深いニューラルネット ● 最近、人工知能っていわれてるのは、ほぼこれ ● 学習には大量のデータを処理する必要がある ● 計算的には行列の積和演算 – ab+c
  29. 29. 機械学習用演算器 ● Google – Tensor Processing Unit(TPU) ● NVIDIA – Tensor core – 4x4行列積和演算 ● FPGAなら? – ネットワークをそのまま回路にできる(かも)
  30. 30. 量子コンピュータ ● 量子効果を計算原理に使う ● 通常のコンピュータを古典コンピュータという ● 0と1の重ね合わせの状態をもつ – 古典コンピュータは0か1かを状態としてもつ
  31. 31. 量子コンピュータの種類 ● 量子ゲート型 – 量子ビットで論理計算を行う – 8ビットのすべての組み合わせの処理を行うとき ● 古典コンピュータだと256回繰り返すか256回路必要 ● 量子コンピュータだと256パターンの重ね合わせについて一度処理 すればいい ● 量子アニーリング – 量子効果を用いて最適条件を求める
  32. 32. 量子コンピュータの使い道 ● 化学計算 ● 暗号が解読できるかも? ● 機械学習?
  33. 33. 量子耐性暗号 ● 量子コンピュータでも解読されない暗号 ● 格子暗号など
  34. 34. メモリの変化 ● 不揮発メモリ(Non-Volatile Memory:NVM)の 実用化 ● Intelの3D XPointなど – 相変化型メモリ ● DRAMより大容量 ● NANDフラッシュより速い
  35. 35. NVMでどうかわるか ● データベースの高速化 – データベースが不要になる? ● 超省電力コンピュータ – 実行時だけ電気をとおす
  36. 36. データベースとは ● クエリ言語エンジン ● インデクサ ● トランザクション管理 ● ブロック型ストレージ管理 ● クラスタ管理
  37. 37. 言語間でメモリを共有できるか ● NVMに乗せたデータをいろいろな言語で 使いたい ● いちいちシリアライズしたくない ● 言語共通のモデルが必要
  38. 38. GraalとTrufe ● Graal – Javaで書いたJava JITコンパイラ ● Trufe – 構文木処理エンジン – 言語処理が書きやすい – 言語共通オブジェクトモデル ● Object Strage Model(OSM) ● NVMで使うと便利かも
  39. 39. インフラの変化 ● サーバー群の構成の変化
  40. 40. クラウド ● 多数のサーバー ● PaaS(Platform as a Service) ● IaaS(Infra as a Service)
  41. 41. サーバー構成自動化 ● 多数のサーバーを手作業で構築できない ● サーバー構築をスクリプト化する
  42. 42. 仮想化 ● サーバー仮想化 – OSの上で仮想マシンをたてて別のOSを動かす ● ネットワーク仮想化
  43. 43. コンテナ ● サーバー仮想化には目的に対して無駄が多い ● OSカーネルを共通化してファイルパスや ユーザー、ファイルディスクリプタなど サーバーリソースだけ隔離 ● プロセスごとにコンテナ化もできる
  44. 44. マイクロサービス ● サーバーの構成の自由度があがった ● 機能ごとにサーバーを立てれる ● プラットフォームの自由度があがる – 基本はJavaだけど課金管理だけGoで書く、など ● 監視やトレースの重要度は上がる
  45. 45. サーバーレス ● リクエストがきたときだけプロセスが起動 ● つまりCGI ● (アプリケーション)サーバー(プロセス)レス ● メモリ管理や死活管理が不要 ● リソース割り当ての自由度があがる
  46. 46. コンテナオーケストレーション ● 多数のコンテナが必要になる ● コンテナの管理 ● Kubernetes ● 監視やトレースなどを仕込める – 通常はフレームワークごとに設定が必要 ● サーバー構築の自動化からサーバー群構築の自動化へ
  47. 47. ソフトウェア工学的変化 ● ハードウェアやインフラが変化 ● プログラムの作り方も変化
  48. 48. 自動テスト ● 関数単位でプログラマが関数によるテストを 書く
  49. 49. CI ● 継続的インテグレーション – (Continuous Integration) ● ビルドプロセスの自動化 ● 自動テストなどを組み込む ● 頻繁なビルドが可能に
  50. 50. Github ● Git – 分散バージョン管理 ● PullRequestによる機能実装の管理 ● PullRequestを取り込むときにコードレビュー ● GitにcommitがあったときにCIでビルド・テスト ● なんならそのままデプロイ
  51. 51. SRE ● Site Reliability Engineering ● 運用と信頼性向上を行う ● インフラがソフトウェア化 ● 開発作業も自動化 ● 全部プログラマができる
  52. 52. プログラミング言語の変化 ● 開発マシンや開発対象の変化によりプログラミ ング言語にも変化
  53. 53. オブジェクト主体から関数主体へ ● Javaにもラムダが!(Java 8) ● GUIからWebへ – 状態管理からリクエスト管理へ – ステートフルからステートレスへ – オブジェクトから関数へ ● メモリ容量が増える – メモリを使い回す必要がない ● 並列対応 – 値が変わらないことを保証することで、コピーして複数スレッドにばらまける
  54. 54. 型推論の普及 ● Javaにも型推論が!(Java 10) – 正確には いままでないと言われていたのは ローカル変数型推論 ● 型が複雑になり、手書きしにくくなる ● 型理論の進化 ● コンパイルの高速化
  55. 55. 型がなぜ重要か ● B foo(A a) があるとき C baz(A a) を作れる? C bar(B b) – つくれる ● C baz(A a) { return bar(foo(a)) }
  56. 56. カリーハワード同型対応 ● 鮭は魚 があるとき 鮭は泳ぐ といえる? 魚は泳ぐ ● 魚 foo(鮭 a) があるとき 泳ぐ baz(鮭 a)を作れる? 泳ぐ bar(魚 b) ● 型と論理は同型 ● 型によるプログラムは論理の証明
  57. 57. 並列処理対応 ● マイクロサービスや外部サービス連携など サーバー連携の増加 ● 待ち時間の増加 – スレッドが無駄に ● ノンブロッキングによるスレッドの効率利用 ● リアクティブプログラミング
  58. 58. データによるプログラミング ● 機械学習では学習データの質・量が大事 – データをたくさん集める – データを適切に前処理する ● 投入データで同じニューラルネットでも処理が 変わる
  59. 59. ユーザーインタフェースの変化 ● 機械学習による言語処理性能や画像・音声認識 性能の向上でインタフェースにも変化
  60. 60. チャットボット ● LINEなどチャット上での対話によりプログラ ムを実行
  61. 61. 音声インタフェース ● Clova WAVEやAlexa、Google Homeなど音声 で操作できるスマートスピーカの普及 ● 音声で照明やエアコンなどの操作
  62. 62. Virtual Reality ● ヘッドマウントディスプレイでの没入感 ● ジェスチャーによる操作
  63. 63. まとめ ● コンピュータは変わる ● みんなも変わろう

×