본문 바로가기

TroubleShooting

인공지능학습(ChatBot) 학습 with FastAPI

  • 문제의 로그:

    ForkingPickler(file, protocol).dump(obj)
    AttributeError: Can't pickle local object 'get_cosine_schedule_with_warmup.<locals>.lr_lambda'
  • 상황:

    개발환경: 노트북 + Window + venv(python 3.7.6) + uvicorn + fastAPI + GPU 1개 + 유튜브시청상태(중요)
    FastAPI 서버실행 후 학습 KoGPT2Chat 기반 학습이 시작도 전에 trainer.fit(model) 호출과 함께 멈추는 문제 발생.
  • 내 경우 해답

    데이터 로드 시 직렬처리(DataLoader(...,num_workers=0))
    batch 감소(batch_size=64 -> batch_size=16)
  • 반성할 점

    ChatGPT 너무 갈구지 말자. 그래도 애는 참 착하다.

이전에 KoBERT(https://github.com/SKTBrain/KoBERT) 사용해서 대화의 감정추론 샘플을 배웠다.

대사 입력할 테스트 웹페이지도 필요했는데, child_process.spawn 라이브러리를 사용해 파이썬 라우터를 만들었다.

문제는 KoGPT2Chat 학습을 같은 워크플로우에 구현하면서 발생했다.

예제 찾으면서 잘 따라한 듯 했는데, 스폰 관련 오류들이 계속 떴다.

ForkingPickler(file, protocol).dump(obj)
    AttributeError: Can't pickle local object 'get_cosine_schedule_with_warmup.<locals>.lr_lambda'
...
    self = reduction.pickle.load(from_parent)
EOFError: Ran out of input

이때 검색과 ChatGPT로 원인과 방법을 조사한 결과 spawn이 중복으로 사용되어서 문제가 있다고 생각했다.(그 말을 믿지 말았어야지!)

그래서 파이썬 함수 호출을 FastAPI 방식으로 수정했는데, 그 ForkingPickler 오류는 여전했다.

그래서 다시금 차근차근 예제 코드를 확인해봤는데, 개발환경 차이를 더 꼼꼼히 살펴봤어야했다.

    ...
    def train_dataloader(self):
        data = pd.read_csv('데이터 파일')
        self.train_set = CharDataset(data, max_len=self.hparams.max_len)
        train_dataloader = DataLoader(
            self.train_set, batch_size=self.hparams.batch_size, num_workers=2,
            shuffle=True, collate_fn=self._collate_fn)
        return train_dataloader

num_workers 매개변수가 2로 설정 되어 있는데, 나는 우선 병렬처리를 포기하고 0으로 변경했다.
PyTorch 문서를 보면 윈도우의 경우 멀티 프로세싱을 위해 두 가지 확인이 필요했고, 디버깅 단계에서는 직렬처리를 장려했다.(https://pytorch.org/docs/stable/data.html)

Wrap most of you main script’s code within if __name__ == '__main__': block, to make sure it doesn’t run again (most likely generating error) when each worker process is launched. You can place your dataset and DataLoader instance creation logic here, as it doesn’t need to be re-executed in workers.

Make sure that any custom collate_fn, worker_init_fn or dataset code is declared as top level definitions, outside of the __main__ check. This ensures that they are available in worker processes. (this is needed since functions are pickled as references only, not bytecode.)

이후 메모리 부족 로그도 있었는데, 이는 학습 옵션 중 배치 크기를 줄이며 해결했다.(batch_size=64 -> batch_size=16)

torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 400.00 MiB (GPU 0; 6.00 GiB total capacity; 5.19 GiB already allocated; 0 bytes free; 5.30 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

'TroubleShooting' 카테고리의 다른 글

Stable-Diffusion-Webui(DDSD)  (0) 2023.06.02
Install Jupyter-Notebook on AWS EC2 server.  (0) 2022.10.12
Unreal AR with Android  (0) 2022.06.07
웹 앱 호스팅  (0) 2022.04.29
Merge video and audio (with MediaRecorder)  (0) 2022.03.21