GPU ์ง€์›

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