"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 내가 TabbyAPI를 만든 이유

내가 TabbyAPI를 만든 이유

2024-08-29에 게시됨
검색:366

Unsplash의 Jason Leung 표지 사진

이 글은 제가 소프트웨어를 만든 이유와 향후 개선 사항에 대해 더 깊이 설명하는 많은 "내가 만든 이유" 게시물 중 첫 번째 게시물입니다.

오늘은 저의 가장 인기 있는 프로젝트인 TabbyAPI에 집중하겠습니다. TabbyAPI는 사용자가 ExllamaV2 라이브러리를 사용하여 대형 언어 모델(또는 LLM)과 상호 작용할 수 있게 하고 OpenAI API 사양을 준수할 수 있는 Python 기반 FastAPI 서버입니다.

이 단어가 무엇을 의미하는지 확실하지 않다면 AI 공간에 있는 것이 아닙니다. 하지만 괜찮아요! 이 글은 AI 용어에 대한 전체 내용을 여러분에게 던지지 않고 제 경험을 설명하기 위한 것입니다.

시작

2023년 11월 당시로 돌아가 보겠습니다. AI가 붐을 일으키고, 기업들이 좌우로 모델을 출시하고, 과대광고 열차는 끝이 없을 것 같았습니다. 마치 고대 시대를 말하는 것 같지만 그 당시에는 하루하루가 한 달 간의 혁신처럼 느껴졌습니다.

이러한 새로운 기술의 맹공격 속에서 저는 보잘것없는 3090ti를 사용하여 이를 실행하는 데 집중했습니다. 예, 그래픽 카드의 24GB VRAM은 대부분의 AI 모델을 실행하기 위한 보급형 수준이므로 '보통'이라는 단어를 사용하는 것이 올바른 단어입니다. 현재로서는 모델의 양자화된 버전을 실행하는 것이 표준이었습니다. 양자화는 사용자가 소비자 GPU에서 이러한 대규모 모델을 실행할 수 있도록 하는 압축과 유사합니다.

제가 좋아하게 된 형식은 속도, 최적화 및 그래픽 카드에 최대한 많은 기능을 탑재하는 데 중점을 둔 형식인 exl2였습니다. 토큰은 소리의 속도로 생성되었습니다. 그래서 이 형식은 훌륭합니다! 무엇이 문제인가요?

문제는 모델을 실행하는 것입니다. Exl2는 ExllamaV2 라이브러리의 일부이지만 모델을 실행하려면 사용자에게 API 서버가 필요합니다. 유일한 옵션은 모든 로더를 Gradio webui에 번들로 묶은 프로그램인 TGW(text- Generation-webui)를 사용하는 것이었습니다. Gradio는 Python 개발을 위한 일반적인 "빌딩 블록" UI 프레임워크이며 AI 애플리케이션에 자주 사용됩니다. 이 설정은 한동안은 괜찮았지만 그렇지 않았습니다.

기본적으로 Tabby를 만든 주된 이유는 귀찮음이었습니다. 하나의 모델을 로드하는 데 드는 작업량에 지쳤습니다. Gradio의 오버헤드와 TGW의 엄청난 양의 종속성은 말할 것도 없습니다. 개발자님을 존경하지만, 올인원 솔루션을 원하시는 많은 분들께는 TGW가 좋은 반면 저에게는 별로였습니다.

계획은…

Why I made TabbyAPI
Unsplash의 Glenn Carstens-Peters 사진

간단합니다. 내 컴퓨터에 설치할 수 있고 실행하는 데 많은 부하가 필요하지 않은 API 서버를 만듭니다. 쉬운 것 같지만 실제로 할 수 있을까요? AI 모델 이론에 대한 경험은 많지 않지만, 백엔드 서버를 만들고 API 디자인을 이해한 경험은 많습니다.

따라서 도와줄 사람이 필요했는데 누구죠? ExllamaV2 뒤에 있는 사람인 Turboderp를 입력하세요. 그는 라이브러리를 만든 이후 모델 작동 방식에 대한 모든 것을 거의 알고 있는데, 이는 내 API 지식과 잘 어울립니다. 게다가 Python에 대한 경험 때문에 Splice라는 또 다른 관심 있는 사람이 합류했습니다. 우리 셋이 함께 TabbyAPI를 시작했습니다.

