20 2월 2025

[알아봅시다][COMPUTERS] MS, 세상 뒤집을 양자 칩 공개… 수년내 AI 학습속도 100배

[알아봅시다][COMPUTERS] MS, 세상 뒤집을 양자 칩 공개… 수년내 AI 학습속도 100배

MS, 세상 뒤집을 양자 칩 공개… 수년내 AI 학습속도 100배

01 LOWLCBASGVG2JFYRHD3SB5DGPY.png
 
18일 MS가 공개한 양자컴 반도체 마요나라 1/마이크로소프트

미국 마이크로소프트(MS)가 양자 컴퓨터 상용화의 최대 걸림돌로 꼽혀온 양자 오류와 집적도 한계 등을 뛰어넘는 양자컴 칩을 개발했다고 밝혔다. 온도·자기장 등 외부 환경 변화에 극히 민감해 오류가 잦고 보정이 어려웠던 기존 칩의 치명적 단점을 해결해 양자컴 시대를 앞당길 수 있게 됐다는 것이다.

19일 MS는 “세계 최초로 ‘위상(位相) 초전도체’를 사용한 양자 칩 ‘마요라나 1′을 개발했다”며 “반도체 발명이 오늘날의 스마트폰, 컴퓨터, 전자 제품을 가능하게 한 것처럼 이번 개발로 양자컴 시대가 몇 년 안에 실현될 수 있을 것”이라고 밝혔다. MS는 이번 양자 칩 개발을 트랜지스터 발명에 비유했다.

02 HIO7BAAHVVGRXJM5SA7VSBNOVQ.png
그래픽=양인성

MS는 양자컴 연산의 기본 단위이자 성능 기준으로 꼽히는 ‘큐비트’ 수를 향후 100만개로 확장할 수 있게 됐다고 밝혔다. 현재 IBM과 구글의 양자컴이 1000큐비트급인 점을 감안하면, 1000배에 달하는 규모를 구현할 수 있다고 공언한 것이다. 진공관 시대에 집채만 했던 컴퓨터가 트랜지스터 발명을 계기로 소형화되면서 ‘개인용 컴퓨터’ 시대가 열린 것처럼, 이번 양자컴 기술이 신소재·의료·환경·국방·보안 등 경제·산업·사회 각 분야에 혁명과도 같은 변화를 예고한 것이라는 기대가 나온다.

◇수년내 AI 학습속도 100배… “트랜지스터 발명과 맞먹어”

마이크로소프트(MS)가 19일 자체 개발했다고 공개한 양자컴 칩 ‘마요라나 1’에는 큐비트 8개가 탑재됐다. 큐비트는 양자컴 연산의 기본 단위다. 기존의 일반 컴퓨터는 전자의 유무(有無)에 따라 0과 1의 비트(bit)로 정보를 표현하고 순차적으로 계산하는 반면, 양자컴은 예컨대 0과 1을 동시에 처리(중첩)할 수 있어 연산 속도가 획기적으로 빠르다. 이번에 MS는 큐비트를 100만개 이상으로도 확장할 수 있도록 양자 칩을 설계했다고 밝혔다. 이번 양자 칩의 핵심인 ‘위상 초전도체’는 인듐 비소와 알루미늄 등으로 구현했다. 이를 통해 양자 정보의 손상을 막고 오류 파악과 수정도 디지털로 자동 제어할 수 있게 됐다. 체탄 나약 MS 퀀텀 하드웨어 부사장은 “큐비트 100만개는 양자컴이 산업에 실질적 변화를 가져오기 위한 필수 임계치”라고 했다. 큐비트가 100만개 이상 탑재되는 시기를 ‘양자컴 상용화’가 시작되는 때로 본다는 것이다.

03 GW3JWPXD3NCYJEZT2E5BRTQ32A.png
그래픽=양인성

◇양자컴 상용화, 무엇을 바꿀까

MS는 100만 큐비트급 양자컴이 개발되면 분자 간 복잡한 상호작용을 비롯해 오늘날의 컴퓨터로는 풀 수 없는 각종 문제가 해결될 것이라고 했다. 예컨대, 교량이나 항공기의 균열 등을 자가 복구하는 물질을 개발할 수 있고, 각종 플라스틱을 분해하는 만능 촉매도 만들 수 있어 환경오염도 풀 수 있다는 것이다. 토양 비옥도를 획기적으로 높여 식량 부족 문제의 돌파구도 열 수 있다고 했다.

이처럼 수퍼컴퓨터를 월등히 초월하는 양자컴이 상용화되면 인공지능(AI) 분야에서도 근본적 혁신이 가능하다는 분석이 나온다. 막대한 양의 데이터를 학습한 뒤 이를 토대로 연산과 추론을 하는 AI에 양자컴 기술이 접목되면 소비 전력을 비롯해 비용과 시간을 대폭 줄이면서 AI 학습 속도를 100배 가까이 높일 수 있다는 것이다. MS는 “AI와 양자컴이 결합한 시대에는 어떤 물질이나 분자, 제품을 개발하고 싶다고 말하면 즉시 실현 가능한 답을 얻을 수 있게 될 것”이라며 “예전 같은 수년간의 시행착오는 없을 것”이라고 했다.

양자 컴퓨터는 또 의료, 경제 등 분야에서도 혁신을 이끌 것으로 기대된다. 양자 컴퓨터를 본격적으로 활용하면 신약 후보 물질을 찾는 데 드는 시간과 비용을 기존의 100분의 1로 절감하고, 궁극적으로 암이나 치매 등 난치병을 쉽게 치료할 수 있는 시대가 열릴 수 있다. 이와 함께 차세대 배터리나 그래핀 등 신소재를 지금보다 훨씬 빠르게 개발할 수 있고, 금융 시장에서도 주가, 금리, 환율 등 다양한 변수를 고려해 리스크를 예측하고 회피하는 금융 모델링이 가능해진다. 이상기후를 예측하는 것도 지금보다 훨씬 정확해질 전망이다.

◇“부작용과 한계도 고려해야”

양자컴이 상용화됐을 때 생기는 위협도 있다. 전문가들은 기존의 암호 기술이 양자컴 앞에서 무력화될 것으로 보고 있다. 기존 컴퓨터로 수천 년을 풀어야 하는 암호도 양자컴으로는 몇 분 안에 풀릴 수 있다.

다만 MS의 이번 기술이 상용화로 직결될지는 두고 봐야 한다는 지적도 있다. 이순칠 한국연구재단 양자기술단장은 “이번 양자 칩은 무오류 양자컴의 실현 가능성을 보였다는 점에서 의미가 있다”면서도 “아직 완벽한 수준의 기술을 입증하진 못한 것으로 보인다”고 했다.

테크 업계에선 새로운 양자 칩 개발을 계기로 양자컴 경쟁이 더욱 뜨거워질 것으로 보고 있다. 앞서 구글이 지난해 12월 공개한 양자 칩 ‘윌로’는 기존 수퍼컴퓨터로 10의 25제곱년이 걸리는 계산을 5분 만에 수행해 냈다. IBM은 지난해 11월 ‘퀀텀 헤론’ 양자 칩을 공개하며 “전작 대비 동일한 연산 작업 시간을 112시간에서 2.2시간으로 크게 단축했다”고 밝혔다. 도용주 광주과학기술원(GIST) 물리광과학과 교수는 “한국은 양자컴 분야에선 후발 주자지만, 위상 초전도체 양자컴은 새로 열리는 분야로 기술적 격차가 크지 않아 추격 가능성을 주목해야 한다”고 했다.

☞양자컴퓨터, 위상 초전도체

양자컴퓨터: 일반 컴퓨터는 전자의 유무(有無)에 따라 0과 1의 비트(bit)로 정보를 표현하고 순차적으로 계산하는 반면, 양자컴퓨터는 0과 1을 동시에 처리(중첩)할 수 있어 연산 속도가 획기적으로 빠르다.

위상 초전도체: 전기저항이 0이 돼 전력 손실 없이 전류를 흐르게 하는 물질을 초전도체라 한다. ‘위상(位相) 초전도체’는 초전도성을 가지면서 형태가 변형돼도 입자 간 위상이 변하지 않아 성질이 쉽게 유지되는 물질이다. 기존 양자 컴퓨터의 초전도체는 온도·빛 등 환경이 조금만 바뀌어도 성질이 변해 연산 오류가 발생했다. ‘위상 초전도체’는 이런 문제를 해결해 정보를 더 오래 안정적으로 유지할 수 있다.

 

04 https___s3.amazonaws.com_arc-authors_chosun_c9d8eb17-ec74-42d4-a9bc-f812ecd50653.png
날카롭되 친절한 글을 쓰겠습니다
 

05 https___author-service-images-prod-us-east-1.publishing.aws.arc.pub_chosun_ccd87091-2d01-4f29-858b-b9378816a850.png
테크부에서 과학 분야와 제약·바이오 업계를 맡고 있습니다.

[출처] https://www.chosun.com/economy/tech_it/2025/02/20/WKLWICF2SBHCBNAA2CRK4YECJY/

Loading

24 1월 2025

[chatgpt] 이전 기사 AI타임스 “오픈AI의 AGI 달성 기준은 인간 넘는 ‘코딩 에이전트’ 출시 순간”.

[chatgpt] 이전 기사 AI타임스 “오픈AI의 AGI 달성 기준은 인간 넘는 ‘코딩 에이전트’ 출시 순간”.

“오픈AI의 AGI 달성 기준은 인간 넘는 ‘코딩 에이전트’ 출시 순간”…’오퍼레이터’는 이번 주 챗GPT에 통합

  •  임대준 기자
  •  
  •  승인 2025.01.23 18:00
2025-01-24-01 openai 167422_182212_5856.png
(사진=셔터스톡)

오픈AI가 소프트웨어 개발을 담당하는 코딩 전문 인공지능(AI) 에이전트를 개발 중으로 알려졌다. 그리고 코딩 에이전트가 최고 수준의 프로그래머를 대체하는 순간을 인공일반지능(AGI)에 도달한 것으로 간주할 것으로 전해졌다.

또 이와는 별도로 개발한 범용 GUI 에이전트 ‘오퍼레이터’는 이번 주 정식 출시를 앞뒀다는 소식이다.

디 인포메이션은 22일(현지시간) 오픈AI 임원진과 이야기를 나눈 3명을 인용, 고급 소프트웨어 개발자보다 복잡한 프로그래밍 작업을 처리하는 AI 에이전트를 개발 중이라고 보도했다.

이에 따르면 오픈AI의 목표는 레벨 6 엔지니어, 즉 선임 스태프 급 엔지니어를 복제하는 것이다. 이 수준의 개발자는 관리자로부터 광범위한 지침을 받고 새로운 소프트웨어나 기능의 설계부터 이를 구동하는 시스템까지 전체를 발할 수 있다.

또 오픈AI의 어시스턴트는 코드 출력뿐 아니라, 코드 베이스에 변경 사항을 적용하려는 경우 슬랙을 통해 인간에게 메시지를 보내 알릴 수도 있는 것으로 전해졌다.

오픈AI의 몇개 팀이 이를 개발하고 있으며, 추론 모델 ‘o1’도 일부 활용한 것으로 알려졌다.

이에 대해 제이슨 리우 재피어 AI 컨설턴트는 오픈AI가 최고 수준의 프로그래머를 타깃으로 하는 것이 합리적이라고 말했다. 수석급 엔지니어는 가장 비용이 많이 들고 대체가 어렵기 때문에, 고급 코딩 에이전트가 기업에 재정적으로 확실한 도움이 된다는 것이다.

또 현재 출시된 코딩 에이전트가 기대에 미치지 못한다고도 지적했다. 리우 컨설턴트는 지난해 코그니션이 출시한 세계 최초의 코딩 에이전트 ‘데빈’과 작업하는 것을 “그저 멍청한 인턴 10명의 관리자가 되는 것 같은 느낌이 든다”라고 표현했다. 따라서 성능이 확실히 뛰어나야 한다는 것이다.

앞서 오픈AI는 지난해 하반기부터 코딩 성능 향상에 초점을 맞추고 집중적인 개발에 매달렸다는 말이 나왔다. 당시 오픈AI 제품이 앤트로픽에 비해 코딩 능력이 가장 떨어진다는 판단 때문이었다.

이번 소식으로 인해 샘 알트먼 CEO가 연초 개인 블로그를 통해 ‘리플렉션’이라는 글을 올리며 “AGI에 도달하는 방법을 이미 알고 있다”라고 한 것과 “연말까지 AI가 인력에 합류할 수 있다”라고 말한 것이 어떤 의미인지 확실해졌다는 분석이다.

한편, 디 인포메이션은 내부 관계자를 인용, 오픈AI가 이번 주에 ‘챗GPT’에 AI 에이전트 ‘오퍼레이터’를 통합 출시할 계획이라고 보도했다.

오퍼레이터는 웹 사이트를 검색하고 여행 계획을 짜며 레스토랑을 예약하는 등 사람 대신 마우스와 키보드를 사용해 일반적인 업무를 처리하는 범용 GUI 에이전트다. 

지난 20일에는 티버 블라호라는 소프트웨어 엔지니어가 맥OS용 챗GPT 클라이언트에서 오퍼레이터의 단축키 옵션을 발견했으며, 오픈AI 홈페이지에서는 벤치마크 결과도 확인했다고 전한 바 있다. 이 때문에 오퍼레이터의 출시가 임박한 것으로 파악됐다.

임대준 기자 ydj@aitimes.com

[출처] https://www.aitimes.com/news/articleView.html?idxno=167422

Loading

24 1월 2025

[ 一日30分 인생승리의 학습법] 기술부채(Technical Debt)는 소프트웨어 개발이나 프로젝트 과정에서, 약속된 것과 실제로 제공된 것 사이에 차이가 발생하는 것을 의미합니다. 

[ 一日30分 인생승리의 학습법] 기술부채(Technical Debt)는 소프트웨어 개발이나 프로젝트 과정에서, 약속된 것과 실제로 제공된 것 사이에 차이가 발생하는 것을 의미합니다. 

 

기술부채(Technical Debt)는 소프트웨어 개발이나 프로젝트 과정에서, 약속된 것과 실제로 제공된 것 사이에 차이가 발생하는 것을 의미합니다. 즉, 기술적으로 해결해야 할 문제를 미루고 비즈니스 문제를 해결하는 것을 말합니다.

기술부채는 금전적인 채무와 비슷한 개념으로, 언젠가는 이자와 함께 상환해야 합니다. 기술부채가 쌓이면 개발 속도가 느려지고, 고객은 수정되지 않은 결함으로 인해 피해를 볼 수 있습니다.

기술부채를 최소화하기 위해서는 다음과 같은 방법을 고려할 수 있습니다.

  • 프로젝트 초기부터 적절한 기술 선택과 설계를 수행합니다
  • 코드 품질 관리를 합니다
  • 충분한 테스트를 수행합니다
  • 지속적인 개선과 리팩토링을 수행합니다
  • 기술 부채를 적극적으로 모니터링하고, 적절한 대응 전략을 수립합니다

2025-01-23-01 기술부채 01 DALL·E 2025-01-23 18.46.37 - A conceptual illustration of technical debt in software development. The image should depict a software engineer climbing a mountain made of messy cod.png

기술 부채(Technical Debt)란?

글쓴이 권오륜 / 2023년 06월 27일

 

기술 부채의 정의


 

사전적인 정의는 다음과 같습니다.

 

현 시점에서 더 오래 소요될 수 있는 더 나은 접근방식을 사용하는 대신 쉬운(제한된) 솔루션을 채택함으로써 발생되는 추가적인 재작업의 비용을 반영하는 소프트웨어 개발의 한 관점이다.

기술 부채는 금전적인 채무와 비유될 수 있다.

– 위키백과

출처 입력

워드 커닝햄(Ward Cunningham) 이 1992년도에 사용한 표현으로, 소프트웨어 개발에서 빠른 개발이나 기능 출시를 위해 나중에 처리하도록 미루어진 기술적인 문제를 말합니다. 이러한 문제들은 나중에 수정되어야 하지만, 미뤄진 만큼 처리하기에 더욱 복잡하고 비용이 많이 들어가게 됩니다.

결국, 나중에 개발해야 만 하는 추가적인 작업 형태로 남아 마치 갚아야 할 부채처럼 된다는 것입니다.

 

평균적인 소프트웨어 개발자는 기술 부채를 처리하는 데 일주일에 13시간 이상을 쓴다.

– 2018년 스트라이프(Stripe)의 Developer Coefficient 보고서

출처 입력

이와 같이 기술 부채를 관리하는데, 많은 시간을 투입해야 하는 것으로 나타났으며, 시스템이나 애플리케이션이 복잡하고, 커질수록 더욱 많은 시간을 투입해야 합니다.

이외에도, 마틴 파울러는 2009년 그의 블로그에서 기술 부채 사분면을 제시하였으며, 소프트웨어 개발 과정에서 “빠른 구현” 이라는 효과는 나타낼 수도 있지만 결국에는 “유지보수 노력 증가”라는 대가를 치루게 된다는 점을 설명하면서, 기술 부채의 중요성을 강조하고 있습니다.

02. 기술부채 -image-10.png

