Cerebras Cloud API와 W&B Weave로 세계에서 가장 빠른 챗봇 만들기
W&B Weave와 함께 Cerebras Cloud API를 시작하는 가이드. 이 글은 AI로 번역되었습니다. 오역이 의심되면 댓글로 알려주세요.
Created on September 12|Last edited on September 12
Comment
Cerebras가 Cerebras Inference를 출시했습니다세계에서 가장 빠른 AI 추론 솔루션으로, Llama 3.1 8B는 초당 1,800토큰, Llama 3.1 70B는 초당 450토큰을 처리합니다. 이는 NVIDIA GPU 기반 클라우드보다 최대 20배 빠릅니다. 3세대 Wafer-Scale Engine(WSE-3)으로 구동되는 Cerebras Inference는 전례 없는 속도와 비용 효율을 제공하며, Llama 3.1 8B는 백만 토큰당 10센트, Llama 3.1 70B는 백만 토큰당 60센트로 동작합니다.
이 종합 가이드에서는 CS‑3 시스템의 혁신적인 기능을 살펴보고, Cerebras Inference 설정 방법을 단계별로 안내하며, Llama 3.1 70B 모델을 통합해 가장 빠른 챗봇 중 하나를 만드는 방법을 보여드리겠습니다. W&B Weave.

목차
Cerebras Cloud의 차별점은 무엇인가요?희소성 가속화
분산 메모리 아키텍처
웨이트 스트리밍
확장 가능한 패브릭
생성형 AI 애플리케이션에서 지연시간의 중요성Cerebras Cloud API: Weave를 활용한 성능 모니터링더 빠른 챗봇 만들기W&B Weave 사용하기컨텍스트 관리 핵심 로직 추론의 미래
Cerebras Cloud의 차별점은 무엇인가요?
이제 Cerebras Cloud를 통해 제공되는 CS‑3 시스템은 간단한 API로 웨이퍼 스케일 컴퓨팅을 활용해 AI 추론을 수행할 수 있게 해 줍니다. 속도를 위해 정확도를 희생하는 경쟁 솔루션과 달리, CS‑3는 최첨단 정밀도를 유지하며 Llama 3.1 8B의 경우 초당 최대 1,700토큰, Llama 3.1 70B의 경우 초당 450토큰을 처리합니다. 또한 추론 전 과정에서 16비트 정밀도를 일관되게 유지합니다.
그렇다면 Cerebras의 이 새로운 칩은 무엇이 다르고, 어떻게 전통적인 GPU보다 훨씬 빠를 수 있을까요? 그 방법을 살펴보겠습니다.
희소성 가속화
Cerebras 아키텍처는 비정형 희소성을 가속하는 데 뛰어납니다. 신경망 많은 파라미터(가중치)가 0이거나 0에 가깝기 때문에 네트워크 출력에 거의 영향을 미치지 않는 경우가 있습니다. Cerebras는 이러한 중요하지 않은 연산을 효율적으로 건너뛰고, 의미 있는 가중치에만 집중합니다. 이는 0을 포함한 모든 가중치를 그대로 처리해 비효율과 더 긴 처리 시간으로 이어지는 전통적인 GPU 방식과 대조적입니다.
분산 메모리 아키텍처
이 칩은 분산형 정적 RAM(SRAM) 아키텍처를 적용해 각 코어에 로컬 SRAM을 제공합니다. 이 구성은 전통적인 공유 메모리에서 발생하는 병목을 제거하여 메모리 대역폭을 높이고 데이터 이동 지연시간을 줄입니다. 즉, 모든 코어가 하나의 메모리 풀에 접근하기 위해 경쟁하는 방식(GPU처럼) 대신, Cerebras 칩의 각 코어는 전용 메모리를 갖습니다. 그 결과 대기 시간이 크게 줄어들고 데이터 처리 속도가 빨라지며, 이는 GPU에서 사용되는 공유 메모리 방식 대비 큰 이점입니다.
웨이트 스트리밍
Cerebras는 대규모 모델을 효율적으로 학습하고 추론할 수 있게 하는 웨이트 스트리밍 기법을 활용합니다. 가중치는 MemoryX라는 외부 메모리 유닛에 저장되고, 필요할 때 시스템으로 스트리밍되어 온칩 메모리 용량의 한계 없이 대형 모델을 처리할 수 있습니다. 즉, 모든 모델 데이터를 칩에 직접 저장해 제약을 받는 대신, Cerebras는 필요할 때 필요한 데이터만 가져옵니다. 이는 온칩 메모리가 빠르게 병목이 되어 처리 가능한 모델의 크기와 복잡도를 제한할 수 있는 GPU와는 다른 방식입니다.
확장 가능한 패브릭
Cerebras는 2차원 메시 토폴로지를 활용해 코어를 연결하는 고대역폭·저지연 패브릭을 통합했습니다. 이를 통해 칩이 하나의 응집된 유닛처럼 동작하고, SwarmX 인터커넥트 패브릭을 통해 단일 칩을 넘어 원활하게 확장할 수 있습니다. 본질적으로 이 패브릭은 모든 코어를 초고속 네트워크로 연결해 코어들이 완벽한 조화로 작동하도록 합니다. 전통적인 GPU는 코어를 연결하는 방식이 달라 코어 수가 늘어날수록 지연이 발생하고 효율이 떨어질 수 있습니다. Cerebras의 접근 방식은 시스템이 확장되더라도 속도와 효율을 유지하도록 보장합니다.
생성형 AI 애플리케이션에서 지연시간의 중요성
지연시간은 AI 애플리케이션에서 매우 중요한 요소이며, 특히 실시간 처리와 빠른 응답이 요구되는 상황에서 그 중요성이 더욱 큽니다. AI 기반 챗봇의 맥락에서는, 추천 시스템또는 어떤 대화형 애플리케이션이든, 지연시간을 줄이면 더 빠르고 정확한 응답을 제공하고, 여러 단계를 연쇄할 때 더 발전된 로직을 사용할 수 있어 사용자 경험에 직접적인 영향을 미칩니다 대규모 언어 모델 호출을 함께 묶습니다.
Cerebras와 같은 솔루션으로 속도의 한계를 넓혀 갈수록, 지연시간이 줄어들어 AI 애플리케이션에서 새로운 기능과 가능성이 열립니다.
예를 들어, 더 빠른 모델 추론은 처리 속도가 느려 비현실적이었던 복잡하고 대화형 애플리케이션의 개발을 가능하게 합니다. 이를 통해 실시간 언어 번역, 고급 예측 분석, 동적 콘텐츠 생성 등 더 정교한 작업을 최소한의 지연으로 처리할 수 있습니다.
또한 지연시간이 낮아지면, 모델 복잡도와 속도 간의 절충을 관리하기 위해 흔히 쓰이던 retrieval‑augmented generation 같은 전통적 기법의 필요성이 줄어들 수 있습니다. RAG는 보통 외부 데이터베이스에서 관련 정보를 검색해 AI 모델의 응답을 보완함으로써, 더 복잡한 모델의 느린 처리 시간을 상쇄합니다. 그러나 Cerebras가 제공하는 속도라면, 매우 큰 컨텍스트 윈도우를 갖춘 더 큰 모델을 실제로 실행할 수 있어 이러한 기법이 굳이 필요하지 않을 수 있습니다.
Cerebras Cloud API: Weave를 활용한 성능 모니터링
이 튜토리얼을 시작하기 전에, Python 3.9 이상이 실행되는 환경과 다음 pip 패키지가 준비되어 있는지 확인하세요:
pip install -U cerebras_cloud_sdk weave flask transformers
Llama 3.1 모델을 Cerebras Cloud에서 실행할 때 성능을 효과적으로 모니터링하고 평가하기 위해, 모델 추론 중 메트릭을 기록하고 추적하는 도구인 W&B Weave를 사용하겠습니다. Weave를 Cerebras Cloud 워크플로에 통합하면 콘솔에서 토큰/초와 같은 핵심 성능 지표는 물론 모델의 입력과 출력까지 손쉽게 모니터링할 수 있습니다.
일반적으로 Weave에 로그를 기록하려면, 다음을 추가해야 합니다 @weave.op 데코레이터를 해당 함수에 추가해 그 함수의 입력과 출력을 로깅합니다. 그러나 Weave는 Cerebras API에 네이티브로 통합되어 있으므로, 이제는 다음을 호출하기만 하면 됩니다 weave.init("your_project_name") 그리고 API에 대한 모든 호출은 Weave에 로깅됩니다! 다음은 링크입니다 Weave 문서 Weave에 대해 더 알아보고 싶다면!
다음 코드는 Cerebras Cloud API로 추론을 실행할 수 있는 예시입니다:
from cerebras.cloud.sdk import Cerebrasimport weave# Initialize Weave for loggingweave.init("cerebras_llama31_performance")# Hardcoded API key for Cerebras InferenceCEREBRAS_API_KEY = "your api key"# Initialize the Cerebras client with the API keyclient = Cerebras(api_key=CEREBRAS_API_KEY)# No Weave Op needed due to native integrationdef run_inference(prompt: str):# Perform inferencechat_completion = client.chat.completions.create(messages=[{"role": "user","content": prompt,}],model="llama3.1-8b",)# Extract the content of the responseresponse_content = chat_completion.choices[0].message.contentreturn {"response": response_content,}# Example usageprompt = "Why is fast inference important?"# Parse the response and get results for the Cerebras LLaMA 3.1-8B modelresults = run_inference(prompt)# Example of using the returned resultsprint(f"Results: {results}")
제공된 코드 스니펫에서는 프로젝트 이름으로 Weave를 초기화합니다 cerebras_llama31_performance을 사용하면 특정 프로젝트 아래에 로그와 메트릭을 체계적으로 정리하고 저장할 수 있습니다.
The run_inference 함수는 코드의 핵심 구성 요소입니다. 사용자 제공 프롬프트로 모델 추론을 실행하는 것으로 시작해, 전체 추론 워크플로를 처리합니다. Cerebras 클라이언트의 응답은 파싱되어 콘텐츠를 추출하고 결과를 반환합니다. Weave가 Cerebras API에 네이티브로 통합되어 있고, 프로젝트 이름으로 Weave가 초기화되어 있기 때문에 API에 대한 모든 호출은 자동으로 Weave에 로깅됩니다!
스크립트를 실행한 후에는 Weights & Biases의 Weave 트레이스 뷰에서 다음과 같은 로그를 확인할 수 있습니다:

더 빠른 챗봇 만들기
이 섹션에서는 Cerebras Cloud 플랫폼을 사용해 고성능 챗봇을 만드는 데 집중합니다. 목표는 빠르게 응답할 뿐 아니라 대화 맥락을 효과적으로 유지하고, 구현 자체는 단순하게 유지해 원하는 기능을 손쉽게 추가할 수 있는 챗봇을 구축하는 것입니다.
전체 애플리케이션이 단일 스크립트에 모두 포함되어 있어 실행과 배포가 쉽습니다. 다음은 API를 실험해 볼 수 있는 단일 스크립트입니다. 다음은 링크 Github에서 코드를 확인하려면 다음을 참조하세요.
이 스크립트에는 인라인 HTML이 포함되어 있으며, 다소 “편법”처럼 보일 수 있지만, Cerebras Cloud API와 W&B Weave의 강점을 잘 보여 주는 예시입니다.
💡
import osfrom flask import Flask, request, render_template_stringimport threadingimport sysfrom transformers import AutoTokenizerfrom cerebras.cloud.sdk import Cerebrasimport weave# Initialize Weave for loggingweave.init("cerebras_llama31_performance")# Flask app initializationapp = Flask(__name__)# Load API key from file if it existsAPI_KEY_FILE = "cerebras_api_key.txt"CEREBRAS_API_KEY = Nonedef load_api_key():global CEREBRAS_API_KEYif os.path.exists(API_KEY_FILE):with open(API_KEY_FILE, "r") as file:CEREBRAS_API_KEY = file.read().strip()if CEREBRAS_API_KEY:initialize_cerebras_client()def save_api_key(api_key):global CEREBRAS_API_KEYCEREBRAS_API_KEY = api_keywith open(API_KEY_FILE, "w") as file:file.write(api_key)initialize_cerebras_client()def initialize_cerebras_client():global clientclient = Cerebras(api_key=CEREBRAS_API_KEY)# Load the API key at startupload_api_key()# Check for --test and --port in the command line argumentsis_test = '--test' in sys.argvport_index = sys.argv.index('--port') if '--port' in sys.argv else Noneport = int(sys.argv[port_index + 1]) if port_index else 5001# Initialize tokenizer from Hugging Face modeltokenizer = AutoTokenizer.from_pretrained("akjindal53244/Llama-3.1-Storm-8B")# Determine if token-based or character-based context length is useduse_token_context = '--token_contextlen' in sys.argvchar_context_len = int(sys.argv[sys.argv.index('--char_contextlen') + 1]) if '--char_contextlen' in sys.argv else Nonetoken_context_len = int(sys.argv[sys.argv.index('--token_contextlen') + 1]) if '--token_contextlen' in sys.argv else 8000# Cache to hold previous chat messages and responseschat_cache = []def manage_cache(prompt):global chat_cacheif use_token_context:# Tokenize the full conversationall_tokens = tokenizer.encode("".join(chat_cache + [prompt]), add_special_tokens=False)# Keep only the last token_context_len tokensif len(all_tokens) > token_context_len:all_tokens = all_tokens[-token_context_len:]# Decode back to text for processingchat_cache = [tokenizer.decode(all_tokens, skip_special_tokens=True)]print(len(chat_cache))else:# Character-based context managementchat_cache.append(prompt)if len("".join(chat_cache)) > char_context_len:# Trim chat cache to fit within the character context lengthwhile len("".join(chat_cache)) > char_context_len:chat_cache.pop(0)@app.route('/chat')def chat():return render_template_string(html_content)@app.route('/clear_chat', methods=['POST'])def clear_chat():global chat_cachechat_cache.clear()return 'Cleared'@app.route('/save_api_key', methods=['POST'])def save_api_key_route():data = request.jsonapi_key = data.get("api_key")if api_key:save_api_key(api_key)return "API Key Saved"def perform_inference(prompt):if not CEREBRAS_API_KEY:return "API Key not set. Please enter your Cerebras API Key."chat_completion = client.chat.completions.create(messages=[{"role": "user","content": prompt,}],model="llama3.1-70b",)response_content = chat_completion.choices[0].message.contentreturn response_content@app.route('/send_message', methods=['POST'])def send_message():global chat_cachedata = request.jsonnew_prompt = f"User: {data['prompt']}\n"# Manage context based on token or character lengthmanage_cache(new_prompt)full_prompt = ''.join(chat_cache)try:response_content = perform_inference(full_prompt)if "```" in response_content:parts = response_content.split("```")for i in range(1, len(parts), 2):code_content = parts[i].strip().split('\n', 1)if len(code_content) > 1 and code_content[0].strip() in ["python", "cpp", "javascript", "java", "html", "css", "bash","csharp", "go", "ruby", "php", "swift", "r", "typescript", "kotlin", "dart"]:parts[i] = "<pre><code>" + code_content[1].strip() + "</code></pre>"else:parts[i] = "<pre><code>" + parts[i].strip() + "</code></pre>"response_content = "".join(parts)else:response_content = f'<div class="bot-message">{response_content}</div>'api_response = f"Bot: {response_content}\n"chat_cache.append(api_response)return api_responseexcept Exception as e:print(f"Exception caught: {e}")return str(e)html_content = """<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Chat with API</title><style>body, html {height: 100%;margin: 0;font-family: Arial, sans-serif;display: flex;flex-direction: column;background-color: #f8f9fa;}#chat-container {flex-grow: 1;overflow-y: auto;padding: 20px;box-sizing: border-box;margin-bottom: 70px; /* Leave space for the input field */}#input-container {position: fixed;bottom: 0;width: 100%;background-color: #f8f9fa;padding: 10px 0;box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.1);}#userInput {width: calc(100% - 40px);margin: 0 20px;padding: 10px;border: 1px solid #ccc;border-radius: 5px;box-sizing: border-box;font-size: 16px;height: 50px; /* Fixed height */background-color: #fff;resize: none;}#apiKeyInput {width: 200px;margin-right: 10px;padding: 10px;border: 1px solid #ccc;border-radius: 5px;box-sizing: border-box;font-size: 16px;height: 40px;background-color: #fff;}#loader {position: fixed;bottom: 70px;width: 100%;text-align: center;display: none;}#chat {padding: 10px;word-wrap: break-word;}pre {background-color: #f4f4f4;border: 1px solid #ccc;padding: 10px;border-radius: 5px;overflow-x: auto;}code {font-family: Consolas, 'Courier New', Courier, monospace;color: #d63384;}.bot-message {border: 1px solid #007BFF;background-color: #E9F7FF;border-radius: 5px;padding: 10px;margin: 10px 0;}.user-message {border: 1px solid #333;background-color: #f0f0f0;border-radius: 5px;padding: 10px;margin: 10px 0;text-align: right;}.control-panel {display: flex;align-items: center;padding: 0 20px;}button {padding: 10px 20px;background-color: #007BFF;color: #fff;border: none;border-radius: 5px;cursor: pointer;}button:hover {background-color: #0056b3;}p {text-align: center;margin: 0;color: #333;}</style></head><body><div id="chat-container"><div id="chat"></div></div><div id="input-container"><div class="control-panel"><input type="password" id="apiKeyInput" placeholder="Enter API Key" onkeydown="handleApiKeyInput(event)"><button onclick="clearChat()">Clear Chat</button></div><textarea id="userInput" placeholder="Hit shift+enter to send..." onkeydown="handleKeyDown(event)"></textarea></div><div id="loader">Loading...</div><p>To send your message, hit Shift+Enter.</p><script>function handleKeyDown(event) {if (event.key === 'Enter' && event.shiftKey) {event.preventDefault();sendMessage();}}function handleApiKeyInput(event) {if (event.key === 'Enter') {event.preventDefault();saveApiKey();}}function saveApiKey() {const apiKeyInput = document.getElementById('apiKeyInput');const apiKey = apiKeyInput.value.trim();if (apiKey !== '') {fetch('/save_api_key', {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify({ api_key: apiKey }),}).then(response => response.text()).then(data => {console.log('API Key saved:', data);apiKeyInput.value = ''; // Clear the input field}).catch(error => {console.error('Error saving API key:', error);});}}function sendMessage() {const inputField = document.getElementById('userInput');const message = inputField.value.trim();if (message === '') return;inputField.value = '';const chatContainer = document.getElementById('chat');chatContainer.innerHTML += `<div class="user-message">User: ${message}</div>`;const loader = document.getElementById('loader');loader.style.display = 'block';fetch('/send_message', {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify({ prompt: message }),}).then(response => response.text()).then(data => {loader.style.display = 'none';chatContainer.innerHTML += `<div class="bot-message">${data}</div>`;autoScrollToBottom();}).catch(error => {loader.style.display = 'none';chatContainer.innerHTML += `<div class="bot-message">Error: ${error}</div>`;autoScrollToBottom();});}function clearChat() {const chatContainer = document.getElementById('chat');chatContainer.innerHTML = '';fetch('/clear_chat', { method: 'POST' });}function autoScrollToBottom() {const chatContainer = document.getElementById('chat-container');chatContainer.scrollTop = chatContainer.scrollHeight;}</script></body></html>"""if __name__ == "__main__":t = threading.Thread(target=app.run, kwargs={'host': '0.0.0.0', 'port': 5001})t.start()print(f"Visit http://127.0.0.1:{port}/chat to start chatting.")
앱을 실행하려면 파일을 chat.py로 저장한 뒤, 선호하는 컨텍스트 추적 방식에 따라 다음 명령어 중 하나를 사용하세요:
문자 기반 컨텍스트(더 빠름):
python chat.py --char_contextlen 8000
토큰 기반 컨텍스트(8k 토큰 윈도우 최대 활용):
python chat.py --token_contextlen 8000
두 명령어 중 하나를 실행한 뒤, 다음 URL에서 챗봇에 접속할 수 있습니다:
이 스크립트는 웹 요청 처리를 위한 Flask, Flask 앱 실행을 위한 threading, 그리고 챗봇 성능 로깅과 모니터링을 위한 Weave 등 필요한 라이브러리를 임포트하는 것으로 시작합니다. Weave는 프로젝트 이름과 함께 초기화되어 로그를 체계적으로 저장하고 관리하며, 이는 챗봇 상호작용 중 성능 지표를 추적하는 데 특히 유용합니다.
W&B Weave 사용하기
Weave가 Cerebras API와 네이티브로 통합되어 있어 입력, 출력, 지연시간과 같은 핵심 지표가 자동으로 로깅되므로, 프로덕션 환경에서 모델 성능 모니터링이 한결 간단해집니다. 이 자동 로깅을 통해 추가 코드 변경 없이도 챗봇의 동작을 실시간으로 파악할 수 있습니다.
Weave와 Cerebras Cloud를 함께 사용하면 AI 모델의 성능을 종합적으로 파악할 수 있어, 애플리케이션에 적합한 모델을 합리적으로 선택하는 데 도움을 줍니다. 모델의 응답을 손쉽게 확인하면 사용자의 관점에서 모델을 체험할 수 있어, 성능을 바라보는 새로운 통찰을 얻게 됩니다. 또한 Weave와 Cerebras API의 통합을 통해 지연시간 같은 기타 지표도 자동으로 로깅되므로, 앱에서 모니터링해야 할 중요한 지표들을 손쉽게 추적할 수 있습니다.
컨텍스트 관리
이 스크립트는 이전 채팅 메시지와 응답을 캐시에 저장하여 대화 컨텍스트를 관리합니다. 기본적으로 문자 기반 추적을 사용하며, 약간 더 빠르고 다음 설정을 통해 지정됩니다 --char_contextlen 인자입니다. Llama 3.1용 Cerebras API의 8k 토큰 컨텍스트 윈도우를 최대한 활용하려는 분들은, the --token_contextlen 인자는 Hugging Face 토크나이저를 사용한 토큰 기반 추적을 활성화합니다. 문자 수 계산은 더 빠르지만, 토크나이저를 사용하면 컨텍스트 윈도우를 효율적으로 극대화하여 상호작용 시 더 포괄적인 입력 처리를 보장할 수 있습니다.
핵심 로직
챗봇의 핵심은 perform_inference 함수로, 사용자로부터 프롬프트를 받아 Cerebras 클라이언트로 전송해 처리한 뒤 응답을 반환합니다. 그런 다음 응답을 후처리하여 코드 스니펫을 올바르게 포맷하고, 코드 예제가 포함된 기술적 질의도 챗봇이 처리할 수 있도록 합니다. 이 응답은 Weave를 통해 함께 로깅되며, 응답 시간과 처리된 토큰 수 같은 지표를 포함해 챗봇 성능을 실시간으로 모니터링할 수 있습니다.
아래는 챗봇을 사용해 즉석에서 새 게임을 만든 화면입니다.