하지만 계획이 정말 그렇게 간단했을까요? 글쎄요. 일할 사람은 있었지만 Python 및 API 서버에 대한 지식은 기본적으로 0이었습니다. 결국 FastAPI라는 웹 서버 프레임워크를 사용하게 되었고 덕분에 내 삶이 훨씬 쉬워졌습니다. Python 커뮤니티에서도 매우 인기가 높으며 문서도 잘 기록되어 있습니다.

며칠 동안 FastAPI를 사용한 후 Python 웹 서버 코드 작성에 푹 빠졌습니다. 문서는 매우 훌륭하고 온라인에 많은 예제가 있으며 개발자는 피드백을 잘 받아들입니다. 전반적으로 커뮤니티는 환영적이며 네트워킹을 위해 Python을 더 자주 사용하고 싶습니다.

몇 주 후에 모든 것이 공개 배포할 준비가 되었다고 느꼈고 제가 아는 최선의 방법으로 모든 것을 릴리스하기로 결정했습니다. YOLO를 실행하고 모든 것을 GitHub에 푸시하세요.

이슈 및 추가 이슈

오픈소스 프로젝트를 세상에 공개할 때 이슈를 예상하세요… 이슈가 많습니다. 사람들은 항상 유틸리티가 적합하지 않은 사용 사례를 가지고 있습니다. Tabby는 백엔드 서버이기 때문에 이러한 경우가 많이 나타났습니다. 이번 포스팅에서는 처음에 다루기 어려웠던 몇 가지 사항만 언급하겠습니다.

큰 문제점은 RAG 과대광고 주기 중간에 Tabby를 출시했다는 것입니다. RAG는 ​​"Retrieval Augmented Generation"을 의미합니다. 즉, 응답을 받을 때 LLM의 지식 외에 외부 문서를 사용하는 것입니다. 문제는 이러한 새로운 기술(예: 함수 호출)이 작업을 수행하기 위해 완전히 다른 API 엔드포인트와 방법이 필요하다는 것입니다.

게다가 이러한 기능이 백엔드에서 실제로 어떻게 작동하는지에 대한 문서가 거의 또는 전혀 없습니다. 현재까지는 OpenAI의 도구 호출이 어떻게 작동하는지 모르기 때문에 구현하지 않았습니다. 안타깝게도 AI 세계에서는 문서화 부족이 흔한 일이며, 이는 개발자가 사전에 많은 정보를 수집하지 않고 프로젝트에서 코드를 구현하는 능력을 방해합니다.

몇 달 동안 지속된 또 다른 문제는 다중 사용자 생성이었습니다. 서버에서 분산 쿼리를 처리하는 것은 개발자가 작업하기 쉬운 주제가 아닌 것으로 나타났습니다. FastAPI는 이러한 유형의 작업 부하를 지원하지만 Tabby는 동기 코드로 작성되었습니다. 이는 Python에서 비동기 프로그래밍을 배워야 한다는 것을 의미했습니다(장기적으로 쉽지 않음).

가장 나쁜 점은 AI 개발자가 비동기 Python을 좋아하지 않는 반면 네트워킹 서버는 비동기 Python을 수용한다는 것입니다. 이것이 의미하는 바는 스레딩 형태로 비동기 라이브러리와 동기 라이브러리 사이에서 통신하는 방법을 배워야 했다는 것입니다. 이는 Python의 스레딩 문제와 비동기 모델이 애초에 존재하는 이유를 이해하는 데 대한 더욱 심층적인 내용입니다. 이 모든 내용은 다른 블로그 게시물에서 다루겠지만, 이것이 제가 이러한 문제와 싸우면서 2~3개월 동안 해야 했던 학습의 양을 설명해주기를 바랍니다.

