🤔 의문이 든 이유?
가장 첫번째 이슈글에서 LM Studio, FastAPI, 프론트코드 이렇게 세개를 조합해서 구현을 해보았다. 그런데 갑자기 든 생각이 모델을 대신 구동해주기 위해서 LM Studio를 쓰는걸로 생각했는데(아닐수도) 그렇다면, 그냥 굳이 LM Studio를 안쓰고 코랩에서 기본 GPU만으로 모델의 응답을 받아올 순 없는건가?라는 생각이 들었다.
많은 시도 끝에, 코랩의 기본 GPU만으로(유료 버전X) 일단 응답을 받아오는 건 성공하였다.
코드를 첨부하겠다.
🔶 Colab의 ipynb코드
cell별로 묶어놓았다.
(1) 일단 필요한 라이브러리를 설치한다.
# 라이브러리 설치
!pip install pyngrok
!pip install fastapi uvicorn pydantic langchain transformers
!pip install langchain_community
(2) 모델이 응답을 잘 받아오나 테스트
이 코드에서는 프론트랑 연결해본 건 아니고, 단순히 llm.generate를 사용해서 테스트할 입력 문장인 input_message에 대해서 응답을 도출하는지만 확인하였다.
모델에 따라서 응답 형태가 다를 수도 있기 때문에 이 코드에서 응답 형태를 확인하고 가져다가 사용하려고 하였다.
# 모델이 응답을 잘 받아오나 테스트 해보기
from langchain.llms import HuggingFaceHub
# Hugging Face Hub API 토큰 설정
huggingfacehub_api_token = "허깅페이스에서 write용 토큰 가져다가 넣어야해요"
# HuggingFaceHub 객체 생성
llm = HuggingFaceHub(
repo_id="microsoft/Phi-3-mini-4k-instruct",
task="text-generation",
model_kwargs={"temperature": 0.7},
huggingfacehub_api_token=huggingfacehub_api_token
)
# 테스트할 입력 문장
input_message = "안녕하세요."
# 'prompts' 설정
prompts = [input_message]
# llm.generate 메소드 호출
try:
response = llm.generate(prompts=prompts)
print("응답:", response)
# generations 필드에서 text 추출
generations_list = response.generations[0] # generations는 리스트 안에 리스트 형태이므로 첫 번째 원소 선택
generated_text = generations_list[0].text # 첫 번째 리스트에서 첫 번째 Generation 객체의 text 필드 추출
print("생성된 텍스트:", generated_text)
except Exception as e:
print("오류 발생:", e)
🔊 여기서 왜 뜬금없이 "microsoft/Phi-3-mini-4k-instruct"모델을 사용했냐고 궁금할 수 있는데, 맨 처음에는 우리가 올려놓은 sangthree/meta_0706모델을 로드하려고 하였다.
그런데 sangthree/meta_0706모델을 로드하려고 하니, 다음과 같은 에러가 떴다.
오류 발생: (Request ID: viRbHJOScYrIqhKnsCtcA)
403 Forbidden: None.
Cannot access content at: https://api-inference.huggingface.co/models/sangthree/meta_0706.
If you are trying to create or update content,make sure you have a token with the write role.
The model sangthree/meta_0706 is too large to be loaded automatically (16GB > 10GB). Please use Spaces (https://huggingface.co/spaces) or Inference Endpoints (https://huggingface.co/inference-endpoints).
해당 오류 메시지는 Hugging Face의 API에서 모델을 로드하려고 할 때, 모델의 크기가 너무 커서 로드할 수 없다고 뜬 것이었다.
모델의 크기가 10GB를 초과하면 자동으로 로드되지 않는다고 한다. 모델 sangthree/meta_0706의 크기가 16GB여서 10GB를 초과해서 로드할 수 없다고 뜬다.
뭐.. 해결 방식으로는 Hugging Face의 Spaces기능(Spaces 기능을 사용하여 모델을 관리하고, 필요할 때 로드하십시오. Spaces는 모델을 공유하고 관리하기 위한 환경을 제공)을 사용하거나, Inference Endpoints(Inference Endpoints를 통해 모델을 호스팅하고, 웹 서비스나 애플리케이션에서 API 호출을 통해 접근할 수 있음)를 사용해서 해결할 수 있다고 하는데...아직 이 방법에 대해서는 찾아보지 않았다.
이걸 해결한다면, colab만으로도 응답을 받아올 수 있을텐데..
암튼 그래서 hugging face에서 정말ㅋㅋ아무 모델이나 10GB를 초과하지 않는걸 가져다가 넣은거다. 영어모델이라서 한국어로 응답이 안될거다. 근데 LM Studio없이 colab으로만으로도 응답이 잘 받아와지는지 테스트만 하기 위해서 아무 모델이나 가져왔다.
암튼 위의 코드를 돌리면 다음과 같은 구성의 응답이 나온다. 아마 구성은 모델에 따라 다를수도 있겠다는 생각이 든다.

여기서 나는 응답만 가져다가 사용할거다.
(3) 들어오는 입력에 대한 답을 프론트로 다시 보내는 fastAPI코드
자 위에서 응답이 오는걸 테스트 했으니, 이제 fastAPI 서버 코드를 작성할 차례다.
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from langchain.llms import HuggingFaceHub
app = FastAPI()
# CORS 설정
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 모든 origin 허용
allow_credentials=True,
allow_methods=["POST"],
allow_headers=["Content-Type"],
)
# Hugging Face Hub API 토큰 설정
huggingfacehub_api_token = "WRITE용 토큰 넣으세요~"
# HuggingFaceHub 객체 생성
llm = HuggingFaceHub(
repo_id="microsoft/Phi-3-mini-4k-instruct", # 10GB이하의 모델만 작동됨..
task="text-generation",
model_kwargs={"temperature": 0.9},
huggingfacehub_api_token=huggingfacehub_api_token
)
class Message(BaseModel):
question: str # 클라이언트에서 question 필드로 전송될 것으로 기대
@app.post("/chat")
async def chat_with_bot(message: Message):
try:
# 클라이언트로부터 받은 질문을 llm.generate()에 전달
response = llm.generate(prompts=[message.question])
print("응답:", response)
# generations 필드에서 text 추출
generations_list = response.generations[0] # generations는 리스트 안에 리스트 형태이므로 첫 번째 원소 선택
generated_text = generations_list[0].text # 첫 번째 리스트에서 첫 번째 Generation 객체의 text 필드 추출
print("생성된 텍스트:", generated_text)
return {"response": generated_text} # JSON 형태로 응답
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/")
async def root():
return {"message": "online"}
이렇게 fastAPI서버 객체가 app안에 담겼다.
근데 사실 이 fastAPI서버 자체는 내 로컬에서만 생성되는 서버라서, 이걸 공용 URL로 띄우고 싶다. 또한, python파일일 경우, fastAPI 코드를 실행시키는 방법의 명령어가 따로 있는데, 이 파일은 ipynb파일이기 때문에 실행시킬수가 없다(colab에서는 대부분 ipynb만 다루기 때문에...). 그래서 ngrok로 연결하기로 했다.
(4) ngrok연결
이걸 해보려면, ngrok사이트에 들어가서 구글 계정으로 회원가입 후, 개인의 토큰을 알아내야한다.
# ngrok 연결
import nest_asyncio
from pyngrok import ngrok
import uvicorn
auth_token = "ngrok토큰 가져오세요"
ngrok.set_auth_token(auth_token)
ngrokTunnel = ngrok.connect(8000)
print("공용 URL", ngrokTunnel.public_url)
nest_asyncio.apply()
uvicorn.run(app, port=8000)

