OpenAI API 응답 속도
OpenAI API를 사용하다보면 생각보다 응답 속도가 느려서 당황스러울 때가 많다. API를 한 번 호출하는데 10초가 넘게 걸리는 경우도 흔하다. 아래와 같이 간단한 질문에 걸리는 시간을 측정해보자.
import time
start = time.time()
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "코카콜라 제로도 많이 먹으면 몸에 해로울까?"}]
)
end = time.time()
print("%0.3f초" % (end - start))
print("---------------")
print(response["choices"][0]["message"]["content"])
27.347초
---------------
과도한 코카콜라 제로의 섭취는 몸에 해로울 수 있습니다. 코카콜라 제로는 인공 감미료인 아스파탐(K-Aspartame)을 함유하고 있으며, 과도한 섭취는 건강에 부정적인 영향을 줄 수 있습니다. 아스파탐은 몸 내에서 분해되어 알코올, 페닐알라닌, 아스파르틱애씨드 등으로 변화될 수 있는데, 이러한 물질은 고농도로 섭취될 경우 뇌에 독성을 초래할 수 있습니다. 또한, 코카콜라 제로에는 카페인도 포함되어 있어 과도한 카페인 섭취로 인해 수면장애, 심장의 무리한 자극, 위장 장애 등의 부작용이 발생할 수 있습니다. 따라서, 건강을 유지하기 위해서는 적절한 양의 코카콜라 제로 섭취가 필요하며, 과도한 섭취는 피하는 것이 좋습니다. 또한, 몸에 해로운 영향을 줄 수 있는 음료의 대안으로는 신선한 물, 천연 차, 건강한 주스 등을 고려해보는 것이 좋습니다.
질문 하나에 무려 27초나 걸렸다. 식당에서 음식을 주문하고 20초만에 나온다면 식당의 매출이 오를 것이다. 그런데 만약 네이버에 접속하는데 20초가 걸린다면 기다릴 수 있을까? 유튜브에서 재생버튼을 눌렀는데 20초 후에 광고가 시작된다면? 인터넷 세상에서 20초는 엄청나게 긴 시간이다. 이번 글에서는 OpenAI API의 응답속도에 영향을 미치는 요인을 알아보고, 응답 속도를 개선할 수 있는 방법을 알아보도록 하자.
응답 속도에 영향을 미치는 요인
언어 모델에서 답변 생성에 시간이 오래걸리는 이유는 무엇일까? 그것은 언어 모델이 엄청나게 거대하기 때문에 연산에 오랜 시간이 걸리기 때문이다. GPT-3.5의 경우 약 1750억개의 파라미터를 가지고, GPT-4는 정확히 알려지지는 않았지만 1.7조개 정도로 예측하고있다. 이만큼 거대한 사이즈의 모델이다보니 한 개의 입력을 계산할 때도 엄청난 양의 연산을 해야할 것이다.
그렇게 연산이 많이 필요하면 분산 컴퓨팅을 활용해서 병렬로 처리하면 되는거 아닌가?라고 생각할 수도 있지만, 병렬로 처리하는 것은 쉽지 않다. 언어 모델은 답변을 생성할 때 토큰을 하나씩 차례대로 생성하기 때문이다. 언어라는 것은 단어의 순서가 바뀌면 문법에 맞지 않거나, 심지어는 완전히 다른 의미를 가질 수도 있다. 따라서 다음에 할 말은 이전에 한 말에 영향을 받을 수 밖에 없고, 언어 모델 역시 마찬가지로 이전의 토큰에 따라 다음 토큰의 확률 분포가 달라질 수 밖에 없다. 언어 모델의 태생적 한계이다.
정리하자면, 언어 모델의 응답속도에 영향을 미치는 요인은 두 가지다. 하나는 어떤 언어 모델을 사용하느냐이고, 다른 하나는 답변의 길이가 얼마나 긴가이다. 이제 원인을 파악했으니 응답 속도를 개선해보자.
모델 변경
첫 번째 방법은 모델을 변경하는 것이다. OpenAI는 gpt-4, gpt-4-32k, gpt-3.5-turbo, gpt-3.5-turbo-16k 등 다양한 모델을 제공하고 있다. 위에서와 똑같은 질문을 gpt-4 모델을 사용해서 시간을 측정해보자.
import time
start = time.time()
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": "코카콜라 제로도 많이 먹으면 몸에 해로울까?"}]
)
end = time.time()
print("%0.3f초" % (end - start))
print("---------------")
print(response["choices"][0]["message"]["content"])
39.367초
---------------
코카콜라 제로는 설탕 대신 인공 감미료를 사용하여 제조된 음료입니다. 이로 인해 칼로리가 거의 없어 다이어트에 유리하다고 생각할 수 있지만, 과다한 섭취는 오히려 건강에 해로울 수 있습니다. 첫째, 인공 감미료가 체중 증가를 유발할 수 있습니다. 인공 감미료는 당을 섭취한 것보다 더 강하게 당류에 대한 욕구를 유발해 과식을 유발할 수 있습니다. 둘째, 인공 감미료는 당뇨병의 위험성을 증가시킬 수 있습니다. 인공 감미료는 인슐린 저항성을 유발하고, 이는 2형 당뇨병을 유발하는 주요 요인입니다. 셋째, 카페인이 과다 섭취될 경우, 불안, 불면증, 고혈압 등을 유발할 수 있습니다. 넷째, 탄산음료는 위산분비를 증가시키므로 위염이나 식도염 등 위관학적 질환에 악영향을 줄 수 있습니다. 마지막으로, 치아 손상이 있을 수 있습니다. 탄산 음료는 pH가 낮아 산성을 띄므로 치아를 쉽게 부식시키며, 이는 치아우식증의 원인이 될 수 있습니다. 결론적으로, 코카콜라 제로를 많이 마시는 것이 건강에 해롭습니다. 적정량을 지키며 섭취하는 것이 중요합니다. 무엇보다도 아무리 칼로리가 없다 해도, 음료보다는 물을 마시는 것이 건강에 이롭습니다.
무려 39초가 걸렸다. 이번에는 gpt-3.5-turbo-16k 모델을 사용해보자.
import time
start = time.time()
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-16k",
messages=[{"role": "user", "content": "코카콜라 제로도 많이 먹으면 몸에 해로울까?"}]
)
end = time.time()
print("%0.3f초" % (end - start))
print("---------------")
print(response["choices"][0]["message"]["content"])
60.230초
---------------
과도한 코카콜라 제로 섭취는 몸에 해를 끼칠 수 있습니다. 코카콜라 제로에는 인공 감미료와 인공 착향제가 함유되어 있으며, 과도한 섭취로 인해 여러 가지 부작용이 발생할 수 있습니다. 첫째, 고칼로리 음료에 비해 제로 칼로리로 표기되어 있지만, 여전히 단맛을 유발하기 위해 인공 감미료가 사용되고 있습니다. 인공 감미료는 과도한 섭취로 인해 신체에 해로울 수 있는데, 이는 신체의 혈당 조절능력과 관련된 문제를 악화시킬 수 있습니다. 둘째, 코카콜라 제로는 카페인 함유량이 매우 높습니다. 과도한 카페인 섭취는 불면증, 신경과민성, 심장 건강 문제 등을 유발할 수 있습니다. 셋째, 코카콜라 제로에는 인공 착향제도 포함되어 있습니다. 이러한 인공 착향제는 알레르기 반응이나 아픔을 유발할 수 있는데, 알레르기 반응이 있는 사람들에게는 특히 주의해야 합니다. 따라서, 코카콜라 제로를 과도하게 섭취하는 것은 건강에 해로울 수 있으므로, 적절한 섭취량을 유지하는 것이 중요합니다. 균형 잡힌 식단과 적절한 음료 섭취를 통해 건강을 유지하는 것이 좋습니다.
이번에는 1분이나 걸렸다. gpt-3.5-turbo-16k는 같은 GPT-3.5 Turbo 모델이지만, 입력의 길이가 4배로 늘어났기 때문에 연산량도 많아져서 이런 결과가 나왔을 것이다.
물론, 이 실험은 OpenAI 서버의 상태에 따라 영향을 받기도 하고, 여러번 반복해서 평균을 낸 것은 아니기 때문에 정확하지는 않다. 그러나 단순히 비교했을 때, 모델의 크기가 커지면 파라미터의 개수가 많아지고 연산에 걸리는 시간이 증가하기 때문에 오래걸린다는 것은 확인할 수 있었다. 따라서 복잡한 작업이 필요하지 않다면 작은 모델을 사용하는 것이 경제적으로나 서비스적으로도 이득이다.
참고로, gpt-4와 gpt-3.5-turbo, gpt-3.5-turbo-16k, Azure의 gpt-35-turbo의 응답시간을 확인할 수 있는 페이지가 있다.
https://gptforwork.com/tools/openai-api-and-other-llm-apis-response-time-tracker
OpenAI API and other LLM APIs response time tracker
OpenAI API and other LLM APIs response time tracker The 3 charts below track the response times of the main large language model APIs: OpenAI and Azure OpenAI (GPT-4, GPT-3.5, GPT-3), Anthropic Claude and Google PaLM. The response times are measured by gen
gptforwork.com
응답 토큰 길이
두 번째는 응답 토큰의 길이를 조절하는 것이다. 질문에 한 가지 조건을 추가해서 다시 물어보자.
import time
start = time.time()
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "코카콜라 제로도 많이 먹으면 몸에 해로울까? 한 문장으로 대답해줘."}]
)
end = time.time()
print("%0.3f초" % (end - start))
print("---------------")
print(response["choices"][0]["message"]["content"])
2.920초
---------------
과도한 코카콜라 제로 섭취는 건강에 해로울 수 있습니다.
응답시간이 거의 1/10로 줄어들었다. 답변의 길이를 조금 더 줄여보자.
import time
start = time.time()
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "코카콜라 제로도 많이 먹으면 몸에 해로울까? YES or NO"}]
)
end = time.time()
print("%0.3f초" % (end - start))
print("---------------")
print(response["choices"][0]["message"]["content"])
1.001초
---------------
NO
답변의 길이가 짧으면 짧을수록 응답 시간이 상당히 줄어드는 것을 확인할 수 있다.
OpenAI 커뮤니티에 이와 관련된 실험 결과가 있다. 같은 모델이라면 응답 시간은 응답 토큰의 길이에 정비례한다고 볼 수 있다.
https://community.openai.com/t/gpt-3-5-and-gpt-4-api-response-time-measurements-fyi/237394
GPT-3.5 and GPT-4 API response time measurements - FYI
Hi all, Since API slowness is a consistent issue, I made some experiments to test the response times of GPT-3.5 and GPT-4, comparing both OpenAI and Azure. As a reminder, mostly the response time depends on the number of output tokens generated by the mode
community.openai.com
이전 글에서 언급했지만, 응답의 길이를 줄이기 위해 max_tokens 파라미터를 사용하는 것은 바람직한 방법은 아니다.
import time
start = time.time()
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "코카콜라 제로도 많이 먹으면 몸에 해로울까?"}],
max_tokens=100
)
end = time.time()
print("%0.3f초" % (end - start))
print("---------------")
print(response["choices"][0]["message"]["content"])
7.707초
---------------
코카콜라 제로는 제로 칼로리 제품으로, 설탕 대신 인공 감미료를 사용하여 제조됩니다. 그리고 대부분은 식이섬유, 비타민 또는 미네랄이 부족합니다. 만약 코카콜라 제로를 과도하
당연하게도 응답 시간은 줄어들었지만, 답변이 완성되지 않고 중간에 끊겨버렸다. 오로지 응답 시간을 위해 서비스의 품질을 희생할 수는 없다. 따라서 max_tokens를 사용해 답변 생성을 억지로 끊어버리는 것이 아니라, 언어 모델이 짧은 답변을 하도록 프롬프트로 유도하는 것이 중요하다.
스트리밍
마지막으로, 스트리밍을 사용하는 방법이다. 전체 답변이 생성되는 시간을 줄여주지는 못하지만, 첫 응답까지 걸리는 시간은 매우 짧아진다. 또한, 실시간으로 답변이 생성되는 것을 확인할 수 있기 때문에 사용자 입장에서 지루하게 느껴지지 않는다. ChatGPT가 이러한 방식을 이용하고 있다.
스트리밍을 사용하는 방법은 간단하다. ChatCompletion에 stream이라는 파라미터를 True로 바꿔주면 된다. 그러면 응답이 chunk들의 스트림으로 오게 된다. 코드로 확인해보자.
import time
start = time.time()
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "코카콜라 제로도 많이 먹으면 몸에 해로울까?"}],
stream=True
)
end = time.time()
print("%0.3f초" % (end - start))
print("---------------")
for chunk in response:
print(chunk["choices"][0]["delta"].get("content", ""), end='')
0.779초
---------------
코카콜라 제로는 제로 칼로리 음료로 알려져 있으며, 일반적으로 여과된 물, 이산화탄소, 인공 감미료 등으로 만들어집니다. 코카콜라 제로를 많이 마셔도 몸에 직접적으로 해로울 가능성은 적습니다. 하지만, 코카콜라 제로에는 인공 감미료와 인공 조미료가 포함되어 있으므로, 몇 가지 부작용이 발생할 수 있습니다. 대량으로 섭취할 경우 소화계 문제, 복부팽만감, 신부작용, 무기력감, 거북성, 머리가 어지러움, 졸음 등이 발생할 수 있습니다. 또한 코카콜라 제로에는 카페인이 포함되어 있는데, 과도한 카페인 섭취는 수면장애, 우울, 건강에 나쁜 영향을 줄 수 있으므로 적절한 섭취량을 유지하는 것이 중요합니다. 많은 양의 코카콜라 제로를 섭취함으로 인해 호르몬 변화나 건강 문제가 발생하지는 않습니다. 하지만, 식단의 다양성과 균형을 유지하기 위해 코카콜라 제로를 너무 많이 의존하는 것은 좋지 않습니다. 건강한 식습관과 적절한 음료 섭취를 유지하는 것이 중요합니다.
0.77초만에 첫 응답이 도착했고, 실시간으로 답변이 생성되는 것을 확인할 수 있다.
3줄 요약
- 복잡한 작업이 필요하지 않다면 작은 모델을 사용하는 것이 좋다
- 응답 토큰을 줄이려면 max_tokens가 아니라 프롬프트 엔지니어링이 필요하다
- 스트리밍을 사용하면 실시간으로 답변이 생성되는 것을 확인할 수 있다
'AI > LLM' 카테고리의 다른 글
[LLM] OpenAI API function 사용법 (0) | 2023.10.28 |
---|---|
[LLM] OpenAI API Rate Limit 관리하기 (0) | 2023.10.21 |
[LLM] Prompt Engineering의 6가지 방법 (0) | 2023.10.01 |
[LLM] OpenAI API ChatCompletion 파라미터 (0) | 2023.09.23 |
[LLM] OpenAI API role 이해하기 (0) | 2023.09.17 |