GPU ์ง์
GPU ๊ฐ์ด ํ๋์จ์ด ๋ฐฑ์๋๋ก ํ๋ ๋ฐฐ์ด ์ฐ์ฐ์ ์ง์์ CuArrays์ ๊ฐ์ ์ธ๋ถ ํจํค์ง๋ฅผ ์ ๊ณตํ๋ค. Flux๋ ๋ฐฐ์ด์ ํ์ ์ ์ ํ์ง ์์๊ธฐ์(agnostic) ๋ชจ๋ธ ๊ฐ์ค์น(weights)์ ๋ฐ์ดํฐ๋ฅผ GPU์ ์ฎ๊ฒจ์ฃผ๋ฉด Flux๊ฐ ์ด๋ฅผ ๋ค๋ฃฐ ์ ์๋ค.
์๋ฅผ ๋ค์ด, CuArrays
(cu
์ปจ๋ฒํฐ๋ก ๋ณํ)๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ์์ ๋ฅผ NVIDIA GPU์์ ๋๋ฆด ์ ์๋ค.
using CuArrays
W = cu(rand(2, 5)) # 2ร5 CuArray
b = cu(rand(2))
predict(x) = W*x .+ b
loss(x, y) = sum((predict(x) .- y).^2)
x, y = cu(rand(5)), cu(rand(2)) # ๋๋ฏธ ๋ฐ์ดํฐ
loss(x, y) # ~ 3
ํ๋ผ๋ฏธํฐ (W
, b
)์ ๋ฐ์ดํฐ ์ธํธ (x
, y
)๋ฅผ cuda ๋ฐฐ์ด๋ก ๋ณํํ์๋ค. ๋ํจ์(derivatives)์ ํ๋ จ ๊ฐ์ ์ ๊ณผ ๋์ผํ๋ค.
Dense
๋ ์ด์ด๋ Chain
๊ฐ์ ์กฐ๋ฆฝ ๋ชจ๋ธ(structured model)๋ฅผ ์ ์ํ์์ผ๋ฉด, ๋ด๋ถ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ณํ์์ผ์ผ ํ๋ค. Flux์์ ์ ๊ณตํ๋ mapleaves
ํจ์๋ก ๋ชจ๋ธ์ ๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ํ๊บผ๋ฒ์ ๋ณ๊ฒฝํ ์ ์๋ค.
d = Dense(10, 5, ฯ)
d = mapleaves(cu, d)
d.W # Tracked CuArray
d(cu(rand(10))) # CuArray output
m = Chain(Dense(10, 5, ฯ), Dense(5, 2), softmax)
m = mapleaves(cu, m)
d(cu(rand(10)))
ํธ์์ Flux๋ gpu
ํจ์๋ฅผ ์ ๊ณตํ์ฌ GPU๊ฐ ์ด์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋ชจ๋ธ๊ณผ ๋ฐ์ดํฐ๋ฅผ GPU๋ก ๋ณํํ๊ฒ ํ๋ค. ๊ทธ๋ฅ์ ์๊ฒ๋ ์ํ์ง๋ง CuArrays
๋ฅผ ๋ก๋ฉ(using CuArrays)ํ ๊ฒฝ์ฐ๋ ๋ฐ์ดํฐ๋ฅผ GPU์ ์ฎ๊ฒจ์ค๋ค.
julia> using Flux, CuArrays
julia> m = Dense(10,5) |> gpu
Dense(10, 5)
julia> x = rand(10) |> gpu
10-element CuArray{Float32,1}:
0.800225
โฎ
0.511655
julia> m(x)
Tracked 5-element CuArray{Float32,1}:
-0.30535
โฎ
-0.618002
๋น์ทํ ์ฉ๋๋ก cpu
๋ ๋ชจ๋ธ๊ณผ ๋ฐ์ดํฐ๋ฅผ GPU์์ ๊ทธ๋ง๋๋ฆฌ๊ฒ ํ๋ค.
julia> x = rand(10) |> gpu
10-element CuArray{Float32,1}:
0.235164
โฎ
0.192538
julia> x |> cpu
10-element Array{Float32,1}:
0.235164
โฎ
0.192538