보안상 가렸다.
🔶 프론트에서 Chat.jsx코드
import React, { useState } from 'react';
import Layout from '../../components/Layout/Layout';
import { useNavigate } from 'react-router-dom';
import Alert from '../../components/Alert/Alert';
import styles from './Chat.module.scss';
function Chat() {
const [messages, setMessages] = useState([]);
const [userMessage, setUserMessage] = useState('');
const [loading, setLoading] = useState(false);
const [showAlert, setShowAlert] = useState(false);
const navigate = useNavigate();
const handleInputChange = (e) => {
setUserMessage(e.target.value);
};
const handleSendMessage = async () => {
if (!userMessage.trim()) return;
const newMessages = [...messages, { sender: '사용자', text: userMessage }];
setMessages(newMessages);
setUserMessage('');
setLoading(true);
try {
const response = await fetch('공용URL주소 넣으세요~~.ngrok-free.app/chat', { // FastAPI 서버 URL로 수정
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ question: userMessage }) // 서버에서 question 필드로 요청을 받기 때문에 수정
});
const data = await response.json();
setMessages([...newMessages, { sender: '컴퓨터', text: data.response }]);
} catch (error) {
console.error('Error:', error);
setMessages([...newMessages, { sender: '컴퓨터', text: 'Error: 응답을 가져올 수 없습니다.' }]);
} finally {
setLoading(false);
}
};
const handleStopClick = () => {
setShowAlert(true);
};
const handleCloseAlert = () => {
setShowAlert(false);
};
const handleConfirmExit = () => {
navigate('/result');
};
return (
<Layout>
<div className={styles.chatContainer}>
<div className={styles.chatWrapper}>
<div className={styles.chatHeader}>
<h1>역할놀이 챗봇</h1>
<button className={styles.stopButton} onClick={handleStopClick}>
X
</button>
</div>
<div className={styles.chatBody}>
{messages.map((msg, index) => (
<div key={index} className={`${styles.message} ${msg.sender === '사용자' ? styles.userMessage : styles.computerMessage}`}>
<strong>{msg.sender}:</strong> {msg.text}
</div>
))}
</div>
<div className={styles.userInput}>
<input
type="text"
id="user-message"
value={userMessage}
onChange={handleInputChange}
placeholder="메시지를 입력하세요..."
className={styles.userMessageInput}
/>
<button className={styles.sendButton} onClick={handleSendMessage}>
전송
</button>
</div>
{loading && <div className={styles.loading}>로딩 중...</div>}
</div>
{showAlert && (
<Alert
message="정말로 종료하시겠습니까?"
onConfirm={handleConfirmExit}
onCancel={handleCloseAlert}
/>
)}
</div>
</Layout>
);
}
export default Chat;
🔶 결과

