---
# System prepended metadata

title: Julia v1.1 on Google Colaboratory
tags: [' Julia', ' 機械学習名古屋', 発表スライド]

---

---
tags: 発表スライド, 機械学習名古屋, Julia
slideOptions:
  transition: slide
  theme: league
---

Julia v1.1 on Google Colaboratory
===
<!-- .element: style="font-size: 300%" -->

<!-- .slide: data-background-color="rgba(102,130,223,0.3)" -->

2019/03/23 機械学習 名古屋 第19回勉強会 
antimon2（後藤 俊介）

Note:
  スポンサー枠(?)LTスライドですっ

----

<!-- .slide: data-background-color="rgba(102,130,223,0.3)" -->

## お品書き

+ お前誰よ？
+ 来栖川電算の紹介
+ Juliaの紹介
+ Julia v1.1 on Colab

---

<!-- .slide: data-background-color="rgba(102,130,223,0.3)" -->

# お前誰よ？

----

<!-- .slide: data-background-color="rgba(102,130,223,0.3)" -->

## 自己紹介

+ 名前：後藤 俊介
+ 所属：**[有限会社 来栖川電算](https://www.kurusugawa.jp)**
+ コミュニティ：**[機械学習名古屋](https://machine-learning.connpass.com/)**, **[JuliaTokai](https://juliatokai.connpass.com/)**:new:, **[NGK2018B](https://ngk2018b.connpass.com/)**, [Python東海](https://connpass.com/series/292/), Ruby東海, …
+ 言語：**[Julia](https://julialang.org)**, Python, Scala（勉強中）, Ruby, …
+ ![Twitter](https://i.imgur.com/HqouMIg.png)<!-- .element: class="plain" style="vertical-align:middle;background:transparent" --> [@antimon2](https://twitter.com/antimon2) / ![Facebook](https://i.imgur.com/01nPd37.png)<!-- .element: class="plain" style="vertical-align:middle;background:transparent" --> [antimon2](https://www.facebook.com/antimon2)
+ ![Github](https://i.imgur.com/yBKtii5.png)<!-- .element: class="plain" style="vertical-align:middle;background:transparent" --> [antimon2](https://github.com/antimon2/) / ![Qiita](https://i.imgur.com/FxHMi64.png)<!-- .element: class="plain" style="vertical-align:middle;background:transparent" --> [@antimon2](http://qiita.com/antimon2)

Note:
  今日も Julia の話っ

---

<!-- .slide: data-background-color="rgba(44,214,221,0.3)" -->

# 来栖川電算

Note:
  スポンサー枠っ

----

<!-- .slide: data-background-color="rgba(44,214,221,0.3)" -->

[![有限会社来栖川電算](https://i.imgur.com/8Kuhfel.png)  
https://www.kurusugawa.jp](https://www.kurusugawa.jp)

Note:
  見に来てねっ

----

<!-- .slide: data-background-color="rgba(44,214,221,0.3)" -->

[![来栖川電算 ホーム Facebook](https://i.imgur.com/IQptAKC.jpg)  
https://www.facebook.com/kurusugawa.jp](https://www.facebook.com/kurusugawa.jp)

Note:
  『いいね！』してねっ

----

<!-- .slide: data-background-color="rgba(44,214,221,0.3)" -->

<iframe src="//www.slideshare.net/slideshow/embed_code/key/4LidTI9tGbRQAJ" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/youheiyamaguchi/jaws-days-2019" title="JAWS DAYS 2019" target="_blank">JAWS DAYS 2019</a> </strong> from <strong><a href="https://www.slideshare.net/youheiyamaguchi" target="_blank">陽平 山口</a></strong> </div>

Note:
  2/23（ちょうど1ヶ月前）に行われた JAWS DAYS 2019 での弊社山口の発表資料っ

----

<!-- .slide: data-background-color="rgba(44,214,221,0.3)" -->

## 概要

+ 設立 2003年（名古屋工業大学発ベンチャー）
+ 従業員 66人（メイドさんも含めて！）
    + ここ最近人が増えた

Note:
  従業員にはバイトも含まれています。

----

<!-- .slide: data-background-color="rgba(44,214,221,0.3)" -->

## SF 世界の技術を実現し、<br>社会に役立てる

+ AI 技術のライセンス販売・研究開発・SI
    + 文字認識，物体認識，動作認識，行動認識
+ アプリの企画・制作・運営

Note:
  マルチっ

----

<!-- .slide: data-background-color="rgba(44,214,221,0.3)" -->

## 技術者集団

+ 最先端の AI 技術
  + 文字認識、物体認識、モーション認識
+ 限界性能を引き出す実装技術
  + 高精度化、高速化、省資源化、並列化、分散化
+ 高品質なソフトウェアを実現する技術
  + 言語・アーキテクチャ・プロセスに対する深い造詣

----

<!-- .slide: data-background-color="rgba(44,214,221,0.3)" -->

## ワンストップ開発

+ データ収集・アノテーション
+ AI（認識技術）の研究開発
+ アプリの企画・制作・運営
+ 自社製実験パイプライン

Note:
  アノテーションツールも自社製っ  
  基本使用料無料で誰でも使えますっ！

----

<!-- .slide: data-background="https://i.imgur.com/XuAkn8y.png" data-background-color="rgba(44,214,221,0.3)" -->

Note:
  ![体制](https://i.imgur.com/XuAkn8y.png)

----

<!-- .slide: data-background-color="rgba(44,214,221,0.3)" -->

## 製品・サービス

+ 画像認識API（ライセンス販売）
+ 物体認識（研究開発→SI）
    + 走行画像リアルタイム認識、地図生成
+ モーション認識
    + [毎朝体操](http://maiasa.jp/)
+ 研究開発支援
    + ANNOFAB（アノテーションツール）
    + AHAB（実験スケジューラ）

----

<!-- .slide: data-background="https://i.imgur.com/XaH6sgN.jpg" data-background-color="rgba(44,214,221,0.3)" -->

Note:
  ![事例・製品・サービス](https://i.imgur.com/XaH6sgN.jpg)

----

<!-- .slide: data-background-color="rgba(44,214,221,0.3)" -->

## 求人等

+ 研究（認識技術）
+ 開発（サーバサイド/フロントエンド）
+ 企画（アプリ/サービス）
+ デザイナ

Note:
  学生の皆さん、転職者の皆さん、力を貸してくださいっ

----

<!-- .slide: data-background="https://i.imgur.com/5CbxlN7.jpg" data-background-color="rgba(44,214,221,0.3)" -->

Note:
  ![募集中！](https://i.imgur.com/5CbxlN7.jpg)

---

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

# Julia の紹介

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

[![Julia](https://upload.wikimedia.org/wikipedia/commons/6/69/Julia_prog_language.svg)<!-- .element: style="background:white;max-width:80%" -->](https://julialang.org)

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

## Julia とは？(1)

+ [The Julia Language](https://julialang.org)
+ 2018/08/08 に正式版 v1.0 がリリース！
    + 最新 v1.1.0（2019/01/21）
+ 科学技術計算に強い！
+ 動作が速い！（LLVM JIT コンパイル）

Note:
  ググるときはなるべく [julialang](https://www.google.co.jp/search?q=julialang) で！

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

## Julia とは？(2)

> + Rのように中身がぐちゃぐちゃでなく、
> + Rubyのように遅くなく、
> + Lispのように原始的またはエレファントでなく、
> + Prologのように変態的なところはなく、
> + Javaのように硬すぎることはなく、
> + Haskellのように抽象的すぎない
> 
> ほどよい言語である
<!-- .element: style="font-size:66%" -->

引用元：http://www.slideshare.net/Nikoriks/julia-28059489/8
<!-- .element: style="font-size:71%" -->

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

## Julia とは？(3)

> + C のように高速だけど、  
  Ruby のような動的型付言語である
> + Lisp のようにプログラムと同等に扱えるマクロがあって、しかも  
  Matlab のような直感的な数式表現もできる
> + Python のように総合的なプログラミングができて、  
  R のように統計処理も得意で、  
  Perl のように文字列処理もできて、  
  Matlab のように線形代数もできて、  
  shell のように複数のプログラムを組み合わせることもできる
> + 超初心者にも習得は簡単で、  
  超上級者の満足にも応えられる
> + インタラクティブにも動作して、コンパイルもできる
<!-- .element: style="font-size:50%" -->

（[Why We Created Julia](http://julialang.org/blog/2012/02/why-we-created-julia) から抜粋・私訳）
<!-- .element: style="font-size:71%" -->

Note:
  いろんな言語の「いいとこどり」言語！ってことでっ

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

## 要するに
<!-- .element: style="font-size:300%" -->

+ 動的言語なのに速い！
+ 文法も覚えやすい！
+ 数値計算に強い！
<!-- .element: style="font-size:180%" -->

Note:
  機械学習とかにも持って来いっ！

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

## 主な機能
<!-- .element: style="font-size:280%" -->

+ [多重ディスパッチ](https://docs.julialang.org/en/v1/manual/methods/)
+ [動的型システム](https://docs.julialang.org/en/v1/manual/types/)
+ [並行・並列処理](https://docs.julialang.org/en/v1/manual/parallel-computing/)、コルーチン
+ [組込パッケージマネージャ](https://docs.julialang.org/en/v1/stdlib/Pkg/)
<!-- .element: style="font-size:160%" -->

Note:
  っ

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

## 文法・関数

Note:
  以降、ほぼ過去スライドからのコピペ。すっ飛ばして先へ進んで戴いてもOKっ

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

### 基本的な演算

```julia
julia> 1 + 2 - 3 * 4  # 四則演算（除算以外）
-9

julia> 7 / 5  # `整数 / 整数` の結果は浮動小数
1.4

julia> 7 ÷ 5  # `整数 ÷ 整数` の結果は整数
1

julia> 2 ^ 10 # 冪乗は `^`
1024

julia> 123 & 234 | 345  # 論理積 / 論理和
376

julia> 123 ⊻ 234  # 排他的論理和(==`xor(123, 234)`)
145
```
<!-- .element: style="font-size:46%" -->

Note:
  整数同士の除算は実数になりますっ  
  整数除算演算子 `÷` が別に存在します（Python の `//` 相当）っ  
  また冪乗も（`**` ではなく）`^` ですっ  
  `⊻` は `\xor`+<kbd>Tab</kbd> または `\veebar`+<kbd>Tab</kbd> で変換できますっ  
  ちなみに先ほどの `÷` も `\div`+<kbd>Tab</kbd>で（基本的に ${\rm \TeX}$ の書式）っ

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

### 配列

```julia
julia> a = [1, 2, 3, 4, 5]
5-element Array{Int64,1}:
 1
 2
 3
 4
 5

julia> a[1]   # Julia は 1-origin
1

julia> println(a[2:3])  # 範囲指定は両端含む
[2, 3]
```
<!-- .element: style="font-size:50%" -->

Note:
  1-origin であることに注意すればあとは普通の配列っ  
  あと `a:b` は範囲（`Range`）の記法。両端を含む（Ruby の `a..b` と同じ）っ

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

### 配列の内包表記 (1)

```julia
julia> a = [n^2 for n=1:5]
5-element Array{Int64,1}:
  1
  4
  9
 16
 25

julia> A = [x+10y for y=1:3, x=1:3]
3×3 Array{Int64,2}:
 11  12  13
 21  22  23
 31  32  33

```
<!-- .element: style="font-size:50%" -->

Note:
  内包表記の記法は Python に類似っ  
  かつ、`for` にカンマ区切りで複数のイテレータを渡すことで2次元以上の配列も作成可能っ

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

### 配列の内包表記 (2)

```julia
julia> [(a,b,c) for c=1:15,b=1:15,a=1:15 if a^2+a*b+b^2==c^2]
6-element Array{Tuple{Int64,Int64,Int64},1}:
 (3, 5, 7)
 (5, 3, 7)
 (6, 10, 14)
 (7, 8, 13)
 (8, 7, 13)
 (10, 6, 14)
```

Note:
  Python と同様に `if` で条件を指定することも可能っ  
  あと Python と同様、`[○ for ○=○]` を `(○ for ○=○)` と書くと配列ではなくて `Generator` が返りますっ

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

### ベクトル

```julia
julia> x = [1., 2., 3.]; y = [3., 1., 2.];

julia> x + y  # `x .+ y` と書いても同じ（elementwise operation）
[4., 3., 5.]

julia> x .* y # これは `x * y` と書くとNG
[3., 2., 6.]

julia> using LinearAlgebra

julia> x ⋅ y  # 内積（dot積、`dot(x, y)` と書いても同じ）
11.0

julia> x × y  # 外積（cross積、`cross(x, y)` と書いても同じ）
[1., 7., -5.]
```
<!-- .element: style="font-size:50%" -->

Note:
  Julia では実は1次元配列がベクトルの扱いっ  
  `⋅` は `\cdot`+<kbd>Tab</kbd>、`×` は `\times`+<kbd>Tab</kbd>（これらを利用するには `using LinearAlgebra` 必要）っ  
  あとこれらや先ほどの `÷` や `⊻` などのように、ASCIIの範囲を超えたUnicode文字の演算子（そのほとんどが $\TeX$ 由来）が Julia にはたくさんあります（他には例えば比較演算子の `≤` `≥` や、集合の要素 `∈` や包含関係 `⊆` などなど）

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

### 行列

```julia
julia> A = [1 2; 3 4]   # この記法は MATLAB/Octave 由来
2×2 Array{Int64,2}:
 1  2
 3  4

julia> A'  # `○'` は転置行列の記法（これも MATLAB/Octave 由来）
2×2 LinearAlgebra.Adjoint{Int64,Array{Int64,2}}:
 1  3
 2  4
 
 julia> transpose(A)  # 正確には転置行列はこっち
2×2 LinearAlgebra.Transpose{Int64,Array{Int64,2}}:
 1  3
 2  4
```
<!-- .element: style="font-size:50%" -->

Note:
  Julia では2次元配列が行列の扱いっ  
  あと `○.'` という書式は廃止されました（`transpose(A)` 使ってね）っ

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

### 行列の演算

```julia
julia> A = [1 2; 3 4]; B = [3 0; 0 6];

julia> A + B  # A .+ B でも同様
2×2 Array{Int64,2}:
 4   2
 3  10

julia> A * B   # matrix multiply
2×2 Array{Int64,2}:
 3  12
 9  24

julia> A .* B   # elementwise multiply
2×2 Array{Int64,2}:
 3   0
 0  24
```
<!-- .element: style="font-size:48%" -->

Note:
  行列は `*` で通常の行列積になりますっこれ便利っ

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

### ブロードキャスト

```julia
julia> sin(0.1)
0.09983341664682815

julia> sin.([0.1, 0.2, 0.3, 0.4])
4-element Array{Float64,1}:
 0.0998334
 0.198669
 0.29552
 0.389418

julia> [0.1, 0.2, 0.3, 0.4] .^ 2
# => [0.01, 0.04, 0.09, 0.16]
```
<!-- .element: style="font-size:50%" -->

Note:
  関数名と `(` の間に `.` を置くと、普通の関数を配列に拡張してくれる（ブロードキャスト）っ  
  `.^` のように演算子の前に `.` を書いても同様（先ほど出た `.+` `.*` もブロードキャスト）っ

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

### 関数定義

```julia
julia> f(x) = x^2 + 2x - 1
f (generic function with 1 method)

julia> f(1)
2

julia> f.(1:5)
# => [2, 7, 14, 23, 34]
```

Note:
  数学のように直感的な記述で関数を定義可能っ  
  `2x` は `2*x` の省略形、曖昧さがなければリテラルと他の識別子が続く場合などに勝手に乗算と解釈してくれるっ  
  またユーザ定義関数も `.` をつけて自動的にブロードキャスト対応っ

----

<!-- .slide: data-background-color="rgba(213,99,92,0.3)" -->

### 有理数・複素数

```julia
julia> 1//2 == 0.5
true

julia> 1//2 - 1//3
1//6

julia> 1im ^ 2 == -1
true

julia> (1.0 + 0.5im) * (2.0 - 3.0im)
3.5 - 2.0im
```

Note:
  有理数・複素数を標準サポート。  
  `//` は有理数除算（結果は有理数）  
  `im` は虚数単位。  
  どちらも四則演算も普通に書けますっ

---

<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->

# Julia v1.1 on Colab

----

<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->

## Google Colaboratory

+ Google Cloud 上で動く Notebook サービス
+ Python ＋ NumPy/TF/Keras/matplotlib 等標準装備
+ 無料で GPU/TPU が利用できる！
    + ただし時間・リソースに制限あり

Note:
  Jupyter Notebook ベースで動いていますっ  
  あと長いので以降 Colab と略記しますっ

----

<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->

## Julia on Colab

+ 環境整備すれば Julia も使える！
<!-- .element: style="font-size:150%" -->

Note:
  っ

----

<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->

### Colab 上に Julia インストール

+ Colab 上で直接シェルコマンド叩いてインストール（！）

----

<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->

```bash=
!wget https://developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64-deb
!dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64-deb
!apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub
!apt update -q
!apt install cuda-9-0 gcc-6 g++-6 -y -q
!ln -s /usr/bin/gcc-6 /usr/local/cuda/bin/gcc
!ln -s /usr/bin/g++-6 /usr/local/cuda/bin/g++

!curl -sSL "https://julialang-s3.julialang.org/bin/linux/x64/1.1/julia-1.1.0-linux-x86_64.tar.gz" -o julia.tar.gz
!tar -xzf julia.tar.gz -C /usr --strip-components 1
!rm -rf julia.tar.gz*
!julia -e 'using Pkg; pkg"add IJulia; add CuArrays; add Flux; precompile"'
```
<!-- .element: style="font-size:50%" -->

Note:
  これを Python3 ノート上で実行っ  
  （GPUインスタンスを指定して、cuda等もインストールしています、ので Julia で GPGPU もできちゃいますっ）

----

<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->

{%gist antimon2/9a0c10b3dc8a328f4387074d550d43a4%}

----

<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->

### Colab 上の Julia で遊ぶ！

+ 予め `Julia 1.1` カーネルの notebook 用意しておいてそれを開く！
    + 新しい Notebook 開いてから Julia 1.1 のカーネルを選ぶことはできないので注意！<!-- .element: style="font-size:70%" -->

Note:
  新しい Notebook 開いてから Julia 1.1 のカーネルを選ぶことはできないので注意！

----

<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->

{%gist antimon2/1e88b753a39dd6dd9a2319156ff4bb33%}

----

<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->

### 例：MNIST の学習

----

<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->

{%gist antimon2/f7087f9aa7c450efcac0719b7f2f2af0%}

----

<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->

### 補足

+ TPU も使える（ [XLA.jl を試してみた](https://qiita.com/antimon2/items/ccfb5c2353d99fcb1976) on [Qiita](https://qiita.com) 等参照）
+ 時間制限注意

---

<!-- .slide: data-background-color="rgba(170,121,193,0.3)" -->

# まとめ

----

<!-- .slide: data-background-color="rgba(170,121,193,0.3)" -->

+ Colab 便利！
+ Julia 良いよ楽しいよ！

Note:
    っ

----

<!-- .slide: data-background-color="rgba(170,121,193,0.3)" -->

## 参考リンク

+ [Julia at NIPS and the Future of Machine Learning Tools](https://juliacomputing.com/blog/2018/11/15/julia-ml-three-papers.html)
+ [Google Colab で Julia を使ってみた](https://qiita.com/ueuema/items/ca1b326f5df10a4203bd) by [@ueuema](https://qiita.com/ueuema)

---

<!-- .slide: data-background-color="rgba(170,121,193,0.3)" -->

# おまけ

----

<!-- .slide: data-background-color="rgba(102,130,223,0.3)" -->

## JuliaTokai
<!-- .element: style="font-size: 360%" -->

Note:
  姉妹勉強会の簡単な紹介っ

----

<!-- .slide: data-background="https://i.imgur.com/zgBANAj.jpg" data-background-color="rgba(102,130,223,0.3)" -->

Note:
  前回の勉強会の様子
  ![前回の勉強会の様子](https://i.imgur.com/zgBANAj.jpg)

----

<!-- .slide: data-background-color="rgba(102,130,223,0.3)" -->

[![JuliaTokai グループページ - connpass](https://i.imgur.com/0fmaoBQ.jpg)https://juliatokai.connpass.com/](https://juliatokai.connpass.com/)<!-- .element: style="font-size: 80%" -->

Note:
  勉強会の告知・募集サイトっ！

----

<!-- .slide: data-background-color="rgba(102,130,223,0.3)" -->

### 勉強会の内容

+ [Julia](https://julialang.org) の東海地方ユーザグループ
+ Julia に関すること、以外特にテーマは決めない！
    + 基本、もくもく会

Note:
    難しくないよーこわくないよー

----

<!-- .slide: data-background-color="rgba(102,130,223,0.3)" -->

### 次回

+ 2019/05/xx(土)：第2回開催予定！
    + 詳細未定

Note:
    次回も、基本もくもく会の予定っ！

----

<!-- .slide: data-background-color="rgba(44,214,221,0.3)" -->

## 来栖川電算

Note:
  スポンサー枠っ

----

<!-- .slide: data-background="https://i.imgur.com/5CbxlN7.jpg" data-background-color="rgba(44,214,221,0.3)" -->

Note:
  ![募集中！](https://i.imgur.com/5CbxlN7.jpg)

---

<!-- .slide: data-background-color="rgba(170,121,193,0.3)" -->

ご清聴ありがとうございます。

Note:
    ご清聴ありがとうございますっ！

