๐โ๏ธ [python] ray๋ก ์นผํด๋ฅผ ํด๋ณด์
์ด์ ํฌ์คํ ์์ ๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ์ํด multiprocessing์ ์ฌ์ฉํ์ง๋ง ์์ฆ ๋ค์ด์๋ ray๋ฅผ ํ์ฉํ๊ณ ์์ต๋๋ค. ์ multiprocessing์์ ray๋ก ๊ฐ์ํ๋์ง์ ๋ํ ์ด์ ์ ray ์ฌ์ฉ๋ฒ์ ๋ํด ์ ๋ฆฌํ์์ต๋๋ค.
๐๐ปโ๏ธ multiprocessing์ด๋?
multiprocessing์ ํ๋ก์ธ์ค ์คํฌ๋(process spawning)์ ํตํด ์ฌ๋ฌ ํ๋ก์ธ์๋ฅผ ํ์ฉํ๋ค. ์ฌ๊ธฐ์ ๋งํ๋ ํ๋ก์ธ์ค ์คํฌ๋์ ๋ํด ์ค๋ช ํ์๋ฉด ์ฐ์ , ์คํฌ๋์ ์์ ๋ณ๋๋ค๋ ์๋ฏธ์ด๋ค. ์ฆ ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์์ ํ๋ก์ธ์ค๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ์๋ฏธํ๋ค. Pool ๊ฐ์ฒด๋ฅผ ํตํด ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํ๋ฉฐ ๋น๋๊ธฐ์ฒ๋ฆฌ, ์ดํฐ๋ ์ดํฐ ๋ฑ์ ์ฐจ์ด์ ๋ฐ๋ผ map, imap, map_async, imap_unordered ๋ฑ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
multiprocessing ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ๋ก์ธ์ค ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ๋ pickle์ ์ฌ์ฉํด ์ ๋ฌํ๋๋ฐ pickling์ด ๊ฐ๋ฅํ ๊ฐ์ฒด(pickle-able)๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. pickle์ ํ์ด์ฌ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ์ง๋ ฌํํ๊ณ ๋ค์ ์ญ์ง๋ ฌํ ํ์ฌ ๊ฐ์ฒด๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ๋ฐฉ์์ด๋ค. pickle ๋ชจ๋ ๋ฌธ์์์ pickling์ด ๊ฐ๋ฅํ ๋ชจ๋์ ๋ค์๊ณผ ๊ฐ์ type์ด ์๋ค๊ณ ํ๋ค. ์ด๋ฐ pickling ๋ฐฉ์์ ๋ชจ๋ ํ๋ก์ธ์ค๊ฐ ๋ฐ์ดํฐ์ ๋ํ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด์ผ ํ๋ฉฐ, ํฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ์ญ์ง๋ ฌํ์์ ๋ฐ์ํ๋ ์ค๋ฒํค๋๋ฅผ ๊ฐ์ง ์๋ฐ์ ์๋ค.
- None, true, and false
- Integers, long integers, floating point numbers, complex numbers
- Normal and Unicode strings
- Tuples, lists, sets, and dictionaries containing only picklable objects
- Functions defined at the top level of a module
- Built-in functions defined at the top level of a module
- Classes that are defined at the top level of a module
๐คท๐ปโ๏ธ ray๋ ๋ค๋ฅธ๊ฒ ๋ญ๋ฐ?
ray๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํ ์คํ ์์ค ํตํฉ ํ๋ ์์ํฌ์ด๋ค. ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๋ฟ๋ง ์๋๋ผ ๋ถ์ฐ training, hyperparameter tuing, model serving์์๋ ์ฌ์ฉํ ์ ์๋ค. multiprocessing ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค๋ฅด๊ฒ ๊ธฐ์กด์ ์์ฑํ ์ฝ๋๋ฅผ ์กฐ๊ธ๋ง ์์ ํ๋ฉด ๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์ ํ์์ด ๋ฐ์ํ์ง ์๋๋ค. ray๋ ์ง๋ ฌํ ์ค๋ฒํค๋๊ฐ ์ ์ Apache Arrow๋ฅผ ์ฌ์ฉํ์ฌ Zero-copy ์ง๋ ฌํ๋ฅผ ์ํํ๋ค. zero-copy ์ง๋ ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ์ง ์๊ณ ์ง์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ์ฌ ์ง๋ ฌํ๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์ ๋ณต์ฌ ์ฐ์ฐ์ ํผํ ์ ์์ด ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์ ์ ์ ์ฉํ๋ค. ์ฆ, ray๋ high-level์์ ์ฝ๊ฒ ๋ถ์ฐ ๊ฐ๋ฅํ๋ฉฐ ๋ณ๋ ฌ์ ์ผ๋ก ์คํ์ํฌ ์ ์๋ ์์คํ ์ ๊ตฌ์ถํ ์ ์๋ค. ๋ํ, ๋ถ์ฐ/๋ณ๋ ฌ ์์คํ ์ ์๋์ ๊ฐ์ ์๊ตฌ์ฌํญ๋ค์ ๊ฐ๋ ฅํ๊ณ ์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก ํ ์ ์๋๋ก ๋์์ค๋ค.
- ๋ค์์ ์ปดํจํฐ์์ ๋์ผํ ์ฝ๋๋ก ์คํ์ํฌ ์ ์์ด์ผ ํ๋ค.
- statefulํ๊ณ ํต์ ๊ฐ๋ฅํ Microservice ๋ฐ Actor๋ฅผ ๊ตฌ์ถํ ์ ์์ด์ผ ํ๋ค.
- ๊ธฐ๊ณ ๊ณ ์ฅ ๋ฐ ์์คํ ๊ณ ์ฅ์ ํ๋ฅญํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ด์ผ ํ๋ค.
- ๊ฑฐ๋ํ ๋ฐ์ดํฐ์ ์์ฒด ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ด์ผ ํ๋ค.
๐ค ray ์ฌ์ฉํด๋ณด๊ธฐ
ray๋ฅผ ์ค์นํ๊ณ ๊ฐ๋จํ ์ฌ์ฉํด๋ณด์.
pip install ray
๋จผ์ , ray.init()์ผ๋ก ray cluster๋ฅผ ์คํํ๋ค. ray.init์ ํตํด dashboard ์คํ, cpu core ๊ฐฏ์๋ฅผ ์ค์ ํ ์ ์๋ค. ๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์ถ์ ํจ์ ์์ ray.remote ๋ฐ์ฝ๋ ์ดํฐ๋ก ๊ฐ์ธ์ค๋ค. ๋ฐ์ฝ๋ ์ดํฐ๋ก ๊ฐ์ธ์ค ํจ์๋ remote(ObjectRef) ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋ค. remote ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด Object(Future ๊ฐ์ฒด) Ref(๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์)๋ฅผ ๋ฐํํ๋ค. ray.put()์ ์ด์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ์ฌ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ง ์๊ณ ๋ชจ๋ ํ๋ก์ธ์ค์์ ์ ๊ทผํ ์ ์๋ค. ray.get(ObjectRef)๋ก ๊ฐ์ ๋ฐํ๋ฐ์ ์ ์๋ค.
%%time
import numpy as np
import ray
ray.init()
arr = np.random.random(100000000)
@ray.remote
def mul(x):
return x * x
arr = ray.put(arr)
result = ray.get(mul.remote(arr))
# CPU times: user 2.99 s, sys: 5.24 s, total: 8.22 s
# Wall time: 12 s
ray๋ฅผ ๋ค ์ฌ์ฉํ์ผ๋ฉด ray.shutdown()์ ์ด์ฉํด ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํด์ผํ๋ค.
ray.shutdown()
๐ค dashboard๋ก ray๊ฐ ์ ์คํ๋๊ณ ์๋์ง ํ์ธํ๊ธฐ
๋จผ์ ์๋์ ๊ฐ์ด default๋ก ์ค์นํด์ค์ผํ๋ค.
pip install "ray[default]"
ray.init ์ parameter์ ์๋์ ๊ฐ์ด ์ถ๊ฐํด์ฃผ๋ฉด 0.0.0.0:8265๋ก dashboard๋ฅผ ํ์ธํ ์ ์๋ค.
ray.init(ignore_reinit_error=True, dashboard_host="0.0.0.0", dashboard_port=8265, include_dashboard=True)
cluster์์ cpu ์ฌ์ฉ๋๊ณผ memory๋ฅผ ํ์ธํ ์ ์๊ณ jobs์์ task๋ค์ ํ์ธํ ์ ์๋ค.
๊ฐ๋จํ, cli๋ก๋ ํ์ธํ ์ ์๋๋ฐ ray status๋ฅผ ์ ๋ ฅํ๋ฉด ์ฌ์ฉํ๊ณ ์๋ cpu core, memory๋ฅผ ํ์ธํ ์ ์๋ค.
ray status
======== Autoscaler status: 2023-04-14 15:08:54.505294 ========
Node status
---------------------------------------------------------------
Healthy:
1 node_a97857866db864797421c265df4c57eb57b2c4025798091347b49a9c
Pending:
(no pending nodes)
Recent failures:
(no failures)
Resources
---------------------------------------------------------------
Usage:
16.0/16.0 CPU
0.00/4.369 GiB memory
0.00/2.000 GiB object_store_memory
Demands:
{'CPU': 1.0}: 65115+ pending tasks/actors
โ๏ธ ๋ง์น๋ฉฐ
์ด๋ ๊ฒ ray์ multiprocessing์ ์ฐจ์ด์ ray ์ฌ์ฉ๋ฒ์ ๋ํด ๋ค๋ค๋ดค๋ค. multiprocessing์ ์ฌ์ฉํ ๋ ์คํฌ๋ ์๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ๋ค๊ฐ ์ด์ ๊ฐ ๋ญ์ง ์ ์ดํดํ์ง ๋ชปํ์๋๋ฐ ์ด๋ฒ ํฌ์คํ ์ ์์ฑํ๋ฉด์ ์ดํดํ ์ ์๊ฒ ๋๋ค. multiprocessing์ ํ์ฉํ ๋ ์ด๋์ ๋ task๊ฐ ์งํ๋๊ณ ์๋์ง ์ ์ ์์ด ๋ถํธํ๋๋ฐ ray๋ ๋ณด๊ธฐ ์ข์ dashboard๋ฅผ ์ ๊ณตํด์ค์ ์ผ์ ์ง์ฒ๋๋ ์ฝ๊ฒ ํ์ ํ ์ ์์ ๊ฒ ๊ฐ๋ค. ๋ฌธ์์์๋ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ํ์ตํ ๋๋ ray๋ฅผ ํ์ฉํ ์ ์๋ค๊ณ ์๊ฐํ๊ณ ์๋๋ฐ ์ด ๋ถ๋ถ๋ ์ข ๋ ํ๊ณ ๋ค์ด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.