코랩의 기본 GPU만으로도 응답을 받아올 수 있었다.
✏️ 해당 이슈와 관련된, 미해결 문제들
1. 모델 사이즈 문제 --> 해결 방안?
위에서 sangthree/meta_0706모델이 10GB가 넘어서 사용할 수 없었다.
해결 방안으로 Spaces나 Inference Endpoints사용이 있다는데, 아직 찾아볼 시간이 없어서 못찾아보았다.
이 두 해결방안에 대해 알아보면 좋겠다.
2. LM Studio를 그래서 사용해야할까 말까?
LM Studio가 꼭 필요해야만 하는 줄 알았는데.. 뭐 어찌저찌해서 없이도 모델의 응답을 받아오는데 성공했다. 어떤 방법을 선택하는게 좋은 선택일까? 모르겠다.
🤔 의문이 든 이유?
가장 첫번째 이슈글에서
LM Studio, FastAPI, 프론트코드이렇게 세개를 조합해서 구현을 해보았다. 그런데 갑자기 든 생각이 모델을 대신 구동해주기 위해서 LM Studio를 쓰는걸로 생각했는데(아닐수도) 그렇다면, 그냥 굳이 LM Studio를 안쓰고 코랩에서 기본 GPU만으로 모델의 응답을 받아올 순 없는건가?라는 생각이 들었다.많은 시도 끝에, 코랩의 기본 GPU만으로(유료 버전X) 일단 응답을 받아오는 건 성공하였다.
코드를 첨부하겠다.
🔶 Colab의 ipynb코드
cell별로 묶어놓았다.
(1) 일단 필요한 라이브러리를 설치한다.
(2) 모델이 응답을 잘 받아오나 테스트
이 코드에서는 프론트랑 연결해본 건 아니고, 단순히 llm.generate를 사용해서 테스트할 입력 문장인 input_message에 대해서 응답을 도출하는지만 확인하였다.
모델에 따라서 응답 형태가 다를 수도 있기 때문에 이 코드에서 응답 형태를 확인하고 가져다가 사용하려고 하였다.
🔊 여기서 왜 뜬금없이
"microsoft/Phi-3-mini-4k-instruct"모델을 사용했냐고 궁금할 수 있는데, 맨 처음에는 우리가 올려놓은sangthree/meta_0706모델을 로드하려고 하였다.그런데
sangthree/meta_0706모델을 로드하려고 하니, 다음과 같은 에러가 떴다.해당 오류 메시지는 Hugging Face의 API에서 모델을 로드하려고 할 때, 모델의 크기가 너무 커서 로드할 수 없다고 뜬 것이었다.
모델의 크기가 10GB를 초과하면 자동으로 로드되지 않는다고 한다. 모델 sangthree/meta_0706의 크기가 16GB여서 10GB를 초과해서 로드할 수 없다고 뜬다.
뭐.. 해결 방식으로는 Hugging Face의 Spaces기능(Spaces 기능을 사용하여 모델을 관리하고, 필요할 때 로드하십시오. Spaces는 모델을 공유하고 관리하기 위한 환경을 제공)을 사용하거나, Inference Endpoints(Inference Endpoints를 통해 모델을 호스팅하고, 웹 서비스나 애플리케이션에서 API 호출을 통해 접근할 수 있음)를 사용해서 해결할 수 있다고 하는데...아직 이 방법에 대해서는 찾아보지 않았다.
이걸 해결한다면, colab만으로도 응답을 받아올 수 있을텐데..
암튼 그래서 hugging face에서 정말ㅋㅋ아무 모델이나 10GB를 초과하지 않는걸 가져다가 넣은거다. 영어모델이라서 한국어로 응답이 안될거다. 근데 LM Studio없이 colab으로만으로도 응답이 잘 받아와지는지 테스트만 하기 위해서 아무 모델이나 가져왔다.
암튼 위의 코드를 돌리면 다음과 같은 구성의 응답이 나온다. 아마 구성은 모델에 따라 다를수도 있겠다는 생각이 든다.