결국 터보와 저는 함께 작업하여 스레딩 라이브러리의 모든 다중 사용자 문제와 이상한 버그를 제거하는 ExllamaV2 라이브러리에서 더 나은 생성기를 만들었습니다. 9개월이 지난 지금, Tabby는 마침내 모델을 실행할 수 있는 안정적인 프로그램이라고 해도 과언이 아닙니다.

번아웃

Why I made TabbyAPI
Unsplash의 Annie Spratt 사진

소프트웨어를 개발하는 동안 저는 번아웃 기간을 가져본 적이 없습니다. 소프트웨어 세계에서는 번아웃이 흔한 일이기 때문에 믿기 어렵습니다. 하지만 저는 지난 6년 동안 항상 무언가를 코딩하고 싶었습니다. 코딩은 제가 가장 좋아하는 취미이며 하루의 스트레스에서 벗어나는 데 도움이 됩니다.

그러나 Tabby와 AI 커뮤니티 전반은 상황을 변화시켰습니다. 처음에는 급성장하고 있는 AI 분야를 탐구하면서 공통 관심사를 공유하는 많은 친구와 사람들을 사귀었습니다. 우리 커뮤니티는 거의 매일 음성 통화에 참여했으며 공간의 새로운 기능에 대한 프로젝트와 아이디어를 공유하는 데 중점을 두었습니다. 같은 생각을 가진 사람들과 어울리고 새로운 아이디어를 공유할 수 있어서 개발이 재미있고 즐거웠습니다.

안타깝게도 음성 통화에는 인원이 줄어들기 시작했고 빈도도 줄어들었습니다. 저도 의과대학 1학년을 마치면서 스트레스를 많이 받았어요. 온라인 세계에서 이것은 나에게 엄청난 외로움의 기간이었고 Tabby를 개발하는 것은 내 의대 생활에 더해 부담처럼 느껴졌습니다. 결국 이러한 사건은 좌절감과 피로감이라는 큰 공으로 끝났습니다. 이를 해결하기 위해 AI를 무기한 중단하기로 했습니다.

쉬는 동안 태비와 떨어져 지내며 여름방학을 즐기며 더 많은 시간을 보냈습니다. 실제로 저는 오래된 iOS 앱 프로젝트에 참여했고 가족과 함께 시간을 보냈습니다. 요즘에는 다시 Tabby를 개발하는 중입니다. 내가 참여했던 음성 통화는 아마도 AI 과대 광고의 퇴색으로 인해 오랫동안 일어나지 않을 것입니다. 삼키기 힘든 알약이지만 지속적인 개발을 위한 다양한 동기를 찾았습니다.

내가 배운 교훈

Tabby는 제가 만든 첫 번째 LLM 프로젝트였습니다. 어쩌다보니 커뮤니티 내에서 유명세를 타게 되었고, 저는 경영의 깊숙한 수렁에 빠지게 되었습니다. 그런 걸 알기에, 이번 경험을 통해 제가 배운 몇 가지 생각은 다음과 같습니다.

누구에게 서비스를 제공할지 파악하세요. 누구나 오픈 소스 프로젝트를 사용할 수 있습니다. Tabby의 경우 프로젝트의 사용 편의성, 친구, 나 자신에게 도움이 되는 기능을 우선시합니다. 이 철학을 잘 지키면 일정을 관리할 수 있고, 어떤 기능을 작업해야 할지 알 수 있어요.

자신의 한계를 이해하세요. 번아웃은 재미가 없습니다. 내가 한 일을 하지 말고 사용자에게 여러 번 문제가 발생했기 때문에 스스로를 지치게 하지 마십시오. 좌절감, 분노, 지루함 등의 감정이 나타나면 휴식을 취하십시오. 가끔씩 쉬어가는 것도 좋아요.

모든 사람을 위해 뒤로 물러서지 마십시오. 아이디어가 처음 제시되었을 때는 좋아 보일 수 있지만 사람들은 개발자가 나중에 이 기능을 유지해야 한다는 것을 이해하지 못합니다. 고통스럽고 많이 사용되지 않으면 해당 기능은 유지되지 않고 기술 부채가 될 것입니다. 인터넷상의 무작위 낯선 사람들은 항상 아이디어를 가지고 있다는 것을 기억하십시오. 어느 것에 두뇌 능력을 투입할지 결정하는 것은 귀하 또는 귀하의 팀에 달려 있습니다.