그리고 제 로컬 시스템에서 게임을 플레이하는 화면도 캡처했습니다!

추론의 미래
Cerebras는 뛰어난 속도와 효율로 LLM 추론의 지형을 새롭게 정의하고 있습니다. 현재 사용 가능한 가장 빠른 추론 솔루션으로서, Cerebras는 개발자가 Llama 3.1 같은 모델을 탁월한 성능으로 활용할 수 있게 해 경쟁사보다 앞서 나갑니다. 이를 통해 복잡한 연쇄적 추론 작업을 실시간으로 수행할 수 있어, 챗봇과 가상 비서 등 대화형 애플리케이션이 그 어느 때보다 빠르고 즉각적으로 반응합니다.
하지만 경쟁 구도는 빠르게 변화하고 있습니다. Cerebras의 강점은 지속적으로 우수한 하드웨어를 제공하고, Meta와 같은 선도 개발사에서 새 모델이 나올 때마다 신속히 통합하는 역량에 달려 있습니다. Groq와 NVIDIA 같은 경쟁사도 가만히 있지 않은 만큼, 새로운 모델과 기술이 등장하는 가운데 Cerebras가 속도와 효율성의 우위를 유지하는 것이 과제가 될 것입니다.
경쟁이 치열해질수록 Cerebras가 고속 AI 추론 분야의 리더십을 유지하려면 지속적인 혁신이 필요합니다. 튜토리얼이 유익했길 바랍니다. 궁금한 점이 있으면 댓글로 남겨 주세요!
Add a comment