여기서 나는 응답만 가져다가 사용할거다.
(3) 들어오는 입력에 대한 답을 프론트로 다시 보내는 fastAPI코드
자 위에서 응답이 오는걸 테스트 했으니, 이제 fastAPI 서버 코드를 작성할 차례다.
이렇게 fastAPI서버 객체가 app안에 담겼다.
근데 사실 이 fastAPI서버 자체는 내 로컬에서만 생성되는 서버라서, 이걸 공용 URL로 띄우고 싶다. 또한, python파일일 경우, fastAPI 코드를 실행시키는 방법의 명령어가 따로 있는데, 이 파일은 ipynb파일이기 때문에 실행시킬수가 없다(colab에서는 대부분 ipynb만 다루기 때문에...). 그래서 ngrok로 연결하기로 했다.
(4) ngrok연결
이걸 해보려면, ngrok사이트에 들어가서 구글 계정으로 회원가입 후, 개인의 토큰을 알아내야한다.
보안상 가렸다.
🔶 프론트에서 Chat.jsx코드
🔶 결과
코랩의 기본 GPU만으로도 응답을 받아올 수 있었다.
✏️ 해당 이슈와 관련된, 미해결 문제들
1. 모델 사이즈 문제 --> 해결 방안?
위에서
sangthree/meta_0706모델이 10GB가 넘어서 사용할 수 없었다.해결 방안으로
Spaces나Inference Endpoints사용이 있다는데, 아직 찾아볼 시간이 없어서 못찾아보았다.이 두 해결방안에 대해 알아보면 좋겠다.
2. LM Studio를 그래서 사용해야할까 말까?
LM Studio가 꼭 필요해야만 하는 줄 알았는데.. 뭐 어찌저찌해서 없이도 모델의 응답을 받아오는데 성공했다. 어떤 방법을 선택하는게 좋은 선택일까? 모르겠다.