좋아하고 즐기는 것을 창조하세요. 개발자는 유지 관리가 번거롭고 시간이 오래 걸릴 수 있기 때문에 프로젝트에 대한 즐거움을 잃는 경우가 많습니다. 개발자가 더 이상 프로젝트를 적극적으로 사용하지 않는 경우 특히 그렇습니다. 당신의 동기가 무엇인지 파악하고, 그것이 바뀌더라도 괜찮습니다.

자체 주제가 될 수 있으므로 이에 대해 다른 기사에서 자세히 설명하겠지만 Tabby에서 작업하면서 내 프로젝트가 어떻게 작동하길 원하는지에 대해 더 많은 통찰력을 얻을 수 있었다고 생각합니다. 게다가 오픈소스 커뮤니티에 대한 지식도 넓어졌습니다.

미래는 어떻게 될까요

TabbyAPI와 ExllamaV2를 개선하기 위해 매일 기여하고 제안을 주시는 모든 분들께 감사드립니다. 모든 사람은 일반적인 용도에 맞게 프로그램을 개선하고 개선하는 데 도움을 줍니다. 저는 한 사람이고 도움을 주면 많은 일을 할 수 있습니다.

가까운 미래에는 Tabby 작업을 줄일 예정입니다. 프로젝트는 여전히 강력하게 진행되고 있으며 많은 사람들이 이를 개선하기 위해 노력하고 있지만 정신 건강이 더 중요하므로 휴식을 취하는 것이 도움이 될 것입니다.

이 회고록을 읽어주셔서 감사합니다. 저와 제가 하는 일에 대해 더 자세히 알고 싶으시면 kingbri.dev를 방문하세요.

Brian Dashore의 개인 웹사이트

Why I made TabbyAPI theroyallab / 태비API

가볍고 빠른 OAI 호환 exllamav2 API

TabbyAPI

Why I made TabbyAPIWhy I made TabbyAPIWhy I made TabbyAPI

Why I made TabbyAPI

Why I made TabbyAPI

중요한

README 외에도 Wiki 페이지에서 시작에 대한 정보를 읽어보세요!

메모

도움이 필요하신가요? Discord Server에 가입하고 Tabby 역할을 받으세요. 질문하실 때 친절하게 대해주세요.

Exllamav2 백엔드를 사용하여 LLM(대형 언어 모델)을 사용하여 텍스트를 생성할 수 있는 FastAPI 기반 애플리케이션

부인 성명

이 프로젝트는 롤링 릴리스로 표시됩니다. 버그와 변경사항이 있을 수 있습니다. 필요한 경우 종속성을 다시 설치해야 할 수도 있습니다.

TabbyAPI는 소수의 사용자만을 위한 취미 프로젝트입니다. 프로덕션 서버에서 실행하기 위한 것이 아닙니다. 이를 위해서는 해당 워크로드를 지원하는 다른 백엔드를 살펴보십시오.

시작하기

중요한

이 README는 시작하기 위한 것이 아닙니다. 위키를 읽어보세요.

자세한 내용은 Wiki를 참조하세요. 여기에는 설치, 구성, 샘플링, API 사용 등에 대한 사용자용 문서가 포함되어 있습니다.

지원 모델

