거대 언어 모델(LLM)은 대규모 데이터 세트를 사용하여 언어를 인식, 요약, 번역, 예측, 생성할 수 있는 트랜스포머 네트워크를 사용하여 구축된 생성형 AI 모델의 한 종류입니다. LLM은 우리가 알고 있는 사회를 변화시킬 수 있는 잠재력을 가지고 있지만, 이러한 기반을 이루는 모델을 학습하는 것은 매우 어렵습니다.
이 블로그에서는 모델 아키텍처, 어텐션 메커니즘, 임베딩 기법, 기초 모델 학습 전략을 아우르는 트랜스포머 네트워크를 사용하여 구축된 LLM의 기본 원리를 설명합니다.
모델 아키텍처
모델 아키텍처는 트랜스포머 네트워크의 백본을 정의하며, 모델의 기능과 한계를 광범위하게 결정합니다. LLM의 아키텍처는 흔히 인코더, 디코더 또는 인코더-디코더 모델이라고 불립니다.
널리 사용되는 아키텍처는 다음과 같습니다:
아키텍처 | 설명 | 적합한 대상 |
트랜스포머를 통한 양방향 인코더 표현(BERT) | 인코더 전용 아키텍처로 언어를 이해할 수 있는 작업에 가장 적합합니다. | 분류 및 감정 분석 |
사전 학습된 생성형 트랜스포머(GPT) | 생성 작업에 적합하고 판별 작업에 라벨이 지정된 데이터로 미세 조정된 디코더 전용 아키텍처입니다. 단방향 아키텍처를 고려할 때 컨텍스트는 앞으로만 흐릅니다. GPT 프레임워크는 생성적 사전 학습과 판별적 미세 조정을 통해 단일 작업에 구애받지 않는 모델을 사용하여 강력한 자연어 이해를 달성할 수 있도록 지원합니다. | 텍스트 연관성, 문장 유사성, 질문 답변. |
텍스트-텍스트 변환기(시퀀스-시퀀스 모델) | 인코더-디코더 아키텍처. 전이 학습 접근 방식을 활용하여 모든 텍스트 기반 언어 문제를 텍스트 대 텍스트 형식으로 변환합니다. 즉, 텍스트를 입력으로 받아 다음 텍스트를 출력으로 생성하는 방식입니다. 양방향 아키텍처를 사용하면 컨텍스트가 양방향으로 흐릅니다. | 번역, 질문 및 답변, 요약 |
전문가 혼합(MoE) | 모든 아키텍처에 적용할 수 있는 모델 아키텍처 결정. 최소한의 계산 오버헤드를 추가하면서 모델 용량을 크게 확장하고 고밀도 모델을 스파스 모델로 변환하도록 설계되었습니다. MoE 계층은 여러 전문가 모델과 스파스 게이팅 기능으로 구성됩니다. 게이트는 추론 중에 각 입력을 상위 K(K>=2 또는 K=1)의 최고 전문가에게 라우팅합니다. | 짧은 지연 시간으로 추론 중 계산 효율성을 위해 작업 전반에서 잘 일반화합니다. |
또 다른 인기 있는 아키텍처 결정은 텍스트, 이미지, 오디오, 비디오와 같은 여러 양식 또는 데이터 형식의 정보를 결합하는 멀티모달 모델로 확장하는 것입니다. 멀티모달 모델은 학습하기는 어렵지만, 인간이 여러 감각의 데이터를 분석하여 이해하는 것처럼 서로 다른 모달리티의 정보를 상호 보완하는 주요 이점을 제공합니다.
이러한 모델에는 이미지용 CNN과 텍스트용 트랜스포머와 같이 각 모달리티에 대해 별도의 인코더가 포함되어 각 입력 데이터에서 높은 수준의 특징 표현을 추출합니다. 여러 모달리티에서 추출한 특징을 조합하는 것은 어려울 수 있습니다. 각 모달리티에서 추출한 특징을 융합하거나 어텐션 메커니즘을 사용하여 작업에 대한 각 모달리티의 기여도를 평가함으로써 이 문제를 해결할 수 있습니다.
공동 표현(joint representation)은 모달리티 간의 상호 작용을 포착합니다. 모델 아키텍처에는 분류, 캡션 생성, 번역, 프롬프트 텍스트에 따른 이미지 생성, 프롬프트 텍스트에 따른 이미지 편집 등과 같은 작업별 출력을 생성하기 위한 추가 디코더가 포함될 수 있습니다.
트랜스포머 네트워크 살펴보기
트랜스포머 네트워크의 영역에서 토큰화 프로세스는 텍스트를 토큰이라는 작은 단위로 조각화하는 데 중추적인 역할을 합니다.
토큰나이저(Tokenizers)
토큰화는 모델 구축의 첫 번째 단계로, 텍스트를 LLM의 기본 구성 요소가 되는 토큰이라는 작은 단위로 분할하는 작업을 포함합니다. 이렇게 추출된 토큰은 토큰을 숫자 ID에 매핑하는 어휘 인덱스를 구축하는 데 사용되어 딥 러닝 연산에 적합한 텍스트를 숫자로 표현합니다. 인코딩 과정에서 이러한 숫자 토큰은 각 토큰의 의미를 나타내는 벡터로 인코딩됩니다. 디코딩 과정에서 LLM이 생성을 수행할 때 토큰나이저는 숫자 벡터를 다시 판독 가능한 텍스트 시퀀스로 디코딩합니다.
이 프로세스는 소문자 처리, 구두점 및 공백 잘라내기, 어간 처리, 철자 처리, 축약 처리, 악센트 제거를 위한 정규화부터 시작됩니다. 텍스트가 정리되면 다음 단계는 단어와 문장의 경계를 인식하여 텍스트를 분할하는 것입니다. 경계에 따라 토큰화기는 단어, 하위 단어 또는 문자 수준에서 세분화될 수 있습니다.
단어 및 문자 기반 토큰나이저가 널리 사용되고 있지만, 여기에는 몇 가지 문제가 있습니다. 단어 기반 토큰나이저는 어휘 크기가 크고 토큰나이저 학습 과정에서 보이지 않는 단어로 인해 어휘를 벗어난 토큰이 많이 생성됩니다. 문자 기반 토큰나이저는 긴 시퀀스와 의미 있는 개별 토큰을 생성하지 못합니다.
이러한 단점 때문에 서브워드 기반 토큰화 기법이 인기를 얻고 있습니다. 서브워드 토큰화 알고리즘의 초점은 일반적인 문자 n-그램과 패턴을 기반으로 희귀한 단어를 더 작고 의미 있는 서브워드로 분할하는 것입니다. 이 기술을 사용하면 잘 알려지지 않은 희귀 단어를 알려진 하위 단어를 통해 표현할 수 있으므로 어휘 크기가 줄어듭니다. 또한 추론 과정에서 어휘집에 없는 단어를 효과적으로 처리하여 어휘 크기를 줄이면서도 추론 과정에서 어휘집에 없는 단어를 부드럽게 처리합니다.
널리 사용되는 하위 단어 토큰화 알고리즘으로는 바이트 쌍 인코딩(Byte Pair Encoding/BPE), 워드피스(WordPiece), 유니그램(Unigram), 센텐스피스(SentencePiece) 등이 있습니다.
- BPE는 문자 어휘로 시작하여 자주 인접하는 문자 쌍을 새로운 어휘 용어로 반복적으로 병합하여 가장 일반적인 단어를 단일 토큰으로 대체함으로써 디코딩 시 더 빠른 추론으로 텍스트 압축을 달성합니다.
- 워드피스(WordPiece)는 병합 연산을 수행한다는 점에서 BPE와 유사하지만, 언어의 확률적 특성을 활용하여 문자를 병합함으로써 학습 데이터의 가능성을 극대화합니다.
- 유니그램(Unigram)은 큰 어휘로 시작하여 토큰의 확률을 계산하고 원하는 어휘 크기에 도달할 때까지 손실 함수에 따라 토큰을 제거합니다.
- 센텐스피스(SentencePiece)는 언어 모델링 목표에 따라 원시 텍스트에서 하위 단어 단위를 학습하고 유니그램 또는 BPE 토큰화 알고리즘을 사용하여 어휘를 구성합니다.
어텐션 메커니즘(Attention Mechanisms)
순환 신경망(RNN)과 같은 기존의 시퀀스-2 시퀀스 인코더-디코더 언어 모델은 입력 시퀀스의 길이에 따라 잘 확장되지 않기 때문에 어텐션이라는 개념이 도입되었으며, 이는 매우 중요한 것으로 입증되었습니다. 어텐션 메커니즘을 통해 디코더는 인코딩된 입력 시퀀스에 가중치를 부여하여 가장 관련성이 높은 토큰에 가장 높은 가중치를 할당하여 입력 시퀀스에서 가장 관련성이 높은 부분을 사용할 수 있습니다. 이 개념은 중요도에 따라 토큰을 신중하게 선택함으로써 입력 시퀀스 길이의 스케일링을 개선합니다.
이 아이디어는 2017년 트랜스포머 모델 아키텍처와 함께 도입된 셀프 어텐션 메커니즘으로 더욱 발전하여 RNN이 필요하지 않게 되었습니다. 셀프 어텐션 메커니즘은 동일한 시퀀스에서 서로 다른 단어 간의 관계에 따라 입력 시퀀스의 표현을 생성합니다. 입력 컨텍스트를 포함함으로써 임베딩된 입력의 정보 내용을 향상시키는 셀프 어텐션 메커니즘은 트랜스포머 아키텍처에서 중요한 역할을 합니다.
셀프 어텐션은 컨텍스트 인식 입력 표현을 달성하는 방식 때문에 스케일드 도트 프로덕트 어텐션(scaled-dot product attention)이라고 불립니다. 입력 시퀀스의 각 토큰은 각각의 가중치 매트릭스를 사용하여 쿼리(Q), 키(K), 값(V) 시퀀스에 자신을 투영하는 데 사용됩니다. 목표는 다른 모든 입력 토큰을 컨텍스트로 하여 각 입력 토큰의 관심도 가중치 버전을 계산하는 것입니다. 셀프 어텐션 메커니즘은 V 행렬에 의해 결정된 관련 쌍이 더 높은 가중치를 갖는 Q 및 K 행렬의 내적값을 계산하여 시퀀스의 다른 토큰인 모든 키-값 쌍이 주어질 때 각 입력 토큰(Q)에 적합한 벡터를 찾습니다.
셀프 어텐션는 멀티 헤드 어텐션로 더욱 발전했습니다. 앞서 설명한 세 개의 행렬(Q, K, V)은 단일 헤드라고 볼 수 있습니다. 다중 헤드 셀프 어텐션은 이러한 헤드를 여러 개 사용하는 경우입니다. 이러한 헤드는 CNN의 여러 커널처럼 작동하여 시퀀스의 여러 부분에 주의를 기울이며 단기 종속성보다 장기 종속성에 중점을 둡니다.
마지막으로, 셀프 어텐션의 경우처럼 단일 입력 시퀀스 대신 두 개의 서로 다른 입력 시퀀스를 포함하는 교차 어텐션이라는 개념이 등장했습니다. 트랜스포머 모델 아키텍처에서는 인코더의 입력 시퀀스와 디코더에서 처리하는 입력 시퀀스가 있습니다.
플래시 어텐션(FlashAttention)
크기가 큰 트랜스포머 모델은 메모리 제약에 의해 제한적인 시퀀스 길이를 갖게 되며, 메모리 사용량은 시퀀스 길이의 제곱에 비례합니다. 플래시 어텐션은 어텐션 레이어 연산 속도를 높이고 메모리 사용량을 줄이기 위해 느린 GPU 고대역폭 메모리(HBM)에서 반복되는 읽기 및 쓰기로 인해 병목 현상이 발생하는 네이티브 구현을 최적화합니다.
플래시 어텐션은 고전적인 타일링 방식을 사용하여 쿼리, 키, 값 블록을 GPU HBM(메인 메모리)에서 SRAM(고속 캐시)으로 로드하여 어텐션 계산을 수행한 다음 출력을 다시 HBM에 씁니다. 또한 포워드 패스에서 대용량 어텐션 행렬을 저장하지 않고 백그라운드에서 어텐션 행렬을 다시 계산하는 방식으로 메모리 사용량을 개선합니다. 이러한 최적화를 통해 플래시어텐션은 긴 시퀀스에 대해 상당한 속도 향상(2~4배)을 제공합니다.
더욱 개선된 플래시어텐션-2는 시퀀스 병렬 처리, 작업 파티셔닝 개선, 비매트릭스 FLOP 감소 등 추가적인 최적화를 통해 플래시어텐션보다 2배 더 빠릅니다. 이 최신 버전은 멀티 쿼리 어텐션과 다음에 설명하는 그룹 쿼리 어텐션도 지원합니다.
멀티 쿼리 어텐션(MQA)
여러 쿼리 헤드가 동일한 키 및 값 투영 헤드에 관심을 기울이는 관심의 변형입니다. 이렇게 하면 KV 캐시 크기가 줄어들어 디코딩시 필요한 메모리 대역폭이 줄어듭니다. 결과 모델은 기본 다중 헤드 어텐션 아키텍처보다 품질 저하가 적으면서 추론 중에 더 빠른 자동 회귀 디코딩을 지원합니다.
그룹 쿼리 어텐션(GQA)
그룹 쿼리 어텐션(GQA)는 추론 시 속도 향상은 유지하면서 품질 저하 문제를 극복하기 위해 MQA를 개선한 것입니다. 또한 멀티 헤드 어텐션을 사용하여 학습된 모델을 처음부터 다시 학습할 필요가 없습니다. 원래 학습 컴퓨팅의 5%만 사용하여 기존 모델 체크포인트를 업트레이닝함으로써 추론 중에 GQA를 사용할 수 있습니다. 또한, 이는 중간(하나 이상, 쿼리 헤드 수보다 적은) 수의 키-값 헤드를 사용하는 MQA의 일반화입니다. GQA는 MQA와 비슷한 속도로 기준 다중 헤드 어텐션에 가까운 품질을 달성합니다.
임베딩 기술
문장에서 단어가 나타나는 순서는 중요합니다. 이 정보는 2D 위치 인코딩 행렬에 각 입력 토큰의 발생 순서를 할당하는 위치 인코딩을 사용하여 LLM에 인코딩됩니다. 행렬의 각 행은 위치 정보와 합산된 시퀀스의 인코딩된 토큰을 나타냅니다. 이를 통해 모델은 문장에서 의미는 비슷하지만 위치가 다른 단어들을 구별할 수 있으며, 단어의 상대적 위치를 인코딩할 수 있습니다.
기존 트랜스포머 아키텍처는 절대 위치 인코딩과 사인 곡선 함수를 사용한 단어 임베딩을 결합합니다. 하지만 이 접근 방식은 학습 시보다 추론 시 더 긴 시퀀스로의 외삽을 허용하지 않습니다. 상대적 위치 인코딩은 이 문제를 해결했습니다. 이 방식에서는 쿼리와 키 벡터에 대한 콘텐츠 표현이 특정 거리 이상으로 잘린 쿼리와 키 사이의 거리를 기준으로 학습 가능한 위치 표현과 결합됩니다.
RoPE
로터리 위치 임베딩(RoPE)은 절대 위치 임베딩과 상대 위치 임베딩의 개념을 결합한 것입니다. 절대 위치는 회전 매트릭스를 사용하여 인코딩됩니다. 상대적 위치 종속성은 셀프 어텐션 공식에 통합되어 문맥 표현에 곱셈 방식으로 추가됩니다. 이 기술은 트랜스포머의 정현파 위치 임베딩에 도입된 시퀀스 길이 유연성의 이점을 유지하면서 선형 셀프 어텐션에 상대적 위치 인코딩을 추가합니다. 또한 상대적 거리가 증가함에 따라 토큰 간 의존성이 감소하여 추론 시점에 더 긴 시퀀스로 추정할 수 있습니다.
AliBi
트랜스포머 기반 LLM은 컨텍스트 토큰 수를 제한하는 셀프 어텐션의 이차 비용으로 인해 더 긴 시퀀스로 잘 확장되지 않습니다. 또한 원래 트랜스포머 아키텍처에 도입된 사인 곡선 위치 방법은 학습 중에 본 것보다 긴 시퀀스에는 추정하지 못합니다. 이로 인해 LLM을 적용할 수 있는 실제 사용 사례가 제한됩니다. 이를 극복하기 위해 선형 편향에 의한 어텐션(Attention with Linear Biases/ALiBi)이 도입되었습니다. 이 기법은 단어 임베딩에 위치 임베딩을 추가하지 않고, 대신 쿼리 키 관심도 점수에 거리에 비례하는 페널티를 적용하여 편향성을 부여합니다.
학습 시보다 훨씬 긴 시퀀스에 대한 효율적인 추정을 용이하게 하기 위해 ALiBi는 관련 키와 쿼리 사이의 거리에 비례하여 선형적으로 감소하는 페널티를 적용하여 어텐션도 점수를 음으로 편향시킵니다. 이 방법은 정현파(sinusoidal) 모델에 비해 런타임이나 파라미터를 추가할 필요가 없으며 메모리 증가도 무시할 수 있을 정도로 미미합니다(0~0.7%). 정현파 임베딩에 비해 ALiBi가 우위에 있는 이유는 초기 토큰 저주 회피 능력이 향상되었기 때문입니다. 이 방법은 또한 더 긴 컨텍스트 히스토리를 보다 효율적으로 활용함으로써 추가적인 이점을 얻을 수 있습니다.
트랜스포머 네트워크 학습
LLM을 학습하는 동안 효율성을 개선하고 기본 하드웨어 구성의 리소스 사용을 최적화하는 몇 가지 기술이 있습니다. 수십억 개의 파라미터와 수조 개의 토큰으로 거대 AI 모델을 확장하려면 엄청난 메모리 용량이 필요합니다.
이러한 요구 사항을 완화하기 위해 모델 병렬 처리 및 활성화 재계산과 같은 몇 가지 방법이 널리 사용됩니다. 모델 병렬 처리는 모델 파라미터와 옵티마이저 상태를 여러 GPU에 분할하여 각 GPU가 모델 파라미터의 하위 집합을 저장하도록 합니다. 이는 다시 텐서 병렬 처리와 파이프라인 병렬 처리로 분류됩니다.
- 텐서 병렬 처리는 행렬-행렬 곱셈과 같은 연산 내에서 계산을 병렬화하는 데 중점을 둔 인트라 레이어 병렬 처리라고도 하는 연산을 여러 GPU에 걸쳐 분할합니다. 이 기술은 결과가 올바른지 확인하기 위해 추가적인 통신이 필요합니다.
- 파이프라인 병렬 처리는 모델 레이어를 여러 GPU로 분할하는 것으로, 레이어 간 병렬 처리라고도 하며 모델을 레이어별 덩어리로 분할하는 데 중점을 둡니다. 각 디바이스는 해당 덩어리에 대해 계산하고 중간 활성화를 다음 단계로 전달합니다. 이로 인해 일부 디바이스는 계산에 참여하고 다른 디바이스는 대기하는 버블 타임이 발생하여 계산 리소스가 낭비될 수 있습니다.
- 시퀀스 병렬 처리는 이전에 병렬 처리되지 않았고 시퀀스 차원을 따라 독립적인 트랜스포머 레이어의 영역을 파악하여 텐서 수준 모델 병렬 처리를 확장합니다. 이러한 레이어를 시퀀스 차원을 따라 분할하면 텐서 병렬 장치 전체에 걸쳐 이러한 영역에 대한 활성화 메모리뿐만 아니라 컴퓨팅을 분산할 수 있습니다. 활성화가 분산되고 메모리 사용 공간이 작아지므로 백워드 패스를 위해 더 많은 활성화를 저장할 수 있습니다.
- 선택적 활성화 재계산은 시퀀스 병렬 처리와 함께 사용됩니다. 이는 메모리 제약으로 인해 활성화마다 재계산에 필요한 연산 횟수가 다르다는 점을 파악하여 전체가 아닌 일부만 재계산해야 하는 경우를 개선합니다. 전체 트랜스포머 레이어를 체크포인트하고 재계산하는 대신 메모리를 많이 차지하지만 재계산하는 데 계산 비용이 많이 들지 않는 각 트랜스포머 레이어의 일부만 체크포인트하고 재계산할 수 있습니다.
모든 기술은 통신 또는 계산 오버헤드를 추가합니다. 따라서 최대 성능을 달성하는 구성을 찾은 다음 데이터 병렬 처리로 학습을 확장하는 것은 효율적인 LLM 학습을 위해 필수적입니다.
데이터 병렬 학습에서는 데이터 세트가 여러 개의 샤드로 분할되고 각 샤드가 장치에 할당됩니다. 이는 배치 차원을 따라 학습 프로세스를 병렬화하는 것과 같습니다. 각 디바이스는 모델 복제본의 전체 사본을 보유하고 할당된 데이터 세트 샤드에 대해 학습합니다. 역전파 후에는 모델의 기울기가 모두 감소되어 여러 디바이스의 모델 파라미터가 동기화 상태를 유지할 수 있습니다.
이를 완전 샤딩 데이터 병렬 처리(fully sharded data parallelism/FSDP) 기법이라고 합니다. 이 기법은 모델 파라미터와 학습 데이터를 데이터 병렬 워커 간에 균일하게 샤딩하며, 각 마이크로 배치 데이터에 대한 계산은 각 GPU 워커에 로컬로 이루어집니다.
FSDP는 하드웨어 이질성을 처리하기 위해 클러스터의 물리적 상호 연결 토폴로지에 맞게 사용자 정의할 수 있는 구성 가능한 샤딩 전략을 제공합니다. 또한 연산 재정렬 및 매개변수 프리페칭을 통해 통신과 연산이 적극적으로 중복되는 버블을 최소화할 수 있습니다. 마지막으로, FSDP는 인플라이트 언샤드 파라미터에 할당되는 블록 수를 제한하여 메모리 사용량을 최적화합니다. 이러한 최적화를 통해 FSDP는 TFLOPS 측면에서 거의 선형에 가까운 확장성으로 훨씬 더 큰 규모의 모델을 지원합니다.
양자화 인식 학습
양자화란 딥러닝 모델이 전체 정밀도(부동 소수점) 값에 비해 계산의 전부 또는 일부를 축소된 정밀도로 수행하는 프로세스입니다. 이 기술을 사용하면 정확도 손실을 최소화하면서 딥러닝 모델을 사용하여 추론 속도를 높이고, 메모리를 절약하며, 비용을 절감할 수 있습니다.
양자화 인식 학습(QAT)은 학습 과정에서 양자화의 영향을 고려하는 방식입니다. 모델은 학습 과정에서 양자화 프로세스를 모방하는 양자화 인식 연산으로 학습됩니다. 모델은 양자화된 표현을 잘 수행하는 방법을 학습하여 학습 후 양자화에 비해 정확도가 향상됩니다. 포워드 패스는 가중치와 활성화를 저정밀 표현으로 정량화합니다. 백워드 패스는 고정밀 가중치와 활성화를 사용하여 기울기를 계산합니다. 이를 통해 모델은 포워드 패스에서 발생한 양자화 오류에 강한 파라미터를 학습할 수 있습니다. 그 결과 정확도에 미치는 영향을 최소화하면서 학습 후 양자화할 수 있는 학습된 모델을 얻을 수 있습니다.
지금 바로 LLM 학습하기
이 게시물에서는 다양한 모델 학습 기법과 그 사용 시기를 다루었습니다. LLM 기법 마스터하기: 커스터마이징에 대한 포스팅을 확인하여 LLM 워크플로우에 대한 학습 여정을 계속 이어가세요.
대부분의 학습 방법은 3D 병렬 처리 기법으로 학습할 수 있는 가속화된 워크플로우를 제공하는 NVIDIA NeMo에서 지원됩니다. 또한 여러 가지 커스터마이징 기법을 선택할 수 있습니다. 멀티 GPU 및 멀티 노드 구성을 통해 언어 및 이미지 워크로드를 위한 거대 모델의 대규모 추론에 최적화되어 있습니다. 지금 NeMo 프레임워크를 다운로드하고 원하는 온프레미스 및 클라우드 플랫폼에서 LLM을 학습하세요.
관련 리소스
- GTC 세션: 콘텐츠 생성을 위한 거대 언어 모델 활용하기
- GTC 세션: 법률 전문가와 사내 법무 부서를 지원하기 위한 AI의 활용
- GTC 세션: AWS에서 PyTorch를 사용한 LLM 교육 및 프로덕션화(아마존 웹 서비스 제공)
- 웨비나: 거대 언어 모델 구현하기
- 웨비나: NVIDIA 이머징 챕터 교육 시리즈 – Jetson AI 기초
- 웨비나: NVIDIA Inception: 이점 극대화