마틴 파울러의 기술 부채 사분 (https://www.productplan.com/glossary/technical-debt/)

 

기술 부채의 종류


 

기술 부채는 다양한 형태로 나타날 수 있으며, 예를 들어, 설계 부채, 코드 부채, 테스트 부채, 인프라 부채 등이 있습니다.

설계 부채

  • 소프트웨어 설계 단계에서 적절한 설계를 제대로 수행하지 않았거나 설계 결함을 미처 수정하지 못하여 생기는 부채
  • 소프트웨어의 설계가 미흡하거나 부적절하게 이루어졌을 때, 나중에 해당 소프트웨어를 수정하거나 유지 보수하는 과정에서 발생하는 추가적인 비용과 시간

코드 부채

  • 개발자가 프로그램 코드를 작성할 때, 시간이나 예산 등의 제한으로 인해 충분한 품질을 보장하지 못하고 미루는 코드 작성 작업
  • 소프트웨어 개발의 초기 단계에서는 효과적으로 비용을 절감할 수 있지만, 이후에 시스템을 유지 보수/업그레이드/기능 추가 시 많은 비용과 시간이 들어감

테스트 부채

  • 소프트웨어 개발 과정에서 충분한 테스트를 수행하지 않아 생기는 부채
  • 시스템의 기능이나 성능을 충분히 검증하지 않거나, 불완전한 테스트를 수행하여 발견하지 못한 결함으로 인해 시스템이나 소프트웨어의 품질 저하되며, 이후 품질 향상을 위해 많은 비용과 시간이 들어감

인프라 부채

  • 소프트웨어 개발 및 운영을 위한 인프라 구성에 대한 부채
  • 개발자가 시스템 운영을 위한 서버나 DB 등의 인프라 구성을 미리 준비하지 않은 채 개발을 진행하여, 시스템의 초기 버전은 빠르게 출시할 수 있지만, 이후 시스템 규모가 확장되거나 사용자 수가 증가하면 인프라 구성이 부족한 상황이 발생하게 되어, 시스템의 성능 저하나 서버 다운 등의 문제가 발생

기술 부채의 원인


 

기술적인 결함

  • 시스템/소프트웨어 대한 적절하지 않은 설계 또는 코드의 품질 관리를 하지 않는 등의 이유

시간 및 예산 제약

  • 개발 프로젝트의 일정이 매우 촉박하거나, 예산이 제한되어 있는 경우 개발자들은 충분한 테스트나 코드 리팩토링을 수행하지 않아 발생

기술적인 부족함

  • 새로운 기술을 익히는데 시간이 부족한 경우나, 충분한 경험이 없는 경우 발생 가능성이 높음

업무 환경

  • 개발 프로젝트를 위한 업무 환경이 부적절하거나, 커뮤니케이션에 문제가 있어 일부 정보나 요구사항을 놓치는 경우

이외에도 업무 우선순위, 기술적인 한계 등 여러 원인이 있을 수 있습니다.

기술 부채 최소화하는 방안


 

코드 리뷰

  • 다른 개발자들이 작성한 코드를 검토하고, 잠재적인 기술 부채를 예방할 수 있음
  • 코드의 가독성, 유지보수성, 확장성 등을 개선하고, 문제가 발생했을 때 빠르게 대처할 수 있도록 도와줌

테스트 자동화

  • 개발자가 작성한 코드를 자동으로 검증하고, 문제를 미리 파악할 수 있음
  • 잠재적인 기술 부채를 미리 예방할 수 있으며, 개발자가 코드를 수정하거나 추가할 때마다 자동으로 테스트가 수행되므로 코드의 신뢰성을 높일 수 있음

지속적인 통합/배포

  • 코드 변경 사항을 빠르게 반영하고, 문제를 빠르게 파악하고 해결할 수 있음
  • 개발자들은 코드 변경에 대한 실시간 피드백을 받으므로, 문제가 발생했을 때 빠르게 대처할 수 있음

기술 부채 관리

  • 기술 부채를 발생시키는 원인을 파악하고, 관리할 수 있는 프로세스를 도입하여 최소화할 수 있음
  • 기술 부채를 쌓이지 않도록 예방하고, 발생했을 때는 빠르게 대처하여 안정적인 소프트웨어 개발을 진행할 수 있도록 노력해야 함

최신 기술 도입

  • 새로운 기술이 나올 때마다 최신 기술을 도입하여 기술 부채를 최소화할 수 있음
  • 최신 기술을 도입하면 개발 시간이 단축되고, 더욱 효율적으로 개발할 수 있음

기술 부채를 최소화하기 위해서는 프로젝트 초기부터 적절한 기술 선택과 설계, 코드 품질 관리, 충분한 테스트, 그리고 지속적인 개선과 리팩토링을 수행해야 합니다. 또한, 기술 부채를 적극적으로 모니터링하고, 적절한 대응 전략을 수립하여 신속하게 해결하는 것이 필요합니다. 이러한 노력을 통해 기술 부채를 최소화하고, 높은 품질과 안정성을 갖춘 소프트웨어를 개발하는 것이 가능합니다.

기술 부채 관리의 중요성


 

기술 부채는 소프트웨어 개발 프로젝트에서 매우 중요한 문제이며, 기술 부채가 높아질수록 프로젝트 진행에 대한 위험이 높아질 수 있습니다.

높은 기술 부채는 미래에 프로젝트를 더욱 복잡하게 만들어서, 수정과 유지 보수 비용이 늘어날 수 있으며, 회사와 고객에게 추가적인 비용과 불편함을 초래할 수 있습니다. 또한, 품질이 낮아질 가능성이 높아져서, 불편한 사용자 경험과 기능 오류를 초래할 수 있습니다.

따라서, 기술 부채를 적절하게 관리하고 최소화하는 것이 매우 중요합니다. 기술 부채를 관리함으로써, 프로젝트의 일정과 예산을 준수하는 데 도움을 주며, 프로젝트의 품질과 안정성을 유지하는 데에도 중요합니다. 또한, 기술 부채를 최소화하면 개발자들은 보다 많은 시간과 에너지를 현재의 개발 과제에 집중할 수 있으며, 개발자들의 생산성과 만족도를 높이는데 도움을 줍니다.

마치며 …


 

기술 부채는 피할 수 없는 것이며, 모든 조직에서 발생할 수 있는 문제입니다.

개발자들은 기술 부채에 대한 인식을 높이고, 팀 전체적으로 기술 부채를 예방하고 관리할 수 잇는 문화를 구축해야 할 것입니다.

팀내에서도 기술 부채를 관리하고 있는지에 대해 한번쯤 검토해 보아야 할 것이며, 저희가 개발하고 있는 제품/서비스를 지속적으로 발전해나가려면, 기술 부채들을 조금씩은 해소해나가면서 개발 진행할 수 있도록 해야할 것입니다.

기술 부채를 최소화하기 위한 방안 및 프로세스 개선에 대해서도 본부 차원에서 고민해봐야 할 문제로 보입니다.

관련 기사


 
  • https://melv1n.com/what-is-technical-debt/
  • https://namu.wiki/w/기술적 부채
  • https://www.itworld.co.kr/insider/238829
  • https://yozm.wishket.com/magazine/detail/1331/
  • https://www.bzpp.co.kr/viewplus/viewplus/ST170328A00001
  • https://www.2e.co.kr/news/articleView.html?idxno=207765
  • https://giljae.com/2022/08/08/기술-부채의-유형과-관리-방법.html

[출처] https://tech.hancom.com/2023-06-27-technical-debt/

 
한컴테크한컴테크를 통해 한컴의 기술을 공유합니다. 한컴의 프로그래밍, 프레임워크, 라이브러리 및 도구 등 다양한 기술을 만나보세요. 한컴 개발자들의 다양한 지식을 회사라는 울타리를 넘어 여러분과 공유합니다. 한컴이 제공하는 기술블로그에서 새로운 아이디어와 도전을 마주하고, 개발자가 꿈꾸는 미래를 실현하세요.

tech.hancom.com

 
 
 

 

Loading

28 12월 2024

[ 一日30分 인생승리의 학습법] 고가용성(High Availability) 시스템을 위한 5가지 전략

[ 一日30分 인생승리의 학습법] 고가용성(High Availability) 시스템을 위한 5가지 전략

고가용성(High Availability) 시스템을 위한 5가지 전략

5가지 전략으로 마스터하는 MSA의 고가용성 실전 가이드

Introduction

고가용성, 보통 HA(High Availability)라고 많이들 부를 텐데요. 비즈니스가 잘 되기 시작하면서 대용량 트래픽을 뒷받침할 요소들을 넣다보면 가용성에 대한 고민이 깊어질 수밖에 없어집니다. 특히 마이크로서비스 아키텍처(MSA)를 설계할 때 많은 소프트웨어 엔지니어들이 고민하는 부분이 바로 이 고가용성인데요. 서비스 간의 느슨한 결합과 독립적인 배포라는 MSA의 장점을 살리면서도 시스템 전체의 안정성과 가용성을 확보하는 것이 쉽지 않은 과제이기 때문입니다. 이번에 소개해 드릴 글은 System Design Codex의 “5 Strategies for High-Availability Systems”라는 제목의 글로, 고가용성 시스템을 설계하는 데 도움이 될 만한 5가지 핵심 전략을 다루고 있습니다.


가용성(Availability)은 사용자 경험에 있어 매우 중요합니다. 매 분마다 비행기가 이륙하고 착륙하는 바쁜 공항을 운영하고 있다고 가정해봅시다. 우리가 가장 원하지 않는 것은 관제탑이 고장 나서 혼란과 지연이 일어나는 것일 겁니다.

이와 비슷하게, 24시간 온라인 서비스가 제공되는 시대에 고가용성은 일종의 성배와도 같게 되었습니다. 여러분이 주말에 친구 및 가족과 하이킹을 갈 때조차도 시스템은 항상 작동하고 운영되도록 보장해야 합니다.

그렇다면, 이를 어떻게 해야 할까요? 당연히 여러분은 휴가나 가족과의 시간을 망치고 싶지 않겠죠. 그러니 시스템의 고가용성을 확보하기 위한 몇 가지 전략을 적용해야 합니다.

아래에 소개한 5가지 중요한 전략을 살펴보겠습니다.

1. 로드 밸런싱(Load Balancing, LB)

다시 공항 예시로 돌아가보죠. 우리의 시스템이 바쁜 공항이고, 들어오는 리퀘스트가 착륙을 요청하는 비행기와 같다고 가정해 봅시다. 그런데 활주로가 단 2개밖에 없다면 어떨까요?

바로 이때 관제사가 해야 할 일은 비행기를 다른 활주로로 유도하고, 각 활주로의 부하를 관리하며, 혼잡을 야기하지 않으면서 교통량을 계속 처리하는 것일 겁니다.

로드 밸런서는 곧 애플리케이션의 항공교통관제사와 같습니다. 로드 밸런서는 CPU 사용률, 메모리 사용량, 응답 시간 등 여러 요소를 분석하여 요청을 가장 가용성이 높고 응답성이 좋은 서버로 라우팅합니다. 부하를 분산시킴으로써 단일 서버가 과부하되는 것을 방지하여 피크 부하 시에도 원활한 운영 흐름을 보장합니다.

01 image.png

2. 격리를 통한 데이터 복제(Data Redundancy with Isolation)

만약 특정 노선의 비행기에 문제가 생겨 운항할 수 없게 되면 어떻게 될까요? 탁월한 고객 서비스를 제공하는 효율적인 항공사를 운영하고 있다면, 승객들을 목적지까지 데려다 줄 예비 항공기를 갖추고 있을 것입니다.

애플리케이션의 데이터 복제도 마찬가지입니다. 여기서 데이터 복제(Redundancy, 혹은 Replication)란, 여러 데이터 센터나 클라우드 리전(region)에 걸쳐 데이터의 복사본을 여러 개 저장하는 것을 포함합니다.이렇게 하면 한 데이터 센터에서 장애나 중단이 발생하더라도 사용자는 다른 위치에서 데이터에 계속 엑세스할 수 있습니다.

데이터베이스 복제, 객체 스토리지, 분산 파일 시스템은 바로 데이터 복제를 구현하는 데 일반적으로 사용되는 기술입니다.

02 image.png

3. 장애 조치(Failover)

스카이다이빙을 하러 갔다고 해봅시다. 땅으로 떨어지는 와중에 등에 매달린 유일한 낙하산에 결함이 있다는 것을 깨달은 적이 있나요? (아마도 그렇지 않겠지만) 만약 그런 상황이라면 쉽게 펼칠 수 있는 보조 낙하산이 있기를 간절히 바랄 테죠. 시스템 설계의 맥락에서 장애 조치(Failover)는 그 낙하산과 같습니다.

장애 조치란 주요 구성 요소가 실패할 때, 시스템이나 서비스를 주요 구성 요소에서 대기 또는 백업 구성 요소로 자동 전환하는 것을 의미합니다. 이는 네트워크 트래픽을 백업 서버로 전송하거나, 보조 데이터베이스로 전환하거나, 사용자를 미러링된 애플리케이션 인스턴스로 리디렉션하는 것을 포함할 수 있습니다.

장애 조치 메커니즘은 일반적으로 로드 밸런서, 애플리케이션 서버 및 데이터베이스 관리 시스템에 내장되어 있어 사용자의 가동 중단 시간을 최소화하면서 신속한 전환을 보장합니다.

03.png

4. 오토 스케일링(Auto scailing)

고가용성 관점에서 오토 스케일링은 전투 시나리오의 요구 사항에 따라 추진력을 조정할 수 있는 강력한 전투기에 비유할 수 있습니다.

시스템 설계에서 이 전략은 현재 부하 및 사용 패턴에 따라 컴퓨팅 자원(가상 머신, 컨테이너 또는 서버리스 기능 등)을 동적으로 할당하거나 할당 해제하는 것을 뜻합니다.

오토 스케일링은 CPU 사용률, 메모리 사용량 또는 들어오는 요청 비율과 같은 메트릭에 의해 트리거될 수 있으며, 종종 클라우드 플랫폼 서비스 또는 맞춤형 스케일링 알고리즘을 사용하여 구현됩니다.

사용자 트래픽이 변동할 때, 오토 스케일링은 시스템이 부하를 처리하는 데 필요한 용량을 항상 확보해 성능 저하나 중단을 방지합니다.

04 image.png

5. Rate Limiting(호출 제한)

매우 바쁜 공항의 활주로가 15분마다 단 두 번의 착륙만 처리할 수 있다고 상상해 보세요. 더 많은 착륙을 시도하면 사고가 발생해 활주로를 완전히 망가뜨리게 될 것입니다. 승객의 생명을 위험에 빠뜨리는 것은 말할 것도 없죠. 이 경우 관제사는 15분마다 2대의 비행기만 착륙할 수 있도록 들어오는 비행기를 조정함으로써 호출 제한기(Rate Limiter) 역할도 합니다.

사용자 요청과 관련하여 애플리케이션에도 동일한 개념이 적용됩니다. 이 전략은 초당 또는 분당 고정된 수의 요청과 같이 주어진 시간 프레임 내에서 사용자 또는 시스템이 요청할 수 있는 수에 제한을 두는 것을 포함합니다.

호출 제한은 로드 밸런서, 웹 서버 또는 애플리케이션 수준과 같은 다양한 계층에서 구현될 수 있습니다. 단일 사용자 또는 시스템이 모든 리소스를 사용하는 것을 방지함으로써 호출 제한은 모든 사용자에게 공정하고 안정적인 서비스를 보장하고 갑작스러운 트래픽 급증으로 인해 시스템이 과부하되는 것을 방지합니다.

05 image.png

자, 여러분들은 애플리케이션의 가용성을 향상시키기 위해 다른 어떤 전략을 사용해 보셨나요? 댓글을 남겨주세요 🙂

Top 1% 개발자로 거듭나는 확실한 처방전, 데브필이었습니다.

06 woonys__youtube_profile_image_the_channel_name_is_DevPill_softw_a07a80be-3468-4941-a672-9146f0f59b5b.png
 [출처] https://maily.so/devpill/posts/8do7x52ezgq

Loading

25 12월 2024

[인공지능 기술] 골칫거리 AI 환각, 과학 연구에서는 혁신적 아이디어 제공

[인공지능 기술] 골칫거리 AI 환각, 과학 연구에서는 혁신적 아이디어 제공

골칫거리 AI 환각, 과학 연구에서는 혁신적 아이디어 제공

입력
인공지능(AI)의 환각 현상이 과학 연구에서 새로운 아이디어를 낼 때 도움을 주는 것으로 나타났다. 게티이미지뱅크 제공

인공지능(AI)의 환각 현상이 과학 연구에서 새로운 아이디어를 낼 때 도움을 주는 것으로 나타났다. 게티이미지뱅크 제공

인공지능(AI)이 실제와 유사한 정보를 지어내거나 조작해 신뢰도에 문제를 일으키는 ‘AI 환각(hallucination)’ 현상이 과학계에서는 창의적 아이디어를 내고 문제를 해결하는 데 유용하게 쓰이고 있다.

23일(현지시간) 미국 뉴욕타임스(NYT) 보도에 따르면 AI 환각 현상은 단백질·의료기기 설계, 기상 예보 등의 분야에서 과학자들이 새로운 아이디어를 구상할 때 도움을 주는 것으로 나타났다.

학습한 데이터를 기반으로 새로운 정보를 만들어내는 생성형 AI는 때때로 진짜와 비슷하지만 존재하지 않는 정보를 지어내거나 조작하는 환각 현상을 보인다. 환각은 특히 AI가 내놓는 답변 신뢰도에 치명적인 영향을 미친다. AI 환각을 억제하려는 노력이 이어지고 있지만 과학계에서는 오히려 AI 환각이 연구활동에 유용하게 쓰이는 사례가 나오고 있다.

올해 노벨화학상을 수상한 데이비드 베이커 미국 워싱턴대 교수는 생명체의 기본 요소인 단백질을 연구하는 과학자다. 새로운 단백질을 설계해 암이나 바이러스와 싸우는 치료제로 활용할수 있다. 베이커 교수는 AI의 ‘상상력’이 새로운 단백질을 만들어내는 핵심이라고 밝혔다.

베이커 교수팀은 인간이 모호한 패턴을 의미 있는 이미지로 변환하려는 현상인 변상증(pareidolia)에서 아이디어를 얻기도 했다. 실제 단백질의 구조적 특징을 인식하도록 훈련된 모델에 임의의 아미노산 서열을 입력하자 자연 구조와 유사하지만 동일하지는 않은 수천 개의 가상 단백질이 생성됐다. 아미노산은 단백질의 기본 재료 물질로 아미노산 서열에 따라 다양한 단백질이 만들어진다.

AI 환각으로 설계된 단백질을 만드는 유전자를 합성해 미생물에 삽입하자 그동안 알려지지 않은 129종의 새로운 단백질이 만들어졌다. 베이커 교수는 “AI로 창의적 상상력을 한 단계 더 발전시켰다”고 밝혔다.

아난드쿠마르 미국 캘리포니아공대(칼텍) 수학·컴퓨팅과학과 교수는 병원균 오염을 줄일 수 있는 새로운 종류의 카테터를 설계하는 데 AI 환각을 활용했다. 카테터는 인체에 삽입할 때 쓰이는 얇은 의료용 관이다. 연구팀은 AI 모델로 수천 개의 카테터 모양을 생성하고 가장 효과적인 선택지를 골랐다. 내벽에 톱니 모양이 달려서 박테리아가 환자의 몸으로 거슬러 올라가는 것을 방지한다.

흐릿한 의료영상 이미지를 선명하게 만들기 위해 AI를 활용한 ‘환각 자기공명영상(MRI)’이라는 연구논문이 발표되기도 했다.

다만 과학자들 대부분은 환각이라는 표현에 대해서 부정확하고 오해의 소지가 있다고 생각해 사용을 피하는 것으로 나타났다. 챗GPT 같은 언어모델에서 모호한 인터넷 정보나 편견·거짓을 기반으로 발생하는 AI 환각과 달리 연구에 쓰이는 AI는 자연 현상과 과학적 데이터를 기반으로 하기 때문에 차이가 있다는 주장이다.

에이미 맥거번 미국 오클라호마대 기상학 및 컴퓨터과학과 교수는 “기상 전문가들이 AI로 미묘한 예보 변화와 확률 범위를 만들어 폭염 같은 극한 현상을 유발하는 요인을 발견할 수 있다”며 “AI 환각을 오래된 용어인 ‘확률 분포’로 설명할 수도 있다”고 말했다.

푸시미트 콜리 영국 구글 딥마인드 연구원은 “AI가 생명의 가장 깊은 비밀을 풀고 질병 치료, 건강 개선, 수명 연장을 위한 강력하고 새로운 기반을 구축할 것”이라고 밝혔다.

Loading

19 12월 2024

[wordpress, 워드프레스] WordPress 페이지또는 글에 별도 CSS와 JavaScript 추가하기

[wordpress, 워드프레스] WordPress 페이지또는 글에 별도 CSS와 JavaScript 추가하기

WordPress 페이지또는 글에 별도 CSS와 JavaScript 추가하기

WordPress 페이지또는 글에 별도 CSS와 JavaScript 추가하기

안녕하세요
RWDB 입니다~!!!

오늘 소개해드릴 내용은 WordPress 관련 내용인데요

WordPress에서 각 페이지나 글 등록시 해당 페이지나 글에만 적용되고 싶은 CSS, JavaScript 꼭 있잖아요??
그걸 쉽게~~ 아주 쉽게 하실 수 있게 하는 내용 입니다.

※ 다음에 소개하는 방법 functions.php을 사용하기 때문에 테마에 functions.php없는 경우 작성하십시오.

CSS를 추가 할 수 있도록

CSS를 추가 할 수 있도록하려면 아래 내용을 functions.php에 추가해주시면 됩니다.

functions.php

//Custom CSS Widget
add_action( 'admin_menu', 'custom_css_hooks' );
add_action( 'save_post', 'save_custom_css' );
add_action( 'wp_head','insert_custom_css' );
function custom_css_hooks() {
  add_meta_box( 'custom_css', 'Custom CSS', 'custom_css_input', 'post', 'normal', 'high' );
  add_meta_box( 'custom_css', 'Custom CSS', 'custom_css_input', 'page', 'normal', 'high' );
}
function custom_css_input() {
  global $post;
  echo '<input type="hidden" name="custom_css_noncename" id="custom_css_noncename" value="'.wp_create_nonce('custom-css').'" />';
  echo '<textarea name="custom_css" id="custom_css" rows="5" cols="30" style="width:100%;">'.get_post_meta($post->ID,'_custom_css',true).'</textarea>';
}
function save_custom_css($post_id) {
  if ( !wp_verify_nonce( $_POST['custom_css_noncename'], 'custom-css' ) ) return $post_id;
  if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE) return $post_id;
  $custom_css = $_POST['custom_css'];
  update_post_meta( $post_id, '_custom_css', $custom_css );
}
function insert_custom_css() {
  if ( is_page() || is_single() ) {
    if ( have_posts() ) : while ( have_posts() ) : the_post();
      echo '<style type="text/css">' . get_post_meta(get_the_ID(), '_custom_css', true) . '</style>';
    endwhile; endif;
    rewind_posts();
  }
}

JavaScript를 추가 할 수 있도록

JavaScript를 추가 할 수 있도록하려면 아래 내용을 functions.php에 추가해주시면 끝!

functions.php

//Custom JS Widget
add_action( 'admin_menu', 'custom_js_hooks' );
add_action( 'save_post', 'save_custom_js' );
add_action( 'wp_head','insert_custom_js' );
function custom_js_hooks() {
  add_meta_box( 'custom_js', 'Custom JS', 'custom_js_input', 'post', 'normal', 'high' );
  add_meta_box( 'custom_js', 'Custom JS', 'custom_js_input', 'page', 'normal', 'high' );
}
function custom_js_input() {
  global $post;
  echo '<input type="hidden" name="custom_js_noncename" id="custom_js_noncename" value="'.wp_create_nonce('custom-js').'" />';
  echo '<textarea name="custom_js" id="custom_js" rows="5" cols="30" style="width:100%;">'.get_post_meta($post->ID,'_custom_js',true).'</textarea>';
}
function save_custom_js($post_id) {
  if (!wp_verify_nonce($_POST['custom_js_noncename'], 'custom-js')) return $post_id;
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id;
  $custom_js = $_POST['custom_js'];
  update_post_meta($post_id, '_custom_js', $custom_js);
}
function insert_custom_js() {
  if ( is_page() || is_single() ) {
    if ( have_posts() ) : while ( have_posts() ) : the_post();
      echo '<script type="text/javascript">' . get_post_meta(get_the_ID(), '_custom_js', true) . '</script>';
    endwhile; endif;
    rewind_posts();
  }
}

CSS와 JavaScript를 모두 사용하시려면 둘다 넣으시면 되겠죠?? ㅋ
functions.php 파일을 저장후 편집 페이지를 확인해보시면 아래 이미지와 같이 추가된걸
확인 하실 수 있습니다. 

