취미코딩 근황
개인 머신에서 llama 돌려두고 쓰는게 꽤 유용해서, 밖에서도 쓸 수 있도록 API를 만들어 덮었다.
이렇게 하면 https 엔드포인트에 jwt 인증을 필요로 하는 ollama endpoint 가 만들어진다. 이제 기존의 ollama api 를 사용하던 코드에 jwt 인증 절차만 추가하고 엔드포인트 바꿔주면 된다. 인증 절차 외에 나머지 API는 그대로 중계해주니까.
이렇게 해두고 세계 이곳저곳에 뿌려져있는 개인서버들에서 동작 테스트를 해보니 잘 된다. 굿.
개인적으로 띄워둔 머신이 물리&가상 합쳐서 총 1X 개 정도 된다. 집, 작업실, IDC, AWS, DigitalOcean, Vultr 모두 사용중이고 지역적으로도 한국, 싱가폴, 미국, 시드니 등 여러나라에 걸쳐 있다. 가끔(이 아니라 자주) 브라우저로 scraping 할 일이 생기는데, playwright 나 selenium 으로 실제 브라우저를 띄우는 것은 아무리 내가 잘 해봐도 속도가 느리기 마련이고, 한 머신에서 너무 빠르게 긁으면 막히기 일쑤다. 그래서 여기저기 뿌려둔 서버들을 활용하고 싶은 생각이 들었는데...
하여 여러 머신들에 작업을 쫙~! 뿌리고 결과를 쫙! 모을 수 있는 플랫폼이 뭐 있나 찾아봤다. 지인들+LLM에게 물어보니 다양한 도구나 플랫폼들을 언급하더라.
ray, dask, k8s, airflow, EMR, spark, celery, kafka ... et cetera
병렬/분산 처리 플랫폼, 컨테이터 관리 도구, 분산 큐 등 다양한게 나왔는데 내가 하려는 작업을 간단하게 + 빠르게 + 안정적으로 할 수 있으려나 살펴보니 뭔가 이거다.. 싶은건 안 나왔다. 결국 나이브하게 boinc-like 시스템을 직접 만들어 쓰자고 결론. 이름은 D-TaskQueue 라고 지었다.
(dtq) $ ./cli.py Usage: cli.py [OPTIONS] COMMAND [ARGS]... D-Task Queue CLI. Options: --help Show this message and exit. Commands: get-result Get the result for a specific task. get-task Get a task for the specified worker. get-tasks Get the list of all tasks with details. login Log in to the API and save access token. notify-failure Notify the API about a task failure. submit-result Submit a result for a completed task. submit-task Submit a new task with data type for executable and input. (dtq) $
몇만개 정도 url 에 대해서 브라우저를 열어 페이지를 가져와야 했는데, 그냥 머신 하나에서 돌리니까 적당히 sleep 하면서 처리하면 예상시간이 40만초(대충 5일정도...)로 계산되더라...
이제 API, Worker 들이 준비되었으니, task 를 등록하기 시작했다.
(base)$ ./cli.py submit-task Usage: cli.py submit-task [OPTIONS] TASK_ID EXECUTABLE_FILE INPUT_FILE TIMEOUT Try 'cli.py submit-task --help' for help. Error: Missing argument 'TASK_ID'. (base)$
task 를 생성하기 시작하자 뿌려둔 worker 들이 하나씩 가져가서 각자 처리를 시작했다. 대충 task 하나 처리에 5~6분 정도 걸렸다. (url 하나에 10몇초 정도) 최종적으로 걸린 시간을 보니 400K seconds (약 5일) -> 25K seconds (7시간), 거의 붙인 worker 개수에 비례해서 그대로 단축되었다.
(base)$ ./cli.py get-result TASK-map_links_0516 Task ID: TASK-map_links_0516 Finished At: 2025-01-05T10:41:13.553292 Result URL: /results/TASK-map_links_0516_output.data
가족들이랑 같이 쓰려고 유튜브 URL 을 넣으면 다운로드 받을 수 있는 시스템을 만들어 두었다. Gifer 프로젝트가 발전해서, 구글로그인도 붙이고 다운로드 히스토리도 남게 했다. 원래 있던 기능으로는 오디오 파일만 다운로드 받기, 초 단위로 시작과 끝을 지정해서 클립 다운로드 받기, 퍼가기 쉽게 CDN 에 바로 업로드하기 등등이 가능.
기능 추가 요청을 받아서, 인스타그램 릴스도 다운로드 받을 수 있게 업데이트했다.
요새 고위 정치인들이 빠져있다는 걸로 무속신앙에 대한 관심이 뜨겁다. 그거랑 직접적인 상관은 없지만, 취미삼아 만세력을 만들던게 있었다. 만세력 API를 먼저 만들고, 그 API 로 뷰를 그렸다.혹시 만세력 API 쓰고싶은분은 연락하세요~ 호호호
까지 해두었다. 같은값 매번 입력하는게 성가셔서 저장해둘 수 있게 하려고 구글로그인도 붙여둠.
얼마 전 친구집에서 연말모임을 할 때에 아주 좋은 안줏거리였다. 재밌긴 재밌다.
사실 사주 말고, 별자리 운세도 책 보고 만들었던게 있는데 그건 수호행성이 어쩌고, 태양과 달과 수호행성과 지구가 이루는 각이 120도가 어쩌고 270도가 어쩌고 90도면 어쩌고 이런 식이더라. 역시 아스트로 패키지의 도움을 받아서 뚝딱뚝딱. 행운의 색이나 숫자는 수호행성 위치를 시드로 사용한 랜덤 ( ...) 그냥 재미다. ㅋㅋ
만세력에는 아직 버그가 하나 있다. 짬 나면 고쳐야 하는데 계속 미루는 중이다. 바로 "음력에는 2월 30일이 존재한다. 그런데 프로그래밍 언어의 Datetime 객체는 2월 30일을 넣을수가 없다" 는 것. 가장 최근 음력 2월 30일은, 양력 2024년 4월 8일이었다.
요새 이런 유사과학/미신 관련 코드를 만들면서 느낀 것은,
사주도 별자리도 코드로 만들어 보면 신비가 벗겨진다
는 것. 오늘의 마지막 짜투리 생각: