-
[yongggg's] sglang.Engine errorError 관련 2024. 12. 4. 15:04
안녕하세요. 이번 장에서는 요새 vllm 보다 효율적이고 빠른 inference를 하는데 빠르다고 알려진 sglang의 Engine 정의 시, 나오는 error에 대해서 알아보겠습니다.
저는 API를 바로 짜서 호출하는 방식으로 test 하기 보다는, 먼저 모델의 inference 를 testing 하는 성격이어서, jupyter를 사용하여 output을 찍어보곤 합니다.
최근에 우연히 알게 되어서 사용을 해보고 싶은 sglang 이라는 framework도 Jupyter로 띄워서 사용을 해보려고 했으나, initial 부터 error에 직면하게 되었습니다...ㅠ 한 2일 동안 계속 환경 설정 setting만 바꾼 것 같은데 혹시 다른 분들도 이런 error가 나온다면, 저와 같은 삽질을 안하시길 빌면서 글을 작성합니다..!!
sglang의 기본 documentation에서 환경설정을 해준 뒤 (저는 docker image를 그대로 받아왔습니다.), 다음과 같이 모델을 정의 해주면,
from transformers import AutoModelForCausalLM, AutoTokenizer import torch model_path = "Qwen/Qwen2.5-7B-Instruct-GPTQ-Int4" tokenizer = AutoTokenizer.from_pretrained(model_path) # model = AutoModelForCausalLM.from_pretrained(model_path) # You may want to use bfloat16 and/or move to GPU here import sglang as sgl import asyncio sampling_params = {"temperature": 0.8, "top_p": 0.95} llm = sgl.Engine(model_path=model_path, mem_fraction_static = 0.7)
아래와 같은 error가 나오는 것을 볼 수 있습니다.
RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase. This probably means that you are not using fork to start your child processes and you have forgotten to use the proper idiom in the main module: if __name__=='__main__': freeze_support() ... The "freeze_support()" line can be omitted if the program is not going to be frozen to produce an executable
저는 이 error를 마주하고, 환경세팅을 다시하는 것과, sglang 여러 내부에 if 문을 넣어주었지만... 전혀 소용이 없었습니다.
다만, 아래와 같이 Engine을 정의할 때, main 함수에 넣어주고 그것을 불러주면 해당 error는 나오지 않았습니다.
저는 임시로 jupyter에서 prompt를 빠르게 inference를 하는 목적이었기에 다음 처럼 코드를 구성해서 해당 error를 해결 했습니다.
from transformers import AutoModelForCausalLM, AutoTokenizer import torch model_path = "Qwen/Qwen2.5-7B-Instruct-GPTQ-Int4" tokenizer = AutoTokenizer.from_pretrained(model_path) # model = AutoModelForCausalLM.from_pretrained(model_path) # You may want to use bfloat16 and/or move to GPU here import sglang as sgl import asyncio def main(): sampling_params = {"temperature": 0.8, "top_p": 0.95} llm = sgl.Engine(model_path=model_path, mem_fraction_static = 0.7) return llm if __name__ == "__main__": llm = main() sampling_params = {"temperature": 0.8, "top_p": 0.95, "max_new_tokens": 1000, "stop" : ['[End]','[Note','[답변]','[Example start]','[Example end]','[Answer start]','[Explanation]','[Output','Your task is']} llm.generate("안녕 반가워.", sampling_params)
이렇게 한 번 jupyter로 돌려주고 나니, 왠지는 모르지만 그 다음부터 Engine을 main 함수 안에 사용하지 않아도 initializing이 되었습니다!
이 내용은 official documentation의 기본 Tutorial 쪽이 아니라, Backend: SGLang Runtime(SRT) 부분을 보고 힌트를 얻었습니다. 참고해주시면 감사하겠습니다.
https://sgl-project.github.io/backend/backend.html
'Error 관련' 카테고리의 다른 글