Custom CSS Write Panel

 [출처] http://rwdb.kr/wordpress-page-css-javascript/

Loading

14 12월 2024

[chatGPT] ChatGPT를 활용한 데이터베이스 설계 및 데이터분석 쿼리 실습 사례 – eCommerce 플랫폼을 위한 데이터 베이스 설계

[chatGPT] ChatGPT를 활용한 데이터베이스 설계 및 데이터분석 쿼리 실습 사례 – eCommerce 플랫폼을 위한 데이터 베이스 설계

오늘은 ChatGPT를 데이터베이스 설계 및 데이터 분석 쿼리를 만드데 사용하는 방법을 정리한 첫번째 내용으로 이 글에서는 ChatGPT를 활용하여 eCommerce 플랫폼을 위한 데이터베이스 설계 및 데이터 분석 쿼리를 만드는 방법에 대해 알아보겠습니다.

1. 요구사항 분석

eCommerce 플랫폼 개발을 위해 가장 먼저 필요한 작업은 데이터베이스 설계를 위한 요구 사항을 파악 하는 일입니다. 실제 요구사항 분석 단계는 고객사의 니즈를 파악하고 사용자 시나리오 분서, 성능, 확장성 등 다양한 조사와 작업들이 필요하지만 오늘은 ChatGPT를 통해 일반적인 요구 사항을 확인해보겠습니다. ChatGPT에게 먼저 eCommerce 플랫폼 개발을 위한 데이터베이스 설계를 위한 요구 사항을 확인해봅니다.

ChatGPT프롬프트
eCommerce 플랫폼 개발을 위한 DB 설계 요구 사항을 정리 해줘
 

01. pic1-507426aed497b8dfbc1fdc3e7e3e9d17.png

2. 데이터베이스 설계 및 테이블 생성

1) 설계

위에서 요구사항을 파악 한 것 처럼 eCommerce 플랫폼을 위한 데이터베이스는 사용자 정보, 제품 정보, 주문 정보, 결제 정보, 배송 정보, 리뷰 및 평점, 장바구니 정보 등을 관리해야 합니다. 이러한 정보를 관리하기 위해 다음과 같은 테이블을 생성할 수 있습니다:

  • Users
  • Products
  • Orders
  • OrderDetails
  • Payments
  • Shipping
  • Reviews
  • Cart
ChatGPT프롬프트
eCommerce 플랫폼 개발을 위한 DB table 들을 정리 해줘
 

02. pic2-eb33c323f111cbcd32f9fef80f6c19b9.png

2) ERD 작성

이러한 테이블 간의 관계는 ERD(Entity Relationship Diagram)를 통해 시각화할 수 있습니다. ERD는 데이터베이스 테이블 간의 관계를 보여주는 도구로, 데이터베이스 설계 과정에서 중요한 역할을 합니다. eCommerce의 테이블 간의 관계를 파악하기 위한 ERD를 그려보고 위의 테이블들을 만들고 ERD

ChatGPT프롬프트
위의 테이블 목록을 기반으로 데이터베이스 ERD를 그려줘
 

03 ecommerce-database-design-pic3-fbb9e60ae5f87c499817afb5ae11e829.png

참고로 ERD를 그리기 위해서는 Show Me 라는 ChatGPT 플러그인을 설치 하셔야 합니다.

3. 데이터베이스 쿼리 작성

먼저 ChatGPT로 위의 요구사항 분석 및 ERD 작성을 통해 도출된 데이터베이스 테이블을 만들기 위한 쿼리를 만들어봅니다.

1) 테이블 생성 쿼리

ChatGPT프롬프트
위의 테이블 생성을 위한 mysql 쿼리를 작성해줘
 

04 pic4-01fa31d2245a2d52607f9d9a2ed26a8c.png

2) 주요 동작(Operation) 쿼리

테이블 생성 후에는 MySQL 쿼리를 사용하여 데이터를 관리할 수 있습니다. 사용자 생성, 제품 조회, 주문 업데이트, 결제 정보 조회, 배송 정보 생성, 리뷰 작성, 장바구니에 제품 추가, 장바구니에서 제품 삭제, 장바구니 조회 등의 작업을 수행하는 데 필요한 기본적인 쿼리를 작성할 수 있습니다.

먼저 ChatGPTfh 주요 동작(Operation)들을 정리해봅니다.

ChatGPT프롬프트
주요 operation 들을 정리 해줘
 

05 pic5-1550d712be796c2c2e36e04db78f37fe.png

ChatGPT프롬프트
위에서 정리해준 주요 동작(Operation)을 위한 mysql 쿼리를 정리 해줘
 

06 pic6-cfd31c44115bf9de63912dcddf754934.png

3) 주요 동작(Operation) 상태 관리 및 상태 다이어그램

주문 관리, 결제 관리, 배송 관리의 경우 상태관리가 중요한 테이블 들이라 상태 관리를 위한 상태 들을 정의 해달라고 요청 합니다.

ChatGPT프롬프트
주문 관리, 결제 관리, 배송 관리 상태 관리를 위한 상태 들을 정리 해줘

 

07 pic6-2-5c42375d749bbe2525e1488c2ab23939.png

ChatGPT가 정리 해준 상태 정의를 기반으로 상태 다이어그램을 작성 해달라고 요청 합니다.

ChatGPT프롬프트
주문 관리, 결제 관리, 배송 관리 상태 관리를 위한 상태 다이어그램을 각각 작성 해줘
 

08 pic6-3-609a499d7619136652de7fead7a8f826.png

 09 pic6-4-efe54c273ec3c276e47d07d59eac61ca.png

 10 pic6-5-7c1b3479c3e01e45b3bfa8e27bab48fc.png

마지막으로 ChatGPT에게 주문 관리, 결제 관리, 배송 관리 상태 관리 업데이트를 위한 쿼리문들을 작성해 달라고 요청 합니다.

ChatGPT프롬프트
주문 관리, 결제 관리, 배송 관리 상태 관리 업데이트를 위한 쿼리문들을 작성해줘
 

11 pic6-6-13d838497016de194cfc0c113ee543af.png

이상으로 기본적인 테이블 생성 및 기본 동작 및 주요 테이블들의 상태 관리를 위한 쿼리 까지 작성 해볼 수 있었습니다. 다음으로는 월별 고객 데이터 분석과 판매 실적 분석 등 데이터 분석을 위한 쿼리를 만들어보겠습니다.

3. 데이터 분석 쿼리 만들기

데이터베이스가 준비 되고나면, 데이터 분석을 위한 쿼리를 작성할 수 있습니다. 월별 신규 고객 수, 월별 총 판매량, 월별 총 판매액, 월별 베스트셀러 상품 등의 정보를 얻는 데 도움이 되는 쿼리를 작성할 수 있습니다.

ChatGPT프롬프트
월별 고객 데이터 분석과 판매 실적 분석을 위한 쿼리들을 정리 해줘
 

12 pic7-193a47b09819c4f235bc900dcd361f8c.png

월별 고객 데이터 분석과 판매 실적 분석을 위한 쿼리는 다음과 같습니다:

월별 신규 고객 수(New Customers per Month):

SELECT DATE_FORMAT(creation_date, '%Y-%m') AS month, COUNT(*) AS new_customers
FROM Users
GROUP BY month;
 

이 쿼리는 각 월별로 신규 가입한 고객 수를 계산합니다. 여기서 creation_date는 사용자가 계정을 생성한 날짜를 나타내는 필드입니다.

월별 총 판매량(Total Sales per Month):

SELECT DATE_FORMAT(order_date, '%Y-%m') AS month, COUNT(*) AS total_sales
FROM Orders
WHERE payment_status = 'Completed'
GROUP BY month;
 

이 쿼리는 각 월별로 완료된 주문의 총 수를 계산합니다. 여기서 order_date는 주문이 생성된 날짜를 나타내는 필드입니다.

월별 총 판매액(Total Sales Amount per Month):

SELECT DATE_FORMAT(Orders.order_date, '%Y-%m') AS month, SUM(OrderDetails.quantity * Products.price) AS total_sales_amount
FROM Orders
JOIN OrderDetails ON Orders.order_id = OrderDetails.order_id
JOIN Products ON OrderDetails.product_id = Products.product_id
WHERE Orders.payment_status = 'Completed'
GROUP BY month;
 

이 쿼리는 각 월별로 판매된 제품의 총액을 계산합니다.

월별 베스트셀러 상품(Bestselling Products per Month):

SELECT DATE_FORMAT(Orders.order_date, '%Y-%m') AS month, Products.product_name, SUM(OrderDetails.quantity) AS quantity_sold
FROM Orders
JOIN OrderDetails ON Orders.order_id = OrderDetails.order_id
JOIN Products ON OrderDetails.product_id = Products.product_id
WHERE Orders.payment_status = 'Completed'
GROUP BY month, Products.product_name
ORDER BY quantity_sold DESC;
 

이 쿼리는 각 월별로 가장 많이 판매된 제품을 찾습니다.

이러한 쿼리는 월별 고객 데이터와 판매 실적을 분석하는 데 도움이 됩니다. 실제 구현시에는 비즈니스 요구 사항에 따라 쿼리가 달라질 수 있습니다.

7. 마치며

eCommerce 플랫폼 개발은 복잡한 과정이고 데이터베이스 설계 및 상태 관리에도 많은 고민이 필요하지만, ChatGPT를 활용해서 데이터베이스 설계 및 데이터 분석 쿼리 작성 과정을 쉽게 관리할 수 있었습니다. 이 글을 통해 eCommerce 플랫폼을 위한 데이터베이스 설계 및 데이터 분석 쿼리 작성에 대한 기본적인 이해 뿐만 아니라 원하는 시스템을 디자인하고 개발 하는데 도움이 되셨으면 좋겠습니다.

[출처] https://www.developerfastlane.com/docs/backend-database/ecommerce-platform-database-design

Loading

29 11월 2024

[DeepLearning] Learning to generate lyrics and music with Recurrent Neural Networks : 순환 신경망을 사용하여 가사와 음악을 생성하는 방법 배우기

[DeepLearning] Learning to generate lyrics and music with Recurrent Neural Networks : 순환 신경망을 사용하여 가사와 음악을 생성하는 방법 배우기

순환 신경망을 사용하여 가사와 음악을 생성하는 방법 배우기

RNN 기반 생성 모델을 가사와 피아노 음악 생성에 적용한 사례를 보여주는 게시물입니다.


소개

이 게시물에서는 가장 인기 있는/최근 아티스트의 가사 데이터 세트에서 RNN 문자 수준 언어 모델을 학습합니다. 학습된 모델을 가지고 다양한 아티스트의 다양한 스타일을 재밌게 섞은 몇 곡을 샘플링합니다. 그런 다음 모델을 업데이트하여 조건부 문자 수준 RNN으로 만들어 아티스트에 따라 노래를 샘플링할 수 있습니다. 마지막으로 피아노 곡의 미디 데이터 세트에서 모델을 학습하여 마무리합니다. 이러한 모든 작업을 해결하는 동안 문자 수준 RNN, 조건부 문자 수준 RNN, RNN 샘플링, 시간에 따른 절단된 역전파 및 그래디언트 체크포인팅과 같은 RNN 학습 및 추론과 관련된 몇 가지 흥미로운 개념을 간략하게 살펴보겠습니다. 모든 코드와 학습된 모델은 github에서 사용할 수 있으며 Pytorch 로 구현되었습니다 . 블로그 게시물은 jupyter notebook 형식으로도 볼 수 있습니다 . 문자 수준 언어 모델과 순환 신경망에 익숙하다면 해당 섹션을 건너뛰거나 결과 섹션으로 바로 이동하세요.

문자 수준 언어 모델

PNG 파일

모델을 선택하기 전에, 우리의 과제를 자세히 살펴보겠습니다. 현재 문자와 이전의 모든 문자가 주어졌을 때, 우리는 다음 문자를 예측해 볼 것입니다. 훈련하는 동안 우리는 시퀀스를 취하고, 마지막 문자를 제외한 모든 문자를 입력으로 사용하고, 두 번째 문자에서 시작하는 동일한 시퀀스를 기준 진실로 사용할 것입니다(위의 그림 참조; 출처 ). 우리는 예측을 할 때 이전의 모든 문자를 무시하는 가장 간단한 모델에서 시작하여, 이 모델을 개선하여 특정 수의 이전 문자만 고려하도록 하고, 예측을 할 때 이전의 모든 문자를 고려하는 모델로 결론지을 것입니다.

우리의 언어 모델은 문자 수준에서 정의됩니다. 우리는 모든 영어 문자와 마침표, 쉼표, 줄 끝 기호와 같은 일부 특수 기호를 포함하는 사전을 만들 것입니다. 각 문자는 one-hot-encoded 텐서로 표현됩니다. 문자 수준 모델과 예제에 대한 자세한 내용은 이 리소스를 추천합니다 .

문자를 가지고 있으므로 이제 문자 시퀀스를 형성할 수 있습니다. 지금도 고정된 확률로 문자를 무작위로 샘플링하여 문장을 생성할 수 있습니다 . 이것이 가장 간단한 문자 수준 언어 모델입니다. 이것보다 더 나은 방법은 없을까요? 그렇습니다. 훈련 코퍼스에서 각 문자의 발생 확률(문자가 발생하는 횟수를 데이터 세트 크기로 나눈 값)을 계산하고 이러한 확률을 사용하여 문자를 무작위로 샘플링할 수 있습니다. 이 모델은 더 좋지만 각 문자의 상대적인 위치적 측면을 완전히 무시합니다. 예를 들어, 단어를 읽는 방법에 주의하세요. 첫 번째 문자부터 시작하는데, 이는 일반적으로 예측하기 어렵지만 단어의 끝에 도달하면 때때로 다음 문자를 추측할 수 있습니다. 단어를 읽을 때 다른 텍스트를 읽고 배운 일부 규칙을 암묵적으로 사용하고 있습니다. 예를 들어, 단어에서 읽는 문자가 하나 더 추가될 때마다 공백 문자의 확률이 증가하거나(정말 긴 단어는 드뭅니다) 문자 “r” 뒤에 자음이 올 확률은 일반적으로 모음 뒤에 오기 때문에 낮습니다. 비슷한 규칙이 많이 있고, 우리 모델이 데이터로부터 이를 학습할 수 있기를 바랍니다. 우리 모델이 이러한 규칙을 학습할 수 있는 기회를 주기 위해 모델을 확장해야 합니다.

모델을 조금씩 점진적으로 개선하고 각 문자의 확률을 이전에 발생한 문자에만 의존하도록 합시다( 마르코프 가정 ). 따라서 기본적으로 . 이것은 마르코프 연쇄 모델 입니다( 익숙하지 않다면 이러한 대화형 시각화 도 시도해 보세요). 또한 훈련 데이터 세트에서 확률 분포를 추정할 수 있습니다. 이 모델은 대부분의 경우 현재 문자의 확률이 이전 문자에만 의존하지 않기 때문에 제한적입니다.

우리가 모델링하고자 하는 것은 실제로 . 처음에는 이전 문자의 수가 가변적이고 긴 시퀀스의 경우 정말 커질 수 있기 때문에 작업이 난해해 보입니다. Reccurent Neural Netoworks는 공유 가중치와 고정 크기 숨겨진 상태를 사용하여 어느 정도 이 문제를 해결할 수 있는 것으로 밝혀졌습니다. 이는 RNN에 전념하는 다음 섹션으로 이어집니다.

순환 신경망

PNG 파일

순환 신경망은 순차적 데이터를 처리하기 위한 신경망 계열입니다. 피드포워드 신경망과 달리 RNN은 내부 메모리를 사용하여 임의의 입력 시퀀스를 처리할 수 있습니다. 임의의 크기의 입력 시퀀스로 인해 사이클이 있는 그래프로 간결하게 표현됩니다(그림 참조; 출처 ). 하지만 입력 시퀀스의 크기를 알면 “펼쳐질” 수 있습니다. 현재 입력 과 이전 숨겨진 상태 에서 출력 과 현재 숨겨진 상태 로의 비선형 매핑을 정의합니다 . 숨겨진 상태 크기는 미리 정의된 크기를 가지며 각 단계에서 업데이트되고 매핑 결과에 영향을 미치는 기능을 저장합니다.

이제 문자 수준 언어 모델의 이전 그림과 접힌 RNN 그림을 맞춰서 RNN 모델을 사용하여 문자 수준 언어 모델을 어떻게 학습하는지 살펴보겠습니다.

그림에서는 Vanilla RNN을 사용하고 있지만, 우리의 작업에서는 LSTM을 사용할 것입니다. 왜냐하면 훈련이 더 쉽고 보통 더 나은 결과를 얻을 수 있기 때문입니다.

RNN에 대한 더 자세한 소개는 다음 자료 를 참조하세요 .

가사 데이터 세트

실험을 위해 우리는 다양한 최신 아티스트와 더 오래된 아티스트를 포함하는 55,000개 이상의 노래 가사 Kaggle 데이터 세트를 선택했습니다 . 이는 판다스 파일로 저장되며, 훈련 목적으로 사용할 수 있도록 파이썬 래퍼를 작성했습니다. 코드를 사용하려면 직접 다운로드해야 합니다.

결과를 더 잘 해석하기 위해, 나는 내가 어느 정도 알고 있는 아티스트 하위 집합을 선택했습니다.

artists = [
'ABBA',
'Ace Of Base',
'Aerosmith',
'Avril Lavigne',
'Backstreet Boys',
'Bob Marley',
'Bon Jovi',
'Britney Spears',
'Bruno Mars',
'Coldplay',
'Def Leppard',
'Depeche Mode',
'Ed Sheeran',
'Elton John',
'Elvis Presley',
'Eminem',
'Enrique Iglesias',
'Evanescence',
'Fall Out Boy',
'Foo Fighters',
'Green Day',
 'HIM',
 'Imagine Dragons',
 'Incubus',
 'Jimi Hendrix',
 'Justin Bieber',
 'Justin Timberlake',
'Kanye West',
 'Katy Perry',
 'The Killers',
 'Kiss',
 'Lady Gaga',
 'Lana Del Rey',
 'Linkin Park',
 'Madonna',
 'Marilyn Manson',
 'Maroon 5',
 'Metallica',
 'Michael Bolton',
 'Michael Jackson',
 'Miley Cyrus',
 'Nickelback',
 'Nightwish',
 'Nirvana',
 'Oasis',
 'Offspring',
 'One Direction',
 'Ozzy Osbourne',
 'P!nk',
 'Queen',
 'Radiohead',
 'Red Hot Chili Peppers',
 'Rihanna',
 'Robbie Williams',
 'Rolling Stones',
 'Roxette',
 'Scorpions',
 'Snoop Dogg',
 'Sting',
 'The Script',
 'U2',
 'Weezer',
 'Yellowcard',
 'ZZ Top']

무조건 문자 수준 언어 모델 훈련

우리의 첫 번째 실험은 전체 코퍼스에서 문자 수준 언어 모델 RNN을 훈련하는 것으로 구성되었습니다. 훈련하는 동안 아티스트 정보는 고려하지 않았습니다.

RNN에서 샘플링

모델을 훈련한 후 몇 곡을 샘플링해 보겠습니다. 기본적으로 RNN은 각 단계에서 로짓을 출력하고 이를 소프트맥스하여 해당 분포에서 샘플링할 수 있습니다. 또는 Gumble-Max 트릭을 사용하여 로짓을 직접 샘플링 할 수도 있는데 이는 동일합니다.

샘플링에 대한 흥미로운 점 하나는 우리가 입력 시퀀스를 부분적으로 스스로 정의하고 그 초기 조건으로 샘플링을 시작할 수 있다는 것입니다. 예를 들어, “Why”로 시작하는 노래를 샘플링할 수 있습니다.

Why do you have to leave me?  
I think I know I'm not the only one  
I don't know if I'm gonna stay awake  
I don't know why I go along  
  
I don't know why I can't go on  
I don't know why I don't know  
I don't know why I don't know  
I don't know why I keep on dreaming of you   

음, 그럴 법한 노래네요 😀

“Well”로 시작하는 노래로 샘플링해 보겠습니다.

Well, I was a real good time  
I was a rolling stone  
I was a rock and roller  
Well, I never had a rock and roll  
There were times I had to do it  
I had a feeling that I was found  
I was the one who had to go  

샘플링 중에 사용되는 “온도” 매개변수가 있는데, 이는 샘플링 프로세스의 무작위성을 제어합니다. 이 매개변수가 0에 가까워지면 샘플링은 argmax와 동일하고 무한대에 가까워지면 샘플링은 균일한 분포에서 샘플링하는 것과 동일합니다. Jang et al.의 관련 논문 에서 그림을 살펴보세요 .

PNG 파일

, 분포는 영향을 받지 않습니다. 를 감소시키면 분포가 더 두드러지게 되며, 이는 더 큰 확률 질량을 가진 값이 증가한다는 것을 의미합니다. 를 0에 가까워지면 샘플링 은 armax와 동일해지므로 해당 값의 확률이 1에 가까워집니다. 를 증가시키기 시작하면 분포가 점점 더 균일해집니다.

이전 샘플은 온도 매개변수가 . 와 같도록 생성되었습니다. . 로 늘리면 어떻게 되는지 살펴보겠습니다 . 샘플:

Why can't we drop out of time?  
We were born for words to see.  
Won't you love this. You're still so amazing.  
This could be that down on Sunday Time.  
Oh, Caroline, a lady floor.  
I thought of love, oh baby.  

좀더 늘려보도록 하죠.

Why - won't we grow up naked?  
We went quietly what we would've still give  
That girl you walked before our bedroom room  
I see your mind is so small to a freak  
Stretching for a cold white-heart of crashing  
Truth in the universal daughter  
  
I lose more and more hard  
I love you anytime at all  
Ah come let your help remind me  
Now I've wanted waste and never noticed  
  
I swear I saw you today  
You needed to get by  
But you sold a hurricane  
Well out whispered in store

사실, 왜 우리는 벌거벗고 자라지 않을까요? 😀 온도가 높아질수록 샘플링된 문장이 점점 더 무작위적이 되는 추세를 볼 수 있죠.

조건부 문자 수준 언어 모델 훈련

특정 아티스트의 스타일로 가사를 생성할 수 있다고 상상해보세요. 모델을 변경하여 훈련 중에 이 정보를 사용할 수 있도록 합시다.

우리는 RNN에 추가 입력을 추가하여 이를 수행할 것입니다. 지금까지 우리의 RNN 모델은 각 단계에서 원핫 인코딩된 문자가 포함된 텐서만 허용했습니다.

우리 모델의 확장은 매우 간단할 것입니다. 아티스트를 나타내는 추가 원핫 인코딩 텐서가 있을 것입니다. 따라서 각 단계에서 RNN은 캐릭터와 아티스트를 나타내는 연결된 텐서로 구성되는 텐서 하나를 허용합니다. 자세한 내용은 여기를 참조하세요 .

조건 언어 모델 RNN에서 샘플링

훈련 후, 우리는 아티스트에 따라 몇 곡을 샘플링했습니다. 아래에서 몇 가지 결과를 찾을 수 있습니다.

그를:

My fears  
And the moment don't make me sing  
So free from you  
The pain you love me yeah  
  
Whatever caused the warmth  
You smile you're happy  
You sit away  
You say it's all in vain  

실제로 가능해 보이는데, 특히 ‘고통’이라는 단어가 사용됐기 때문입니다. 이 단어는 아티스트의 가사에서 매우 흔하게 쓰입니다.

아바:

Oh, my love it makes me close a thing  
You've been heard, I must have waited  
I hear you  
So I say  
Thank you for the music, that makes me cry  
  
And you moving my bad as me, ah-hang wind in the hell  
I was meant to be with you, I'll never be playing up

밥 말리:

Mercy on judgment, we got so much  
  
Alcohol, cry, cry, cry  
Why don't try to find our own  
I want to know, Lord, I wanna give you  
Just saving it, learned  
Is there any more?  
  
All that damage done  
That's all reason, don't worry  
Need a hammer  
I need you more and more  

콜드플레이:

Look at the stars  
Into life matter where you lay  
Saying no doubt  
I don't want to fly  
In my dreams and fight today

I will fall for you  
  
All I know  
And I want you to stay  
Into the night  
  
I want to live waiting  
With my love and always  
Have I wouldn't wasted  
Would it hurt you

카니예 웨스트:

I'm everywhere for you  
The way that it couldn't stop  
I mean it too late and love I made in the world  
I told you so I took the studs full cold-stop  
The hardest stressed growin'  
The hustler raisin' on my tears  
I know I'm true, one of your love

꽤 멋져 보이지만 검증 정확도를 추적하지 않았기 때문에 일부 샘플링된 라인은 rnn에서 기억했을 수도 있다는 점을 명심하세요.더 나은 방법은 훈련 중에 가장 좋은 검증 점수를 제공하는 모델을 선택하는 것입니다(이런 방식으로 훈련을 수행한 다음 섹션의 코드 참조).또한 흥미로운 사실 ​​하나를 발견했습니다.무조건 모델은 일반적으로 지정된 시작 문자열로 샘플링할 때 더 나은 성능을 보입니다.지정된 시작 문자열로 조건부 모델에서 샘플링할 때 실제로 모델에 두 가지 조건(시작 문자열과 아티스트)을 적용한 반면, 이전에 탐색한 모델의 경우 하나의 조건만 적용했습니다.그리고 그 조건부 분포를 잘 모델링할 만큼 충분한 데이터가 없었습니다(모든 아티스트가 비교적 제한된 수의 노래를 가지고 있음).

우리는 코드와 모델을 공개하고 있으며, GPU 없이도 훈련된 모델에서 노래를 샘플링할 수 있습니다. 이는 실제로 컴퓨팅 측면에서 많은 요구가 없기 때문입니다.

미디 데이터 세트

다음으로, 우리는 대략 피아노 곡으로 구성된 작은 미디 데이터세트 로 작업할 것입니다 . 우리는 피아노 데이터세트(트레이닝 분할만)를 사용했습니다 .Nottingam

모든 미디 파일을 피아노 롤로 변환 할 수 있다는 것이 밝혀졌습니다. 피아노 롤은 각 행이 다른 미디 피치이고 각 열이 시간적으로 다른 슬라이스인 시간-주파수 행렬입니다. 따라서 데이터 세트의 각 피아노 곡은 크기의 행렬로 표현되며 , 여기서 는 피아노의 피치 수입니다. 피아노 롤 행렬의 예는 다음과 같습니다.

PNG 파일

이 표현은 음악 이론에 익숙하지 않은 사람이라도 매우 직관적이고 해석하기 쉽습니다. 각 행은 피치를 나타냅니다. 위쪽 행은 저주파 피치를 나타내고 아래쪽 행은 고주파 피치를 나타냅니다. 게다가 시간을 나타내는 수평축이 있습니다. 따라서 특정 피치의 사운드를 특정 시간 동안 연주하면 수평선이 표시됩니다. 전반적으로 이는 유튜브의 피아노 튜토리얼 과 매우 유사합니다 .

이제 문자 수준 모델과 새로운 작업의 유사점을 살펴보겠습니다. 현재의 경우 이전에 연주된 모든 피치를 고려하여 다음 타임스텝에서 연주될 피치를 예측해야 합니다. 피아노 롤 그림을 보면 각 열은 어떤 종류의 음악적 캐릭터를 나타내며 이전의 모든 음악적 캐릭터를 고려하여 다음 음악을 예측하려고 합니다. 텍스트 문자와 음악적 캐릭터의 차이점에 주의해 보겠습니다. 기억하시겠지만 언어 모델의 각 캐릭터는 원핫 벡터로 표현되었습니다(즉, 벡터에서 하나의 값만 이고 다른 값은 입니다 ). 음악적 캐릭터의 경우 한 타임스텝에서 여러 키를 누를 수 있습니다(다성음 데이터 세트로 작업하고 있기 때문입니다). 이 경우 각 타임스텝은 두 개 이상의 를 포함할 수 있는 벡터로 표현됩니다 .

피치 레벨 피아노 음악 모델 훈련

학습을 시작하기 전에, 이전 섹션에서 논의한 다양한 입력을 설명하기 위해 언어 모델에 사용한 손실을 조정해야 합니다. 언어 모델에서, 각 타임스텝에 대한 입력으로 원-핫 인코딩된 텐서(문자)를 사용했고, 출력(예측된 다음 문자)으로 원-핫 인코딩된 텐서를 사용했습니다. 예측된 다음 문자에 대해 단일 배타적 선택을 해야 했기 때문에, 교차 엔트로피 손실을 사용했습니다 .

하지만 이제 우리 모델은 더 이상 원핫 인코딩(여러 키를 누를 수 있음)이 아닌 벡터를 출력합니다. 물론, 눌린 키의 모든 가능한 조합을 별도의 클래스로 처리할 수 있지만, 이는 어렵습니다. 대신 출력 벡터의 각 요소를 이진 변수( – 누름, – 키를 누르지 않음)로 처리합니다. 출력 벡터의 각 요소에 대한 별도의 손실을 이진 교차 엔트로피로 정의합니다. 그리고 최종 손실은 이러한 이진 교차 엔트로피의 평균 합계가 됩니다. 더 잘 이해하기 위해 코드를 읽을 수도 있습니다.

앞서 언급한 변경 사항을 적용한 후, 우리는 모델을 훈련했습니다. 다음 섹션에서는 샘플링을 수행하고 결과를 검사합니다.

피치 레벨 RNN에서 샘플링

우리는 최적화 초기 단계에서 피아노 롤을 샘플링했습니다.

PNG 파일

우리 모델이 데이터 세트의 노래에서 공통적으로 나타나는 하나의 공통 패턴을 학습하기 시작한 것을 볼 수 있습니다. 각 노래는 두 개의 다른 부분으로 구성되어 있습니다. 첫 번째 부분에는 별도로 연주되고 매우 구별되며 종종 부를 수 있는 피치 시퀀스가 ​​포함되어 있습니다 (멜로디라고도 함). 샘플링된 피아노 롤을 보면 이 부분이 하단에서 명확하게 보입니다. 피아노 롤의 상단도 보면 일반적으로 함께 연주되는 피치 그룹이 보입니다. 이것은 멜로디를 동반하는 화음(노래 전체에서 함께 연주되는 피치)의 진행 또는 하모니입니다.

훈련이 끝날 무렵 우리 모델에서 추출한 샘플은 다음과 같이 보이기 시작했습니다.

PNG 파일

보시다시피 이는 이전 섹션에서 보여드린 실제 피아노 롤 사진과 더욱 유사해 보이기 시작했습니다.

훈련 후, 우리는 노래를 샘플링하고 분석했습니다. 흥미로운 소개가 있는 샘플 하나를 얻었습니다 . 다른 샘플은 멋진 스타일 전환을 특징으로 합니다 . 동시에 낮은 온도 매개변수를 가진 몇 가지 예를 생성하여 느린 템포의 노래를 만들었습니다. 첫 번째 와 두 번째는 여기 있습니다 . 전체 재생 목록은 여기 에서 찾을 수 있습니다 .

이제 GPU 메모리 소비와 속도 관점에서 문제를 살펴보겠습니다.

우리는 배치로 시퀀스를 처리함으로써 계산 속도를 크게 높였습니다. 동시에, 시퀀스가 ​​길어질수록(데이터 세트에 따라 다름) 최대 배치 크기가 감소하기 시작합니다. 왜 그럴까요? 역전파를 사용하여 기울기를 계산할 때, 메모리 소비에 가장 큰 영향을 미치는 모든 중간 활동을 저장해야 합니다. 시퀀스가 ​​길어질수록 더 많은 활성화를 저장해야 하므로 배치에 더 적은 예제를 넣을 수 있습니다.

때로는 정말 긴 시퀀스로 작업해야 하거나 배치 크기를 늘리거나, 아니면 사용 가능한 메모리 양이 적은 GPU가 필요할 수도 있습니다. 이 경우 메모리 소모를 줄이는 여러 가지 가능한 솔루션이 있지만, 서로 다른 상충 관계가 있는 두 가지를 언급하겠습니다.

첫 번째는 잘린 역전파 입니다 . 아이디어는 전체 시퀀스를 하위 시퀀스로 분할하고 이를 별도의 배치로 처리하는 것입니다. 단, 이러한 배치를 분할 순서대로 처리하고 모든 다음 배치는 이전 배치의 숨겨진 상태를 초기 숨겨진 상태로 사용합니다. 또한 이 접근 방식의 구현을 제공하여 더 잘 이해할 수 있도록 합니다. 이 접근 방식은 분명히 전체 시퀀스를 처리하는 것과 정확히 동일하지는 않지만 더 자주 업데이트하고 메모리를 덜 사용합니다. 반면에 한 하위 시퀀스의 길이를 넘어서는 장기 종속성을 포착하지 못할 가능성이 있습니다.

두 번째는 그래디언트 체크포인팅 입니다 . 이 방법은 더 많은 계산을 수행하는 대가로 전체 시퀀스에서 모델을 학습하는 동안 더 적은 메모리를 사용할 수 있는 가능성을 제공합니다. 기억하시겠지만, 이전에 학습하는 동안 가장 많은 메모리가 활성화에 의해 차지된다고 언급했습니다. 그래디언트 체크포인팅의 아이디어는 모든 -번째 활성화만 저장하고 나중에 저장되지 않은 활성화를 다시 계산하는 것입니다. 이 방법은 이미 Tensorflow에 구현되어 있으며 Pytorch에 구현되고 있습니다 .

결론 및 향후 작업

저희의 작업에서는 텍스트에 대한 간단한 생성 모델을 훈련하고, 다성음악에 맞춰 모델을 확장했으며, 샘플링이 작동하는 방식과 온도 매개변수가 텍스트와 음악 샘플에 어떤 영향을 미치는지 간략히 살펴보았습니다. 낮은 온도는 더 안정적인 결과를 제공하는 반면, 높은 온도는 더 많은 무작위성을 추가하여 때로는 매우 흥미로운 샘플이 생성됩니다.

향후 작업에는 두 가지 방향이 포함될 수 있습니다. 더 많은 응용 프로그램 또는 이미 훈련된 모델에 대한 심층 분석입니다. 예를 들어 동일한 모델을 Spotify 청취 기록에 적용할 수 있습니다. 청취 기록 데이터에 대한 학습이 끝나면 이전 1시간 정도 동안 들었던 노래 시퀀스를 제공하면 하루 종일 재생 목록을 샘플링합니다. 탐색 기록에도 동일한 작업을 수행할 수 있으며, 탐색 행동 패턴을 분석하는 멋진 도구가 됩니다. 다양한 활동(헬스장에서 운동, 사무실에서 일하기, 수면)을 수행하는 동안 휴대폰에서 가속도계 및 자이로스코프 데이터를 수집 하고 이러한 활동 단계를 분류하는 방법을 학습합니다. 그런 다음 활동에 따라 음악 재생 목록을 자동으로 변경할 수 있습니다(수면 – 비 오는 차분한 음악, 헬스장에서 운동 – 고강도 음악). 의료 응용 프로그램의 경우 이 작업 과 유사하게 모델을 적용하여 맥박 및 기타 데이터를 기반으로 심장 문제를 감지할 수 있습니다 .

음악 생성을 위해 훈련된 RNN에서 뉴런 발화를 분석하는 것은 매우 흥미로울 것입니다 . 모델이 몇 가지 간단한 음악 개념(화성과 멜로디에 대한 논의와 같은)을 암묵적으로 배웠는지 확인하기 위해서입니다. RNN의 숨겨진 표현을 사용하여 음악 데이터 세트를 클러스터링하여 유사한 노래를 찾을 수 있습니다.

이 글을 마무리하기 위해 무조건 모델의 마지막 가사를 샘플링해 보겠습니다 😀 :

The story ends  
The sound of the blue  
The tears were shining  
The story of my life  
I still believe  
The story of my life 

[출처] https://warmspringwinds.github.io/pytorch/rnns/2018/01/27/learning-to-generate-lyrics-and-music-with-recurrent-neural-networks/

Learning to generate lyrics and music with Recurrent Neural Networks

A post showing an application of RNN-based generative models for lyrics and piano music generation.


Introduction

In this post we will train RNN character-level language model on lyrics dataset of most popular/recent artists. Having a trained model, we will sample a couple of songs which will be a funny mixture of different styles of different artists. After that we will update our model to become a conditional character-level RNN, making it possible for us to sample songs conditioned on artist. And finally, we conclude by training our model on midi dataset of piano songs. While solving all these tasks, we will briefly explore some interesting concepts related to RNN training and inference like character-level RNN, conditional character-level RNN, sampling from RNN, truncated backpropagation through time and gradient checkpointing. All the code and trained models are available on github and were implemented in Pytorch. The blog post can also be viewed in a jupyter notebook format. If you are already familiar with the character-level language model and recurrent neural networks, feel free to skip respective sections or go directly to the results section.

Character-Level language model

png

Before choosing a model, let’s have a closer look at our task. Given current letter and all previous letters, we will try to predict the next character. During training we will just take a sequence, and use all its characters except the last one as an input and the same sequence starting from the second character as groundtruth (see the picture above; Source). We will start from the simplest model that ignores all the previous characters while making a prediction, improve this model to make it take only a certain number of previous characters into account, and conclude with a model that takes all the previous characters into consideration while making a prediction.

Our language model is defined on a character level. We will create a dictionary which will contain all English characters plus some special symbols, like period, comma, and end-of-line symbol. Each charecter will be represented as one-hot-encoded tensor. For more information about character-level models and examples, I recommend this resource.

Having characters, we can now form sequences of characters. We can generate sentences even now just by randomly sampling character after character with a fixed probability . That’s the most simple character level language model. Can we do better than this? Yes, we can compute the probabily of occurance of each letter from our training corpus (number of times a letter occures divided by the size of our dataset) and randomly sample letter using these probabilities. This model is better but it totally ignores the relative positional aspect of each letter. For example, pay attention on how you read any word: you start with the first letter, which is usually hard to predict, but as you reach the end of a word you can sometimes guess the next letter. When you read any word you are implicitly using some rules which you learned by reading other texts: for example, with each additional letter that you read from a word, the probability of a space character increases (really long words are rare) or the probability of any consonant after the letter “r” is low as it usually followed by vowel. There are lot of similar rules and we hope that our model will be able to learn them from data. To give our model a chance to learn these rules we need to extend it.

Let’s make a small gradual improvement of our model and let probability of each letter depend only on the previously occured letter (markov assumption). So, basically we will have . This is a Markov chain model (also try these interactive visualizations if you are not familiar with it). We can also estimate the probability distribution from our training dataset. This model is limited because in most cases the probability of the current letter depends not only on the previous letter.

What we would like to model is actually . At first, the task seems intractable as the number of previous letters is variable and it might become really large in case of long sequences. Turns out Reccurent Neural Netoworks can tackle this problem to a certain extent by using shared weights and fixed size hidden state. This leads us to a next section dedicated to RNNs.

Recurrent Neural Networks

png

Recurrent neural networks are a family of neural networks for processing sequential data. Unlike feedforward neural networks, RNNs can use their internal memory to process arbitrary sequences of inputs. Because of arbitrary size input sequences, they are concisely depicted as a graph with a cycle (see the picture; Source). But they can be “unfolded” if the size of input sequence is known. They define a non-linear mapping from a current input and previous hidden state to the output and current hidden state . Hidden state size has a predefined size and stores features which are updated on each step and affect the result of mapping.

Now align the previous picture of the character-level language model and the ufolded RNN picture to see how we are using the RNN model to learn a character level language model.

While the picture depicts the Vanilla RNN, we will use LSTM in our work as it is easier to train usually achieves better results.

For a more elaborate introduction to RNNs, we refer reader to the following resource.

Lyrics dataset

For our experiments we have chosen 55000+ Song Lyrics Kaggle dataset which contains good variety of recent artists and more older ones. It is stored as a pandas file and we wrote a python wrapper around it to be able to use it for training purposes. You will have to download it yourself in order to be able to use our code.

In order to be able to interpret the results better, I have chosen a subset of artists which I am more or less familiar with:

artists = [
'ABBA',
'Ace Of Base',
'Aerosmith',
'Avril Lavigne',
'Backstreet Boys',
'Bob Marley',
'Bon Jovi',
'Britney Spears',
'Bruno Mars',
'Coldplay',
'Def Leppard',
'Depeche Mode',
'Ed Sheeran',
'Elton John',
'Elvis Presley',
'Eminem',
'Enrique Iglesias',
'Evanescence',
'Fall Out Boy',
'Foo Fighters',
'Green Day',
 'HIM',
 'Imagine Dragons',
 'Incubus',
 'Jimi Hendrix',
 'Justin Bieber',
 'Justin Timberlake',
'Kanye West',
 'Katy Perry',
 'The Killers',
 'Kiss',
 'Lady Gaga',
 'Lana Del Rey',
 'Linkin Park',
 'Madonna',
 'Marilyn Manson',
 'Maroon 5',
 'Metallica',
 'Michael Bolton',
 'Michael Jackson',
 'Miley Cyrus',
 'Nickelback',
 'Nightwish',
 'Nirvana',
 'Oasis',
 'Offspring',
 'One Direction',
 'Ozzy Osbourne',
 'P!nk',
 'Queen',
 'Radiohead',
 'Red Hot Chili Peppers',
 'Rihanna',
 'Robbie Williams',
 'Rolling Stones',
 'Roxette',
 'Scorpions',
 'Snoop Dogg',
 'Sting',
 'The Script',
 'U2',
 'Weezer',
 'Yellowcard',
 'ZZ Top']

Training unconditional character-level language model

Our first experiment consisted of training of our character-level language model RNN on the whole corpus. We didn’t take into consideration the artist information while training.

Sampling from RNN

Let’s try to sample a couple of songs after training our model. Basically, on each step our RNN will output logits and we can softmax them and sample from that distribution. Or we can use Gumble-Max trick and sample using logits directly which is equivalent.

One intersting thing about sampling is that we can partially define the input sequence ourselves and start sampling with that initial condition. For example, we can sample a song that starts with “Why”:

Why do you have to leave me?  
I think I know I'm not the only one  
I don't know if I'm gonna stay awake  
I don't know why I go along  
  
I don't know why I can't go on  
I don't know why I don't know  
I don't know why I don't know  
I don't know why I keep on dreaming of you   

Well, that sounds like a possible song 😀

Let’s sample with a song that starts with “Well”:

Well, I was a real good time  
I was a rolling stone  
I was a rock and roller  
Well, I never had a rock and roll  
There were times I had to do it  
I had a feeling that I was found  
I was the one who had to go  

There is “temperature” parameter that is used during sampling which controls the randomness of sampling process. When this parameter approaches zero, the sampling is equivalent to argmax and when it is close to infinity the sampling is equivalent to sampling from a uniform distribution. Have a look at the figure from a relevant paper by Jang et al.:

png

When , the distribution is not affected. If we decrease , the distribution becomes more pronounced, meaning that value with bigger probability mass will have it increased. When will approach zero, sampling will be equivalent to armax, because the probability of that value will be close to one. When we start to icrease the distribution becomes more and more uniform.

The previous sample was generated with a temperature paramter equal to . Let’s see what happens when we increase it to and sample:

Why can't we drop out of time?  
We were born for words to see.  
Won't you love this. You're still so amazing.  
This could be that down on Sunday Time.  
Oh, Caroline, a lady floor.  
I thought of love, oh baby.  

Let’s try increasing it even more:

Why - won't we grow up naked?  
We went quietly what we would've still give  
That girl you walked before our bedroom room  
I see your mind is so small to a freak  
Stretching for a cold white-heart of crashing  
Truth in the universal daughter  
  
I lose more and more hard  
I love you anytime at all  
Ah come let your help remind me  
Now I've wanted waste and never noticed  
  
I swear I saw you today  
You needed to get by  
But you sold a hurricane  
Well out whispered in store

Why don’t we grow up naked, indeed? 😀 Well, you can see that trend that when we increase the temperature, sampled sentences become more and more random.

Training conditional character-level language model

Imagine if we could generate lyrics in a style of some particular artist. Let’s change our model, so that it can use this information during training.

We will do this by adding an additional input to our RNN. So far, our RNN model was only accepting tensors containing one-hot encoded character on each step.

The extention to our model will be very simple: we will have and additional one-hot encoded tensor which will represent the artist. So on each step the RNN will accept one tensor which will consist of concatenated tensors representing character and artist. Look here for more.

Sampling from conditional language model RNN

After training, we sampled a couple of songs conditined on artist. Below you can find some results.

Him:

My fears  
And the moment don't make me sing  
So free from you  
The pain you love me yeah  
  
Whatever caused the warmth  
You smile you're happy  
You sit away  
You say it's all in vain  

Seems really possible, especially the fact the the word pain was used, which is very common in the lyrics of the artist.

ABBA:

Oh, my love it makes me close a thing  
You've been heard, I must have waited  
I hear you  
So I say  
Thank you for the music, that makes me cry  
  
And you moving my bad as me, ah-hang wind in the hell  
I was meant to be with you, I'll never be playing up

Bob Marley:

Mercy on judgment, we got so much  
  
Alcohol, cry, cry, cry  
Why don't try to find our own  
I want to know, Lord, I wanna give you  
Just saving it, learned  
Is there any more?  
  
All that damage done  
That's all reason, don't worry  
Need a hammer  
I need you more and more  

Coldplay:

Look at the stars  
Into life matter where you lay  
Saying no doubt  
I don't want to fly  
In my dreams and fight today

I will fall for you  
  
All I know  
And I want you to stay  
Into the night  
  
I want to live waiting  
With my love and always  
Have I wouldn't wasted  
Would it hurt you

Kanye West:

I'm everywhere for you  
The way that it couldn't stop  
I mean it too late and love I made in the world  
I told you so I took the studs full cold-stop  
The hardest stressed growin'  
The hustler raisin' on my tears  
I know I'm true, one of your love

Looks pretty cool but keep in mind that we didn’t track the validation accuracy so some sampled lines could have been just memorized by our rnn. A better way to do it is to pick a model that gives best validation score during training (see the code for the next section where we performed training this way). We also noticed one interesting thing: the unconditional model usually performes better when you want to sample with a specified starting string. Our intuition is that when sampling from a conditional model with a specified starting string, we actually put two conditions on our model – starting string and an artist compared to the one condition in the case of previous model that we explored. And we didn’t have enough data to model that conditional distribution well (every artist has relatively limited number of songs).

We are making the code and models available and you can sample songs from our trained models even without gpu as it is not really computationally demanding.

Midi dataset

Next, we will work with a small midi dataset consisting of approximately piano songs. We have used the Nottingam piano dataset (training split only).

Turns out that any midi file can be converted to piano roll which is just is a time-frequency matrix where each row is a different MIDI pitch and each column is a different slice in time. So each piano song from our dataset will be represented as a matrix of size , where is a number of pitches of the piano. Here is an example of piano roll matrix:

png

This representation is very intuitive and easy to interpret even for a person that is not familiar with music theory. Each row represents a pitch: top rows represent low frequency pitches and bottom rows represent high pitches. Plus, we have a horizontal axis which represents time. So if we play a sound with a certain pitch for a certian period of time, we will see a horizontal line. Overall, this is very similar to piano tutorials on youtube.

Now, let’s try to see the similarities between the character-level model and our new task. In the current case, we will have to predict the pitches that will be played on the next timestep, given all the previously played pitches. So, if you look at the picture of the piano roll, each column represents some kind of a musical character and given all the previous musical characters, we want to predict the next one. Let’s pay attention to the difference between a text character and a musical character. If you recall, each character in our language model was represented by one-hot vector (meaning that only one value in our vector is and others are ). For music character multiple keys can be pressed at one timestep (since we are working with polyphonic dataset). In this case, each timestep will be represented by a vector which can contain more than one .

Training pitch-level piano music model

Before starting the training, we will have to adjust our loss that we have used for language model to account for different input that we discussed in the previous section. In the language model, we had one-hot encoded tensor (character) as an input on each timestep and one-hot encoded tensor as output (predicted next character). As we had to make a single exlusive choice for predicted next character, we used cross-entropy loss.

But now our model outputs a vector which is no longer one-hot encoded (multiple keys can be pressed). Of course, we can treat all possible combinations of pressed keys as a separate class, but this is intractable. Instead, we will treat each element of the output vector as a binary variable ( – pressing, – not pressing a key). We will define a separate loss for each element of the output vector to be binary cross-entropy. And our final loss will be an averaged sum of these binary cross-entropies. You can also read the code to get a better understanding.

After making the aforementioned changes, we trained our model. In the next section, we will perform sampling and inspect the results.

Sampling from pitch-level RNN

We have sampled piano rolls during the early stages of optimization:

png

You can see that our model is starting to learn one common pattern that is common among the songs from our dataset: each song consists of two different parts. First part contains a sequence of pitches that are played separately and are very distinguishable and are often singable (also know as melody). If you look at the sampled piano roll, this part can be clearly seen in the bottom. If you also have a look at the top of our piano roll, we can see a group of pitches that are usually played together – this is harmony or a progression of chords (pitches that are played together throughout the song) which accompanies the melody.

By the end of the training samples drawn from our model started to look like this:

png

As you can see they started to look more similar to the picture of the ground-truth piano roll that we showed in the previous sections.

After training, we have sampled songs and analyzed them. We got one sample with an interesting introduction. While another sample features a nice style transition. At the same time we generated a couple of examples with low temperature parameter which resulted in songs with a slow tempo: first one and a second one here. You can find the whole playlist here.

Now let’s look at our problem from the gpu memory consumption and speed point of view.

We greatly speed up computation by processing our sequences in batches. At the same time, as our sequences become longer (depending on the dataset), our max batch size starts to decrease. Why is it a case? As we use backpropagation to compute gradients, we need to store all the intermediate acitvations, which contribute the most to the memory consumption. As our sequence becomes longer, we need to store more activations, therefore, we can fit less examples in our batch.

Sometimes, we either have to work with really long sequences or we want to increase our batch size or maybe you just have a gpu with small amount of memory available. There are multiple possible solutions to reduce memory consumption in this case, but we will mention two, which will have different trade-offs.

First one is a truncated back propagation. The idea is to split the whole sequence into subsequences and treat them as separate batches with an exception that we process these batches in the order of split and every next batch uses hidden state of previous batch as an initial hidden state. We also provide an implementation of this approach, so that you can get the better understanding. This approach is obviously not an exact equivalent of processing the whole sequence but it makes more frequent updates and consumes less memory. On the other hand, there is a chance that we might not be able to capture long-term dependencies that span beyond the length of one subsequence.

Second one is gradient checkpointing. This method gives us a possibilty to use less memory while training our model on the whole sequence on the expence of performing more computation. If you recall, previously we mentioned that the most memory during training is occupied by activations. The idea of gradient checkpointing consists of storing only every -th activation and recomputing the unsaved activations later. This method is already implemented in Tensorflow and being implemented in Pytorch.

Conclusion and future work

In our work we trained simple generative model for text, extended our model to work with polyphonic music, briefly looked at how sampling works and how the temperature parameter affects our text and music samples – low temperature gives more stable results while high temperature adds more randomness which sometimes gives rise to very interesting samples.

Future work can include two directions – more applications or deeper analysis of the already trained models. Same models can be applied to your spotify listening history, for example. After training on your listening history data, you can give it a sequence of songs that you have listened to in the previous hour or so, and it will sample a playlist for you for the rest of the day. Well, you can also do the same for your browsing history, which will be just a cool tool to analyze your browsing behaviour patterns. Capture the accelerometer and gyroscope data from your phone while doing different activities (exercising in the gym, working in the office, sleeping) and learn to classify these activity stages. After that you can change your music playlist automatically, based on your activity (sleeping – calm music of rain, exercising in the gym – high intensity music). In terms of medical applications, model can be applied to detect heart problems based on pulse and other data, similar to this work.

It would be very interesting to analyze the neuron firings in our RNN trained for music generation like here. To see if the model learned some simple music concepts implicitly (like our discussion of harmony and melody). The hidden representation of RNN can be used to cluster our music dataset to find similar songs.

Let’s sample one last lyrics from our unconditional model to conclude this post 😀 :

The story ends  
The sound of the blue  
The tears were shining  
The story of my life  
I still believe  
The story of my life 

Loading

11 11월 2024

[인공지능 기술] “GPT 성능 향상 속도 둔화”…오픈AI, ‘오라이온’ 개선 위해 전략 수정

[인공지능 기술] “GPT 성능 향상 속도 둔화”…오픈AI, ‘오라이온’ 개선 위해 전략 수정

“GPT 성능 향상 속도 둔화”…오픈AI, ‘오라이온’ 개선 위해 전략 수정

  • 기자명 임대준 기자 
  •  
  •  입력 2024.11.10 19:30
  •  
  •  수정 2024.11.10 19:34

01. 165134_179275_4531.jpg

(사진=셔터스톡)
오픈 AI가 내년 초 출시할 차세대 인공지능(AI) 모델 ‘오라이온’의 성능을 끌어 올리기 위해 안간힘을 쓰고 있다는 소식이 전해졌다. 목표는 기존 ‘GPT-4’보다 월등한 성능을 선보이는 것이만, 큰 차이를 내는 것이 어려워지고 있다는 설명이다.

디 인포메이션은 9일(현지시간) “오픈AI가 GPT 모델 개선 속도 둔화에 따라 전략을 변경했다”라고 소개했다. 여기에서 말하는 전략이란 이전처럼 사전 훈련으로 모델 성능을 대폭 끌어올리는 것보다, 사후 강화학습이나 추론 기능 강화에 초점을 맞춘다는 내용이다. 

소식통에 따르면 샘 알트먼 오픈AI CEO는 오라이온이 훈련 과정의 20%만 완료했지만, 지능과 작업 수행 능력은 이미 GPT-4와 동등하다고 말했다. 또 현재는 오라이온의 안전성을 테스트 중으로, 내년 초 출시가 유력한 것으로 알려졌다.

특히 오픈AI는 이번 모델을 기존 GPT 시리즈가 아닌 오라이온으로 명명할 만큼, 다른 차원으로 만드는 것이 목표다. 

그러나 일부 오픈AI 직원은 오라이온의 성능이 이전 모델보다는 우수하지만, GPT-3에서 GPT-4로 넘어가는 과정에 선보인 성능 향상보다 폭이 훨씬 작았다고 말했다.

또 일부 오픈AI 연구원들은 특정 작업에서 이전 모델과 성능이 별 차이가 없다고 전했다. 언어 작업에서는 더 뛰어난 모습을 보였지만, 코딩과 같은 작업에서는 이전 모델보다 성능이 좋지 않을 수 있다는 것이다. 특히 실행 비용이 더 비싸다는 것을 감안하며 사실상 성능 후퇴로 보는 것이 맞다는 입장이다.

이런 문제는 지금까지 대형언어모델(LLM) 개발의 원칙으로 통했던 ‘스케일링 법칙’이 사실상 한계에 달했기 때문이라는 분석이다. 스케일링 법칙은 LLM에 더 많은 학습 데이터를 제공하고 추가 컴퓨팅을 제공하면 성능이 계속 향상될 것이라는 논리다.

이처럼 GPT 모델의 개선 속도가 느려지며 AI 업계에서는 사전 학습보다는 다른 방법을 모델을 개선하는 쪽으로 방향을 전환하고 있으며, 이 가운데 새로운 확장 법칙이 생겨날 가능성이 있다고 전했다.

이에 대해서 마크 저커버그 메타 CEO를 비롯한 일부 관계자들은 “현재 기술이 개선되지 않는 최악의 시나리오를 맞아도 소비자 및 기업용 제품을 만들 여지가 여전히 많이 있을 것”이라고 말했다. 그 대표적인 예가 최근 앤트로픽이 내놓은 ‘컴퓨터 유즈’와 같은 AI 에이전트 기능이다. 에이전트는 분명히 챗GPT 등장만큼 혁신적인 기술이 될 수 있다.

특히 업계에서는 LLM 성장이 한계에 맞았다는 지적이 나오고 있다. 

전설적인 벤처 캐피털리스트 벤 호로비츠는 지난주 한 팟캐스트에 출연해 “AI 훈련에 사용되는 GPU의 수를 계속 늘리고 있지만, 이제는 과거만큼의 지능적인 개선을 전혀 얻지 못하고 있다”라고 지적했다. 동료인 마크 앤드리슨도 “많은 똑똑한 사람들이 한계를 돌파하고 더 높은 수준의 추론 능력에 도달하는 방법을 알아내기 위해 노력하고 있다”라고 말했다.

하지만 저커버그 CEO는 물론 알트먼 CEO와 다른 기술 리더들은 아직 전통적인 확장 법칙이 한계에 도달하지 않았다고 주장한다.

이 때문에 이들은 모델의 사전 훈련에서 최대한 성능을 얻어내기 위해 지금과는 차원이 다른 수십억달러 규모의 투자로 대규모의 데이터센터를 설립하려는 것으로 보고 있다.

물론 투자가 늘어나는 만큼 모델 성능 향상이 뒷받침될지는 의문이다. 비용에 비해 얻을 수 있는 성능 발전이 작다면, 투자 효율성에 의문이 생길 수 밖에 없다.

노암 브라운 오픈AI 연구원이 지난달 TED 컨퍼런스에서 “어느 순간 스케일링 패러다임이 무너질 수 있다”라며 “수천억달러 또는 수조달러의 비용이 드는 모델을 계속 훈련할 것인가”라고 말한 것도 이런 이유에서라는 것이다.

또 사전 훈련에서 얻는 이득이 줄어드는 이유 중 하나로는 고품질 데이터의 공급이 줄어든다는 점이 꼽혔다.

지난 몇 년 동안 LLM은 사전 학습에 웹사이트와 서적, 공개 사용이 가능한 텍스트 등을 사용했지만, 이미 최대한 많은 것을 쥐어 짜냈다는 말이다.

또 데이터 부족의 대안으로 꼽히는 합성 데이터도 한계가 지적됐다. 오라이온은 GPT-4와 최근에 출시된 o1을 포함한 다른 모델이 생성한 합성 데이터로 부분적인 학습을 받은 것으로 알려졌다. 그러나 합성 데이터는 오라이온이 특정 측면에서 이전 모델과 유사해질 수 있는 새로운 문제로 이어지고 있다고 오픈AI 직원은 말했다.

이에 대응해 오픈AI는 사전 학습을 담당했던 닉 라이더가 이끄는 기초 팀을 만들어 학습 데이터 부족 문제를 해결하는 방법과 확장 법칙이 얼마나 오랫동안 적용될지 파악하겠다고 밝혔다.

02 165134_179277_4830.jpg

챗GPT 훈련 과정 (사진=링크드인, Pradeep Menon)
이 때문에 오픈AI는 사전 훈련이 아닌, 다른 방법에 집중하는 것으로 알려졌다. 여기에는 강화 학습과 추론 강화가 주를 이루는 것으로 알려졌다.

오픈AI는 챗GPT부터 인간 피드백을 통한 강화학습(RLHF)으로 유명했다. 최근에는 RLHF를 담당하는 외부 계약직이 1000명에 달하는 것으로 전해졌다. 이를 관리하는 ‘휴먼 데이터 팀’도 운영하고 있다. 

특히 박사급 학위 소지자 등 전문가들이 포함된 것으로 알려졌다. 이들의 검증을 통해 모델 성능의 기준을 높이겠다는 의도로, 이에 따른 비용 증가도 만만치 않은 것으로 알려졌다.

또 o1 모델에 이어 o2를 개발하는 등 추론 성능 향상에도 전념하고 있다. 알트먼 CEO는 최근 “회사의 최우선 순위는 o1과 그 후속 모델의 개발”이라고 밝혔으며, 지난주에는 X(트위터)를 통해 o2의 벤치마크 성능이 비약적으로 좋아졌다는 글을 실수로 올린 바 있다.

즉 추론 성능 향상이 오라이온의 성능을 끌어올릴 핵심으로 보는 것이다. 이 때문에 오라이온은 추론 후속 모델 출시 이후 개발을 마칠 것으로 예측되고 있다.

브라운 연구원도 TED에서 비슷한 내용을 공개한 바 있다. 모델을 변경하지 않고도 사용자 질문에 답하는 동안 모델에 추가 컴퓨팅 리소스와 시간을 제공하면 응답 품질이 계속 향상될 수 있다고 전했다. 이른바 ‘테스트-타임 컴퓨트(Test-Time Compute)’라는 개념이다.

03. 165134_179276_4721.png

테스트-타임 컴퓨트 (사진=오픈AI)
따라서 오픈AI가 사전 훈련으로 성능 향상을 조금이라도 올릴 수 있다면, 결국 추론 강화로 전반적인 모델 성능 향상을 이뤄내는 구조라고 한 관계자가 전했다.

알트먼 CEO도 결국 이런 방식을 염두에 두는 것으로 분석됐다. 지난 10월 데브데이에서는 “나는 추론이 우리가 수년간 기다려온 많은 것을 가능하게 해주기를 바란다”라고 말했다.

특히 게리 탄 와이 컴비네이터 CEO와의 팟캐스트에서는 “우리는 인공일반지능(AGI)을 달성하기 위해 무엇을 해야 할지 알고 있다”라며 “일부는 창의적인 방식으로 현재 모델을 사용하는 것을 포함한다”라고 말했다.

이에 대해 이온 스토이카 데이터브릭스 공동 창립자 겸 회장은 “LLM의 성과가 특정 면에서는 정점에 도달했지만, 다른 면에서는 그렇지 않을 가능성이 있다”라고 말했다.

그는 AI가 코딩이나 복잡하고 여러 단계로 구성된 문제 해결 등의 작업에서 지속적으로 개선되고 있지만, 텍스트의 감정을 분석하거나 의학적 문제의 증상을 설명하는 등 일반적인 능력에서는 진전이 둔화한 것으로 보인다고 설명했다.

“일반 지식 질문에 대해서는, 지금은 LLM의 성과가 정체돼 있다고 주장할 수 있다. 우리에게는 더 많은 고품질 데이터가 필요하며, 합성 데이터는 그다지 도움이 되지 않는다”라고 말했다.

임대준 기자 ydj@aitimes.com

출처 : AI타임스(https://www.aitimes.com)

[출처] https://www.aitimes.com/news/articleView.html?idxno=165134

Loading

7 11월 2024

[인공지능 기술] WebLLM 소개와 구조 분석

[인공지능 기술] WebLLM 소개와 구조 분석

WebLLM 소개와 구조 분석

 
 

2022년 11월 ChatGPT가 초기 베타버전을 출시한 이후 많은 사용자들이 이러한 언어 모델에 관심을 가지고 한동안 폭발적인 반응과 시장의 변화를 가져오면서 관심이 집중되고 있습니다.

한번쯤 사용해 보셨을(혹은 들어 보셨을) LLM과 컴파일, 빌드 과정에 대해 간단히 소개하고 최근 크롬에 정식 탑재된 WebGPU를 사용한 WebLLM의 구조 형태를 가볍게 분석해보고자 합니다.

관련 용어와 개념 소개

일반적인 어플리케이션 위주의 개발을 수행해온 저는 새로운 도메인이자 엔지니어링 영역이기도 한 AI 및 Machine learning에 대해 학습하면서 다양한 용어와 개념들을 새로 학습해야 했습니다. 이와 같은 분들을 위해 WebLLM의 구조에 대해 이야기하기 전에 먼저 용어와 기반 개념들을 소개하고자 합니다.

LLM

https://twitter.com/akshay_pachaar/status/1667147092614336512

대형 언어 모델(Large Language Model)이라고도 불리는 LLM은 ChatGPT 베타 출시 이후로 더욱 유명해진 딥러닝 모델입니다. 기본적인 개념으로는 입력값으로 들어오는 자연어를 기반으로, 통계학적으로 가장 적절한 출력값을 내는 원리로 되어 있습니다. 간단하게 이야기하자면 다음 단어가 나올 확률을 계산하여 그럴듯한 문장을 만들어내는 것이라고 할 수 있습니다.

MLC-LLM 프로젝트

MLC LLM의 세 가지 독립 하위 모듈: https://llm.mlc.ai/docs/get_started/project_overview.html

MLC-LLM 프로젝트는 LLM을 다양한 환경에서 배포하고 범용 API를 통해 쉽게 사용할 수 있도록 돕는 배포 솔루션입니다. 위 이미지와 같은 일련의 과정을 통해 모델을 정의하고 컴파일한 후 각 디바이스 플랫폼별 런타임에서 LLM을 실행할 수 있도록 구성되어 있습니다.

  1. MLC에서 미리 정의해 둔 모델(Llama2 등)을 사용하거나, TVM Unity 인터페이스 기반의 파이썬으로 작성된 모델을 구현해야 합니다.
  2. 후술할 TVM Unity를 통해 컴파일되며, 이 때 model lib, weights, config 결과물이 export됩니다. 우리가 사용하게 될 웹 브라우저의 라이브러리(WebAssembly)는 .wasm의 형태로 떨어지게 됩니다.
  3. 각 디바이스 플랫폼별 런타임에서 컴파일된 모델 라이브러리와 가중치(weights), 설정 등을 로드하여 실행되며, 각 런타임별 API가 제공됩니다.

TVM

TVM의 컴파일러 스택과 런타임: https://www.kc-ml2.com/posts/blog_TVM

이러한 LLM 등의 AI 어플리케이션을 생성하고 하드웨어 장치에서 실행하기 위해서는 우리가 어플리케이션을 만들 때와 동일하게 소스 코드를 변환하여 저수준의 layer에서 인식할 수 있는 코드로 변환하고 실행하는 과정이 필요합니다. 예를 들어 윈도우 환경의 Nvidia 그래픽 연산 카드에서 AI 어플리케이션을 구동해야 할 경우, python으로 설계한 모델 코드는 C++ 및 CUDA 코드로 변환되고 최종적으로 각 하드웨어를 위한 어셈블리 언어로써 변환됩니다.

Apache TVM이라는 end-to-end 오픈소스 컴파일러에서는 이러한 과정(딥러닝 시스템 스택)에 대해 인터페이스를 제공하며 아래에서 살펴볼 WebLLM을 위한 WebAssembly 런타임 또한 제공됩니다.

WebLLM

MLC에서는 TVM에서 제공하는 WebAssembly 런타임 및 자바스크립트 인터페이스를 응용하여 Chat 형식으로 구성된 WebLLM을 배포했습니다. 이를 사용하면 서버와의 통신 없이 오로지 웹 브라우저에서 WebGPU의 가속을 사용하여 LLM을 구동할 수 있습니다.

WebGPU

WebGPU는 WebGL의 후속 버전 API입니다. 이미지 등 그래픽 연산에 집중되던 WebGL과는 다르게 GPU에서 일반적인 계산을 수행하는 데 더 최적화되어 있습니다. 또한 네이티브 API를 직접 미러링하지 않고 자체적인 추상화를 도입하여 웹용 API에 적합하지 않은 개념들(저수준의 메모리 관리 등)을 숨기고 편하게 사용될 수 있도록 설계되었습니다.

다만 현재(2023.10)는 크롬 113 이상(Windows, MacOS, ChromeOS)에서만 지원하고 있습니다: https://caniuse.com/?search=webgpu

WebLLM 환경 구축하기

???? 순서: emscripten 설치 → tvmjs 컴파일 → web-llm 빌드

WebLLM을 로컬에서 빌드하고 패키징하기 위해서는 몇 가지 작업이 필요합니다. WebLLM 빌드에 앞서 의존성 패키지를 살펴보면, tvmjs만 유일하게 패키지로 제공되지 않고 소스 컴파일이 필요합니다.

tvmjs 컴파일을 위해서는 emscripten을 먼저 설치해야 합니다. emscripten은 LLVM을 사용하는 언어(C/C++)를 웹 어셈블리로 컴파일할 수 있도록 제공하는 툴체인이며, TVM의 WebAssembly 런타임을 컴파일하고 시스템 라이브러리 지원을 제공하기 위해 필요합니다.

emscripten SDK 설치 과정: https://emscripten.org/docs/getting_started/downloads.html#installation-instructions-using-the-emsdk-recommended

emscripten 설치가 완료되었다면, WebLLM repo의 스크립트(scripts/prep_deps.sh)를 실행하여 순서대로 tvmjs를 컴파일하고 패키지를 빌드할 수 있습니다.

script/prep_deps.sh
script/prep_deps.sh 실행 결과

WebLLM 구조

WebLLM의 Javascript단 API 구조는 상대적으로 단순하게 구성되어 있습니다. 우리가 흔히 접해왔던 ChatGPT와 같은 형태의 LLM을 서포트하기 위해서 아래와 같이 chat 서비스에 초점이 맞춰진 핵심 모듈들로 구성되어 있습니다.

  • ChatModule: 사용자 단의 메소드를 제공하는 외부 인터페이스를 구현하고 있으며, LLMChatPipeline을 직접 제어하며 WebLLM 초기화프롬프트 전송 등의 추상화된 개념을 구현하고 있습니다.
  • LLMChatPipeline: TVM 런타임 인스턴스의 초기화/실행 등의 직접 제어를 수행하고, Conversation 데이터에 접근하면서 프롬프트 메시지를 제어합니다.
  • Conversation: 메세지와 관련된 데이터의 제어를 수행하며, 각 LLM별로 적합한 Instruction config를 정의하고 있습니다.

이 외에도 WebLLM에서 사용할 설정의 인터페이스를 구현한 Config, WebWorker 형태로 ChatModule을 사용할 수 있도록 구성된 ChatWorkerHandler 등이 존재합니다.

WebLLM의 Javascript단 API를 실행하는 샘플 로직과 내부 Flow는 아래와 같습니다.

Start Example: https://github.com/mlc-ai/web-llm
Example Flow

[출처] https://medium.com/@widoint/webllm-%EC%86%8C%EA%B0%9C%EC%99%80-%EA%B5%AC%EC%A1%B0-%EB%B6%84%EC%84%9D-2cfeac159454

Loading