GitHub에서 보기
릴리스 선언문 이 글은 https://dev.to/kingbri/why-i-made-tabbyapi-385f?1 에서 복제하였습니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>
  • Tkinter Entry\의 get 함수가 아무것도 반환하지 않는 이유는 무엇입니까?
    Tkinter Entry\의 get 함수가 아무것도 반환하지 않는 이유는 무엇입니까?
    Tkinter Entry의 get 함수는 아무것도 산출하지 않습니다: 포괄적인 설명get()을 사용하여 Tkinter Entry 위젯에서 사용자 입력을 검색하려고 할 때 함수를 사용하면 빈 반환 값이 나타날 수 있습니다. 이 당혹스러워 보이는 문제는 Tkinter의 비...
    프로그램 작성 2024-11-06에 게시됨
  • NodeJ를 사용하여 RabbitMq 시작하기
    NodeJ를 사용하여 RabbitMq 시작하기
    RabbitMq 소개 RabbitMq는 서로 다른 서비스 간에 메시지를 주고받을 수 있는 메시지 브로커입니다. AMQP(Advanced Message Queuing Protocol)를 구현하는 메시지 브로커입니다. Erlang 프로그래밍 언어로 작성되었습니다. ...
    프로그램 작성 2024-11-06에 게시됨
  • 웹을 더욱 연결되게 만들기
    웹을 더욱 연결되게 만들기
    웹의 연결성 강화 - Infometka가 "보이지 않는 웹사이트" 문제를 해결하는 방법 웹 개발자이자 ????️????????️의 제작자로서 저는 항상 실제 문제를 해결하는 데 열정을 쏟았습니다. 오늘 저는 수많은 웹사이트 소유자에게 큰 변화를 가져올...
    프로그램 작성 2024-11-06에 게시됨
  • React를 사용하여 Loop Studio 구축
    React를 사용하여 Loop Studio 구축
    소개 Loop Studio는 다양한 가상 현실(VR) 프로젝트를 선보일 수 있도록 설계된 몰입형 웹사이트입니다. React를 사용하면 다양한 구성 요소를 효율적으로 관리하고 렌더링하여 응집력 있고 대화형 사용자 경험을 구축할 수 있습니다. 이 프로젝트는...
    프로그램 작성 2024-11-06에 게시됨
  • PHP를 사용하여 CURL의 다차원 배열을 보낼 때 \"배열을 문자열로 변환\" 오류를 해결하는 방법은 무엇입니까?
    PHP를 사용하여 CURL의 다차원 배열을 보낼 때 \"배열을 문자열로 변환\" 오류를 해결하는 방법은 무엇입니까?
    CURL 및 PHP를 통해 다차원 배열 보내기CURL을 사용하여 다차원 배열이 포함된 양식 데이터를 게시할 때 "배열을 문자열로 변환" 오류가 발생하는 것은 일반적인 문제입니다. 이는 배열을 포함하는 배열로 CURLOPT_POSTFIELDS를 설정하려...
    프로그램 작성 2024-11-06에 게시됨
  • Selenium에서 \"span:contains(\'String\')\"로 InvalidSelectorException을 해결하는 방법은 무엇입니까?
    Selenium에서 \"span:contains(\'String\')\"로 InvalidSelectorException을 해결하는 방법은 무엇입니까?
    "span:contains('String')"이 포함된 Selenium의 잘못된 SelectorExceptionFirefox와 함께 Python에서 Selenium을 사용할 때 CSS 선택기 "span:contains('...
    프로그램 작성 2024-11-06에 게시됨
  • InnerHTML 함정 없이 컨테이너 요소에 HTML을 추가하는 방법은 무엇입니까?
    InnerHTML 함정 없이 컨테이너 요소에 HTML을 추가하는 방법은 무엇입니까?
    innerHTML을 다시 검토하지 않고 컨테이너 요소에 HTML 추가당면한 문제는 제한을 피하면서 컨테이너 요소에 HTML을 추가하는 방법입니다. innerHTML 속성을 사용할 때의 함정. OP가 정당하게 지적했듯이 innerHTML은 기존 콘텐츠를 대체하는 동작으로...
    프로그램 작성 2024-11-06에 게시됨
  • 지속적인 테스트: DevOps 파이프라인의 품질 보장
    지속적인 테스트: DevOps 파이프라인의 품질 보장
    지속적인 테스트는 현대 소프트웨어 개발, 특히 DevOps 프레임워크 내에서 중요한 관행입니다. 여기에는 코드베이스에 대한 모든 변경 사항이 철저히 검증되었는지 확인하기 위해 소프트웨어 제공 파이프라인 전반에 걸쳐 자동화된 테스트 실행이 포함됩니다. 지속적인 테스트는...
    프로그램 작성 2024-11-06에 게시됨
  • 배경색 변경 영상
    배경색 변경 영상
    인스타그램에서 팔로우하세요 이 비디오 튜토리얼에서는 HTML, CSS 및 JavaScript를 사용하여 멋진 Instagram 카드를 만드는 방법을 안내해 드리겠습니다. 이 카드에는 생생한 색상 변경 테두리, 원형 프로필 사진, 온라인 활동에 매력적인 느낌을 더해주는 ...
    프로그램 작성 2024-11-06에 게시됨
  • PHP를 사용하여 브라우저 캐시를 지우는 방법은 무엇입니까?
    PHP를 사용하여 브라우저 캐시를 지우는 방법은 무엇입니까?
    PHP로 브라우저 캐시 지우기브라우저 캐싱은 자주 액세스하는 파일을 로컬에 저장하여 웹사이트 로딩 시간을 개선합니다. 그러나 캐시된 파일이 오래된 경우 테스트 및 개발을 방해할 수도 있습니다. 이 문서에서는 PHP를 사용하여 브라우저 캐시를 지우는 방법을 설명합니다.브...
    프로그램 작성 2024-11-06에 게시됨
  • Go가 포함된 AWS Lambda, 초기 상용구
    Go가 포함된 AWS Lambda, 초기 상용구
    Unsplash에 Lukáš Vaňátko가 찍은 사진 소개 Go는 단순성 때문에 항상 제가 가장 좋아하는 언어 중 하나였습니다. 최근에 저는 Go로 작성된 람다 함수를 사용하여 간단한 상용구 서버리스 프로젝트를 만드는 데 필요한 것이 무엇인지 알아보기로...
    프로그램 작성 2024-11-06에 게시됨
  • Laravel에서 아래쪽에 빈 값과 비어 있지 않은 값을 내림차순으로 정렬하는 행
    Laravel에서 아래쪽에 빈 값과 비어 있지 않은 값을 내림차순으로 정렬하는 행
    데이터베이스로 작업할 때 일부 필드가 비어 있거나 NULL인 상황에 직면하는 것이 일반적입니다. 자주 발생하는 문제 중 하나는 빈 필드가 있는 행이 결과 집합의 맨 아래에 표시되고, 비어 있지 않은 값이 있는 행이 의미 있는 방식(예: 내림차순)으로 정렬되도록 레코드를...
    프로그램 작성 2024-11-06에 게시됨
  • 올리브 오일의 장점
    올리브 오일의 장점
    올리브 오일의 장점 종종 지중해식 식단의 초석으로 알려진 올리브 오일은 다양한 요리에 풍미를 더할 뿐만 아니라 건강상의 이점도 가득합니다. 올리브 나무 열매에서 추출한 올리브 오일은 수세기 동안 사용되어 왔으며 현대 연구에서는 올리브 오일의 많은 장점을...
    프로그램 작성 2024-11-06에 게시됨
  • JSON Diff: 개발자를 위한 완벽한 가이드
    JSON Diff: 개발자를 위한 완벽한 가이드
    JSON(JavaScript Object Notation)은 시스템 간 정보 교환에 널리 사용되는 데이터 형식입니다. 개발자가 API, 데이터베이스 및 구성을 사용하여 작업할 때 JSON 데이터가 일관되고 정확한지 확인하는 것이 중요합니다. 이것이 JSON diff가...
    프로그램 작성 2024-11-06에 게시됨
  • 당신이 알아야 할 avascript 팁
    당신이 알아야 할 avascript 팁
    Joab Chua가 작성 1. 콘솔.로그 콘솔 로그에 색상 추가 이것만은 그만둬! ❌ 대신 이것을 시도해 보세요. ✅ 하지만 객체 배열이 있다면 이렇게 해보는 것이 더 나을 것입니다. ? 코드에서 특정 작업이 얼마나 빨리 실행되는지 측정하려면 다음을 시도...
    프로그램 작성 2024-11-06에 게시됨

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3