-
[Python] Pickle์ ๋ํ ์คํด์ Can’t Pickle local object Error ํด๊ฒฐML engineer/Papers & CS generals 2023. 2. 16. 00:42๋ฐ์ํ
๐ 5 mins read
# Pickle์ ์คํด
ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด, ์ง์ ์ฌ์ฉํ์ง ์๋๋ผ๋, pickle์ ์ด๋ป๊ฒ๋ ๋ง๋ ์๋ฐ์ ์๋๋ฐ, ๋จ์ํ ํ์ผ์ด๋ ์ค๋ธ์ ํธ๋ฅผ ์ ์ฅํ๊ณ ๋ถ๋ฌ์ฌ ๋๋ฟ๋ง ์๋๋ผ ์ด๋ค ๊ฐ์ฒด๋ฅผ ํ๋ก์ธ์ค ๊ฐ์ ๊ณต์ ํ๊ฑฐ๋ ์ ๋ฌํ ๋๋ ์ฐ์ ๋๋ค. ์ด๋ pickle์ ์๋ฆฌ๋ฅผ ๋ชจ๋ฅผ ๊ฒฝ์ฐ Attribute Error ํน์ PicklingError๋ฅผ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ๋ง๋๋ฉด ๋นํฉ์ค๋ฌ์ธ ์ ์์ต๋๋ค. (๋ฌธ์ ์๋ ๊ฑฐ
๊ฐ์๋ฐ ๋์ฒด ์!?)PicklingError: Can't pickle <class 'class.method.var'>: it's not the same object as class.method.var AttributeError: Can't pickle local object 'class.<locals>.some_var'
ํนํ ํ์ด์ฌ์ ์ฒ์ ์ ํ๋ ์ฌ์ฉ์๋, ํํ ์ ํ(?)ํ๋ "pickle์ ์ด์ฉํ์ฌ ํ์ด์ฌ ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ" ๋ฐ์์ ๊ธ์ ํตํด ๋ฐ์ดํฐ ์ ์ฅ ๋ฐฉ๋ฒ์ ์๋ชป ๋ฐฐ์ด ๊ฐ๋ฐ์๋ค์ด ์คํดํ๊ธฐ ์ฌ์ด ๋ถ๋ถ์ธ๋ฐ์, ํ์ด์ฌ ๋ฌธ์์๋ ๋ช ์๋์๋ฏ์ด pickle์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋๊ตฌ๊ฐ ์๋๋ผ "๊ฐ์ฒด ์ง๋ ฌํ" ๋๊ตฌ์ ๋๋ค.
์ง๋ ฌํ(serialization)๋ ๊ฐ๋จํ ๋งํด์, ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ๋ ์ ์ฐจ์ ๋๋ค. ์ด๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ๋ก ์ ์ฅ์ ํ๋ ํํ๋ก ๋ณด์ด๋, ์คํดํ ๋ง ํ๊ธด ํฉ๋๋ค. ๋ค๋ง ์ฌ๊ธฐ์ ์ฃผ๋ชฉํด์ผ ํ ๋ถ๋ถ์, ์ง๋ ฌํ ๋์์ด "๋ฐ์ดํฐ"๊ฐ ์๋๋ผ "๊ฐ์ฒด ๊ตฌ์กฐ"๋ฅผ ์ง๋ ฌํํ๋ ๋ฐ์ด๋๋ฆฌ ํ๋กํ ์ฝ์ด๋ผ๋ ์ ์ ๋๋ค.
## Pickling์ ๋ฌธ์ ์
- ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ์ง๋ ฌํํ๋ฉด, ํด๋น ๊ฐ์ฒด์ ๋ํ ๊ตฌํ์ด ํ์ฌ scope์ ์กด์ฌํ์ง ์์ผ๋ฉด unpickling ํ ๋ ์ค๋ฅ๊ฐ ๋ฉ๋๋ค.
"CustomClass" ์ธ์คํด์ค๋ฅผ pickle ํ๋๋ฐ, "CustomClass"๊ฐ ๋ญ์ง ์ ์ ์๋ ์ํ์์ unpickle์ด ์ ๋๋ ๊ฒ ๋น์ฐํ๊ฒ ์ฃ .
๋ฌด์๋ณด๋ค ์์ ์์์์ ๋์น ๋น ๋ฅธ ๋ถ๋ค์ ์๊ฒ ์ง๋ง, unpickle์ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ์ด ์๋๋ผ ์ฝ๋๋ฅผ "์คํ"ํ๋ ๊ณผ์ ์ด๊ธฐ ๋๋ฌธ์, ๊ฒ์ฆ๋ pickle ์ค๋ธ์ ํธ๊ฐ ์๋๋ผ๋ฉด unpickle ๋ง์ผ๋ก๋ ์ ์ฑ์ฝ๋๋ฅผ ์คํ์ํค๊ฒ ๋ ์ ๋ ์๊ธฐ ๋๋ฌธ์ ์์ ํ์ง ์์ ํ๋กํ ์ฝ์ ๋๋ค.
ํ์ด์ฌ ๋ฌธ์์๋ ๋ฌด์๋ฌด์ํ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ๊ฐ ์์ต๋๋ค.
- ๋ฐ์ด๋๋ฆฌ๋ฅผ "์คํ"ํ๊ธฐ ๋๋ฌธ์, ๋น์ฐํ ์๋ก ๋ค๋ฅธ ๋ฒ์ ์ ํ์ด์ฌ ๋ฐ์ด๋๋ฆฌ์์ ์์ฑํ pickle ์ค๋ธ์ ํธ๋ ๊ณต์ ํ ์ ์์ต๋๋ค.
- ex. Python 3.7.9์์ pickle๋ ์ค๋ธ์ ํธ๋ Python 3.8.16์์ unpickle ํ ์ ์๋ ๊ฒ. - ๋ฐ์ด๋๋ฆฌ ํ๋กํ ์ฝ์ด๊ธฐ์ ๋น์ฐํ ์ ์ฅ๋ ์ค๋ธ์ ํธ๋ human-readable ํ์ง ์์ต๋๋ค.
### huggingface model hub
๋ถ๊ณผ ๋ช ๋ฌ ์ ๋ง ํด๋ huggingface model hub๋ pickle์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์, ์ ๋ขฐํ ์ ์๋ ๋ชจ๋ธ์ด ์๋๋ผ๋ฉด ํจ๋ถ๋ก from_pretrained()๋ฅผ ์คํํด์ ์ ๋์์ต๋๋ค. (์ ์ฑ์ฝ๋๋ฅผ ์ฌ์ด๋ ์ ์๋ค๋๊น์?)
- ๋ฌผ๋ก ์ด ์ฌ์ค์ด ์๋ ค์ง๊ณ ๋์ huggingface ์ธก์์๋ ๋ฌด์๋ฌด์?ํ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ์ ํจ๊ป ๋ชจ๋ธ์ด ์ ๋ก๋๋ ๋ ์ด๋ ์ ๋ ๊ฒ์๋ฅผ ํด์ฃผ๊ธฐ ์์ํ์ต๋๋ค.
https://huggingface.co/docs/hub/security-pickle
pickle load๊ฐ ์, ์ผ๋ง๋ ์ํํ์ง์, ์ฃผ์ ์ฌํญ๋ค์ ๋ํด ์์ธํ ์ค๋ช ํ๊ณ ์์ผ๋, ๊ด์ฌ ์์ผ์๋ฉด ์ฝ์ด๋ณด๋ฉด ์ข์ ๊ธ์ ๋๋ค.
# Pickle ์ค๋ฅ ์ ํ
์ฌ์ค ๋๊ฒ ์ด๋ฐ local object ์ค๋ฅ๋, pickle์ด local object(์ ์ญ scope์์ ์ ์๋ฅผ ์ฐพ์ ์ ์๋)๋ค์ด pickle ๋์์ด ๋ ๋์ ๋๋ค.
(un-pickle์ด ์ค์ ๋ก๋ ํด๋น ์ค๋ธ์ ํธ๋ฅผ ์ฌ์์ฑํ๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์คํํ๋ ๊ณผ์ ์ธ๊ฑธ ์๊ฐํ๋ฉด ๋น์ฐํ ์ค๋ฅ์ฃ .)
๋ช ๊ฐ์ง ๋ํ์ ์ธ ์ค๋ฅ ์ ํ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ๋ค์ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค. (๋๊ฒ global๋ก ์ ์ธํด ์ฃผ๊ฑฐ๋ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ํด์๋ฉ๋๋ค.)ex1. Attribute Error - can't pickle local objects
๊ฐ์ฅ ํํ ์ ํ์ผ๋ก, ํจ์ ๋ด๋ถ์ ๋ก์ปฌ scope์์ ์ ์๋ ์ค๋ธ์ ํธ๋ฅผ pickle.dump ํ ๋ ๋ฐ์ํ๋ ์ค๋ฅ์ ๋๋ค.
import pickle def get_model_class(params): if params == 1: class ModelA(object): def __init__(self, ...): pass return ModelA else: class ModelB(object): def __init__(self, ...): pass return ModelB model_class = get_model_class(option) model = model_class() with open("model.pkl", "wb") as f: pickle.dump(model, f, pickle.HIGHEST_PROTOCOL)
์ผ๋ จ์ ์กฐ๊ฑด ํน์ ์คํ ์ต์ ๋ฑ์ ๋ฐ๋ผ์ ๋ชจ๋ธ ํด๋์ค๋ฅผ ์ ํํด์ ๋ชจ๋ธ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๊ฐ๋จํ๊ณ , ์ข ์ข ๋ง์ฃผํ ๋ฒํ ์ฝ๋์ ๋๋ค.
Traceback (most recent call last): File "/Users/naubull2/test.py", line 20, in <module> pickle.dump(model, f, pickle.HIGHEST_PROTOCOL) AttributeError: Can't pickle local object 'get_model_class.<locals>.ModelA'
์ฒ์์ ์ค๋ช ๋๋ ธ๋ฏ์ด, ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์ฝ๋์ ๋๋ค.
ModelA ํด๋์ค์ ์ ์๋ get_model_class ํจ์์ ๋ก์ปฌ scope์ ์กด์ฌํฉ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ ์ญ scope์์๋ ModelA ํด๋์ค๊ฐ ์ ์๋ ์ฝ๋๊ฐ ์กด์ฌํ์ง ์๊ธฐ์ ํด๋น ์ธ์คํด์ค๋ฅผ ๋ง์ฝ pickle ๋๋ ๊ฑธ ํ์ฉํ๋ค๋ฉด, un-pickle ํ ์ ์์ ๊ฒ์ ์๋ฉด์ ์ค๋ธ์ ํธ๋ฅผ ์ ์ฅํ๊ฒ ๋๋ ๊ฒ์ด์ฃ .๋ค์ ํ๋ฒ ์ด์ผ๊ธฐํ๋ฉด.. pickle์ ์ธ์คํด์ค๋ฅผ ๋ฐ์ด๋๋ฆฌ๋ก ์ ์ฅํ๋ ๊ฒ ์๋๋ผ ์ธ์คํด์ค๋ฅผ "์์ฑ"ํ๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ ์ฅํฉ๋๋ค.
๊ทธ๋ผ ์ด๋ฐ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผ ์ข์๊น์?
1. ๊ฐ๋จํ๊ฒ global๋ก ์ ์ญ ๋ณ์๋ก
๊ฐ์ฅ ๊ฐํธํ๊ฒ๋ global ์ ์ธ์ ๋ถ์ฌ์ pickle ํ๋ scope์์ ๋ชจ๋ธ ์ธ์คํด์ค ์์ฑ์์ ์ ์๋ฅผ ์ ์ ์๋๋ก ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
import pickle def get_model_class(params): global ModelA global ModelB if params == 1: class ModelA(object): def __init__(self, ...): pass return ModelA else: class ModelB(object): def __init__(self, ...): pass return ModelB model_class = get_model_class(option) model = model_class() with open("model.pkl", "wb") as f: pickle.dump(model, f, pickle.HIGHEST_PROTOCOL)
2. ํด๋์ค ์ ์ ์ฝ๋๋ฅผ ์ ์ญ์ผ๋ก
ํ์ง๋ง, ์ฌ์ฌ์ฉ์ฑ์ด ๋์๋งํ ํด๋์ค๋ก ๋ณด์ด๋ ModelA, ModelB๋ฅผ ํจ์ ๋ด์์ ์ ์ํด ๋๊ณ global๋ก ๋ง๋๋ ๊ฒ์ ์ ๋ง ๊ตฌ์กฐ๊ฐ ์ด์ํฉ๋๋ค. ์ฐจ๋ผ๋ฆฌ ํด๋์ค ์ ์๋ค์ ํจ์ ๋ฐ์ผ๋ก ๋นผ๋ด๋ ํด๊ฒฐ๋๊ฒ ์ฃ ?
๊ธฐ๋ฅ์ ์ผ๋ก๋, get_model_class ํจ์๋ ์ต์ ์ ๋ฐ๋ผ ์์ฑํ ๋ชจ๋ธ์ ํด๋์ค๋ฅผ ๊ณ ๋ฅด๊ธฐ๋ง ํ๋ฉด ๋ ๋ฟ ๋น๋ ํจ์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ํด๋์ค ์ ์๋ get_model_class ๋ฐ์ ์กด์ฌํ๋ ๊ฒ ๊ตฌ์กฐ์ ์ผ๋ก๋ ๊ธฐ๋ฅ์ ์ผ๋ก๋ ๋ช ํํฉ๋๋ค.
import pickle class ModelA(object): def __init__(self, ...): pass class ModelB(object): def __init__(self, ...): pass def get_model_class(params): if params == 1: return ModelA else: return ModelB model_class = get_model_class(option) model = model_class() with open("model.pkl", "wb") as f: pickle.dump(model, f, pickle.HIGHEST_PROTOCOL)
3. ํด๋์ค ์ ์ ์ฝ๋๋ฅผ ๋ถ๋ฆฌ
๊ทธ๋ผ ๋ค ๋ ๊ฑธ๊น์? ์ด์ pickle๋ก ์ ์ฅ๋ ๋ชจ๋ธ์ ๋ค์ ๋ถ๋ฌ์ฌ ๋๋ฅผ ์๊ฐํด ๋ณด๋ฉด, ๊ฒฐ๊ตญ pickle.load ์์ ์ ํด๋น ์ฝ๋ scope์ ์ ์ฅ๋ ModelA๋ฅผ ์์ฑํ๊ธฐ ์ํด ํด๋น ํด๋์ค์ ์์ฑ์๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง๋ฅผ ์์์ผ ํฉ๋๋ค.
๋ง์ฝ ์์์ ๋ค๋ฅธ ๋ชจ๋์์ ์์์ ์ ์ฅํ model.pkl์ ๋ก๋ํ๋ ค๊ณ ํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๋ฅผ ๋ณด๊ฒ ๋ฉ๋๋ค.
Traceback (most recent call last): File "/Users/naubull2/main.py", line 3, in <module> d = pickle.load(open("model.pkl", "rb")) AttributeError: Can't get attribute 'ModelA' on <module '__main__' from '/Users/naubull2/main.py'>
ModelA์ ๋ํ ์ ์๋ฅผ ๋ชจ๋ฅด๋ ๊ณณ์์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์คํํ์ผ๋๊น ๋น์ฐํ ์ค๋ฅ๊ฐ ๋๊ฒ ์ฃ .
์ ์ฅํ๋ ๊ณณ์์๋, ๋ถ๋ฌ์ค๋ ๊ณณ์์๋ ํ์ํ ํด๋์ค ์ ์ ์ฝ๋๋, ์์ ์ฒ์๋ถํฐ ํด๋์ค ์ ์๋ฅผ ๋ณ๋ ๋ชจ๋๋ก ๋ถ๋ฆฌ ์์ผ๋๋ฉด, ํ์ํ ๊ณณ์์ ํด๋น ๋ชจ๋๋ง import ํด์ pickle dump / load ํ๋ ๊ฒ์ด ๊ตฌ์กฐ์ ์ผ๋ก ๊ฐ์ฅ ์์ ํ๊ณ ํด๋ฆฐ ํ ์ฝ๋๊ฐ ๋๊ฒ ์ฃ ?
# models.py class ModelA(object): def __init__(self, ...): pass class ModelB(object): def __init__(self, ...): pass ########################################################## # save_model.py import pickle from models import ModelA, ModelB def get_model_class(params): if params == 1: return ModelA else: return ModelB model_class = get_model_class(option) model = model_class() with open("model.pkl", "wb") as f: pickle.dump(model, f, pickle.HIGHEST_PROTOCOL) ########################################################## # main.py import pickle from models import ModelA, ModelB model = pickle.load(open("model.pkl", "rb")) ...
๋๋จธ์ง ์ ํ๋ค๋ ์์ธ์ ๋ชจ๋ ๋์ผํ๋ฐ, ์ํฉ์ด ๋ค๋ฅธ ๊ฒ๋ฟ์ ๋๋ค.
ex2. ๋ฉํฐํ๋ก์ธ์ฑ ํ๊ฒฝ์์์ can't pickle local objects
์ด์ , pickle์ด ์ ๋๋ ๊ฒฝ์ฐ์ ์ฃผ์ ์์ธ์ ์์๋๋ฐ, ๊ทธ๋ผ ์ ํ์ ์ผ๋ก ํด๋์ค๋ฅผ ๊ณ ๋ฅด๊ณ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ์ธ์ ์ด๋ค ๊ฒฝ์ฐ์ ์ฃผ๋ก ๋ฐ์ํ ๊น์?
multiprocessing์ ์ด์ฉํ ๋, targetํจ์๋ฅผ ๋ก์ปฌ ํจ์๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ์๋ ๋ฐ์ ๊ฐ๋ฅํฉ๋๋ค.
๊ท๋ชจ๊ฐ ์ ๋ฒ ์๋ ์คํ์์ค ํ๋ก์ ํธ์์๋ ์ข ์ข ๋ณด์ด๋ ์ค๋ฅ ์ ํ์ด๋.. pickle์ ์ ์ฒด๋ฅผ ์์๋ ํผํ๊ธฐ๊ฐ ์ฝ์ง ์์ ์ค๋ฅ์ธ ๊ฒ ๊ฐ๋ค์.
https://github.com/pyg-team/pytorch_geometric/issues/366import multiprocessing def main(): a="string" def task1(): print(a) job1 = multiprocessing.Process(target=task1, args=(a)) job1.start() job1.join() main()
multiprocessing ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ์์๋ target ํจ์๋ฅผ ์ ๋ฌํ ๋ pickle์ ์ฌ์ฉํฉ๋๋ค.
๋ฐ๋ผ์ worker process์์๋ ์์ ์์ ์์ ๋ก์ปฌ ํจ์์ธ task1()์ ์ ์๊ฐ ์์ด pickle ์ค๋ฅ๋ฅผ ์ผ์ผํต๋๋ค.Traceback (most recent call last): File "/Users/naubull2/test.py", line 10, in <module> main() File "/Users/naubull2/test.py", line 8, in main job1.start() ... File "/Users/naubull2/opt/anaconda3/lib/python3.9/multiprocessing/popen_spawn_posix.py", line 47, in _launch reduction.dump(process_obj, fp) File "/Users/naubull2/opt/anaconda3/lib/python3.9/multiprocessing/reduction.py", line 60, in dump ForkingPickler(file, protocol).dump(obj) AttributeError: Can't pickle local object 'function.<locals>.task1'
์ด ์ญ์ 1, 2์ ํด๊ฒฐ์ฑ ์ฒ๋ผ, ์ ์ญ์ผ๋ก ์ฎ๊ธฐ๊ฑฐ๋, global๋ก ์ ์ธํด ์ฃผ๋ฉด ๋๊ฒ ์ฃ ?
3์ ํด๊ฒฐ์ฑ ์ฒ๋ผtask1() ํจ์๋ฅผ ๋ณ๋ ๋ชจ๋๋ก ๋ผ์ด๋ด๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ผ ํ ๋ฐ, ์ด๊ฑด ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ๊ฒฐ์ ํ๋ฉด ๋ฉ๋๋ค. ๋ณดํต job์ ์คํํ๋ ๊ณณ์์ job์ ์ ์ํ ๋งํผ ๊ฐ๋จํ ๊ฒฝ์ฐ๋ ๋ง์ผ๋๊น ์ด๋ด ๋ ๊ตณ์ด task1() ํจ์ ํ๋๋ง ๋ชจ๋๋ก ๋ผ์ด๋ด๋ ๊ฒ์ ๋ถ์์ฐ์ค๋ฌ์ธ ํ ๋๊น์.ex3. lambda ํจ์ ์ฌ์ฉ ์ can't pickle local objects
์ด์ฏค ๋๋ฉด lambda ํจ์๋ ์์ ํจ์์ด๋, ๋น์ฐํ pickle ๋์ง ์์ ๊ฒ์ ์ ์ ์๊ฒ ์ฃ ?
import pickle var = pickle.dumps(lambda x, y: x+y)
๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๋ฅผ ์ ๋ฐํฉ๋๋ค.
Traceback (most recent call last): File "/Users/naubull2/test.py", line 2, in <module> var=pickle.dumps(lambda x, y: x+y) _pickle.PicklingError: Can't pickle <function <lambda> at 0x104c82040>: attribute lookup <lambda> on __main__ failed
lambda ํจ์๋ฅผ pickle ํ ... ์ผ์ด ์๊ฒ ๋๋ง๋.. ์ด๋ฐ ๊ฒฝ์ฐ๋ ๊ฐ๋จํ helper ํจ์๋ฅผ ํ๋ ์ ์ ํ๊ณ ์ ์ฅํ๋ ํธ์ด ๊ทธ๋๋ง ํด๊ฒฐ์ฑ ์ด ๋๊ฒ ๊ตฐ์.
# ๊ฒฐ๋ก
๊ธฐ๋ณธ์ ์ผ๋ก pickle์ ๋๋ฌด ๋งน์ ํ์ง ์๋ ๊ฒ์ด ์ข์ง๋ง, pickle ์์ฒด๋ ๊ณ ์ฑ๋ฅ serializer์ด๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ์ ํด์ผ ํ๋ค๋ฉด, ์ ์ฒด๋ฅผ ํ์คํ๊ฒ ์ดํดํ๊ณ ์ฌ์ฉํด์ผ๊ฒ ์ฃ .
๋ฌผ๋ก ๋ด๊ฐ ์ง์ ์ฌ์ฉํ์ง ์์๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์์ pickle์ serialize ์๋จ์ผ๋ก ์ธ ์ ๋ ์๊ธฐ ๋๋ฌธ์, ์์ ์์๋ค์ฒ๋ผ ์ฃผ๋ก ๋ฐ์ํ๋ ์์ธ์ scope ๋ฌธ์ ์ด๋ ์ด๋ฒ ํฌ์คํ ์ ํตํด pickle ์ค๋ฅ๋ฅผ ํด๊ฒฐํ์ค ์ ์๊ธฐ ๋ฐ๋๋๋ค.
๋ฐ์ํ'ML engineer > Papers & CS generals' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
IaaS / PaaS / SaaS (0) 2023.09.22 [coding] Notes on space complexity (0) 2023.02.06 Domain Name System (DNS) ๊ฐ์ (0) 2023.01.22 ๋ถ์ฐ ์์คํ ๋์์ธ (0) 2023.01.19 [Paper] One Embedder, Any Task: Instruction-Finetuned Text Embeddings (0) 2023.01.17 - ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ์ง๋ ฌํํ๋ฉด, ํด๋น ๊ฐ์ฒด์ ๋ํ ๊ตฌํ์ด ํ์ฌ scope์ ์กด์ฌํ์ง ์์ผ๋ฉด unpickling ํ ๋ ์ค๋ฅ๊ฐ ๋ฉ๋๋ค.