로프 및 알리바이로 성능 향상을 보여주는 사례 연구 또는 참조
로터리 위치 임베딩 (로프) :
- 사례 연구 1 : 논문“Roformer : Transformer 모델을위한 로터리 위치 임베딩”에서 저자는 언어 모델링과 같은 장기 시퀀스 작업에서 로프가 크게 향상되었음을 보여주었습니다. 추가 계산 자원이 필요하지 않고 긴 시퀀스에 걸쳐 더 나은 로프를 일반화 할 수있는 능력은 전통적인 임베딩보다 더 효율적인 선택이되었습니다.
- 성능 게인 : 로프는 기존 위치 인코딩을 사용하는 모델에 비해 512 개의 토큰보다 긴 시퀀스에서 최대 4-6% 더 나은 정확도를 제공했습니다.
알리바이 (선형 바이어스와의주의) :
- 사례 연구 2 : "ALIBI : 효율적인 장거리 시퀀스 모델링을위한 선형 바이어스를 사용한주의"에서주의 메커니즘에 선형 바이어스의 도입은 모델이 위치 인코딩에 의존하지 않고 시퀀스를 효율적으로 처리 할 수있게했습니다. Alibi는 메모리 오버 헤드를 줄이고 기계 번역 및 요약과 같은 작업에 대한 모델의 확장 성을 향상 시켰습니다.
- 성능 이득 : Alibi는 장기 시퀀스 벤치 마크에서 모델 성능을 유지하거나 개선하면서 최대 8% 더 빠른 교육 시간과 메모리 사용량 감소를 보여주었습니다.
이러한 발전은 로프 및 알리바이와 같은 현대 위치 임베딩 기술이 전통적인 방법의 한계를 해결할뿐만 아니라 특히 긴 입력을 다룰 때 큰 언어 모델의 확장 성과 효율성을 향상시키는 방법을 보여줍니다.
낮은 정밀도의 힘을 활용합니다
LLM은 무게를 나타내는 광대 한 매트릭스와 벡터로 구성됩니다. 이러한 가중치는 일반적으로 float32, bfloat16 또는 float16 정밀도에 저장됩니다. 메모리 요구 사항은 다음과 같이 추정 할 수 있습니다.
- float32 정밀도 : 메모리 필수 = 4 * x gb, 여기서 x는 모델 매개 변수 수 (수십억)입니다.
- bfloat16/float16 정밀도 : 메모리 필수 = 2 * x gb.
Bfloat16 정밀도의 메모리 사용의 예 :
- GPT-3 : 175 억 파라미터, ~ 350GB VRAM.
- 블룸 : 1760 억 파라미터, ~ 352 GB VRAM.
- LLAMA-2-70B : 70 억 파라미터, ~ 140GB VRAM.
- FALCON-40B : 400 억 파라미터, ~ 80GB VRAM.
- MPT-30B : 300 억 파라미터, ~ 60GB VRAM.
- 스타 코더 : 155 억 파라미터, ~ 31GB VRAM.
NVIDIA A100 GPU가 최대 80GB VRAM을 갖는 것을 고려할 때, 대형 모델에는 효율적으로 작동하려면 더 큰 모델에는 텐서 병렬 처리 또는 파이프 라인 병렬 처리가 필요합니다.
실용적인 예
8 x 80GB A100 노드에 블룸을로드 :
! PIP 설치 변압기는 Bitsandbytes 최적의 가속을 가속화합니다
# Transformers에서 automodelforcausallm을 가져옵니다
# model = automodelforcausallm.from_pretrained ( "bigscience/bloom", device_map = "auto")
Transformers에서 Automodelforcausallm, Autotokenizer, 파이프 라인을 가져옵니다
토치 수입
model = automodelforcausallm.from_pretrained ( "bigcode/octocoder", torch_dtype = torch.bfloat16, device_map = "auto", pad_token_id = 0)
Tokenizer = Autotokenizer.from_pretraind ( "BigCode/Octocoder")
파이프 = 파이프 라인 ( "텍스트 생성", Model = Model, Tokenizer = Tokenizer)
Prompt = "질문 : 바이트를 Giga 바이트로 변환하는 파이썬에 함수를 작성하십시오. \ n \ nanswer :"
결과 = 파이프 (프롬프트, max_new_tokens = 60) [0] [ "generated_text"] [len (프롬프트) :]
결과
def bytes_to_giga_bytes (bytes) :
바이트 반환 / 1024 / 1024 / 1024
bytes_to_giga_bytes (torch.cuda.max_memory_allocated ())
model.to ( "CPU")
델 파이프
델 모델
GC 가져 오기
토치 수입
def flush () :
gc.collect ()
Torch.cuda.empty_cache ()
Torch.cuda.reset_peak_memory_stats ()
플러시()
여기서는 자세히 논의하지 않을 다양한 양자화 기술이 있지만 일반적으로 모든 양자화 기술은 다음과 같이 작동합니다.
- 모든 가중치를 대상 정밀도로 정량화합니다.
- 양자화 된 가중치를로드하고 Bfloat16 정밀도에서 벡터의 입력 순서를 전달하십시오.
- Bfloat16 정밀도에서 입력 벡터와 계산을 수행하기 위해 BFLOAT16으로 가중치를 동적으로 해제합니다.
- 입력을 계산 한 후 가중치를 대상 정밀도로 다시 정량화하십시오.
간단히 말해서, 이것은 the-weight matrixmultiplications, theinputs를 사용하여 출력을 겪고있는 가중치 매트릭스를 we다는 것을 의미합니다.
y = x * w는 모든 행렬 곱셈에 대해 y = x * dequantize (w); Quantize (w)로 변경됩니다. 입력이 네트워크 그래프를 통해 실행될 때 모든 가중치 행렬에 대해 정문화 및 재건이 순차적으로 수행됩니다.
#! PIP 설치 BitsAndBytes
model = automodelforcausallm.from_pretraind ( "bigcode/octocoder", load_in_8bit = true, low_cpu_mem_usage = true, pad_token_id = 0)
파이프 = 파이프 라인 ( "텍스트 생성", Model = Model, Tokenizer = Tokenizer)
결과 = 파이프 (프롬프트, max_new_tokens = 60) [0] [ "generated_text"] [len (프롬프트) :]
결과
bytes_to_giga_bytes (torch.cuda.max_memory_allocated ())
model.cpu ()
델 모델
델 파이프
플러시()
model = automodelforcausallm.from_pretrained ( "bigcode/octocoder", load_in_4bit = true, low_cpu_mem_usage = true, pad_token_id = 0)
파이프 = 파이프 라인 ( "텍스트 생성", Model = Model, Tokenizer = Tokenizer)
결과 = 파이프 (프롬프트, max_new_tokens = 60) [0] [ "generated_text"] [len (프롬프트) :]
결과
bytes_to_giga_bytes (torch.cuda.max_memory_allocated ())
model.cpu ()
델 모델
델 파이프
model.cpu ()
델 모델
델 파이프
플러시()
model = automodelforcausallm.from_pretrained ( "bigcode/octocoder", load_in_4bit = true, low_cpu_mem_usage = true, pad_token_id = 0)
파이프 = 파이프 라인 ( "텍스트 생성", Model = Model, Tokenizer = Tokenizer)
결과 = 파이프 (프롬프트, max_new_tokens = 60) [0] [ "generated_text"] [len (프롬프트) :]
결과
bytes_to_giga_bytes (torch.cuda.max_memory_allocated ())
model.cpu ()
델 모델
델 파이프
플러시()
플래시주의 메커니즘
플래시주의는 메모리 효율을 향상시키고 더 나은 GPU 메모리 활용을 활용하여주의 메커니즘을 최적화합니다. 이 접근법은 다음을 허용합니다.
- 메모리 풋 프린트 감소 : 주의 계산을보다 효율적으로 처리하여 메모리 오버 헤드를 크게 최소화합니다.
- 성능 향상 : 추론 중 속도가 크게 향상됩니다.
System_prompt = "" ""아래는 다양한 사람들과 AI 기술 보조원 간의 일련의 대화입니다.
조수는 도움이되고, 예의 바르고, 정직하고, 정교하고, 정서적으로 인식하고, 겸손하지만 지식이 풍부하기 위해 노력합니다.
어시스턴트는 코드 질문을 기꺼이 도와 드리며 필요한 것을 정확하게 이해하기 위해 최선을 다할 것입니다.
또한 허위 또는 오해의 소지가있는 정보를주지 않으려 고 노력하며 정답에 대해 전적으로 확실하지 않은 경우 경고가 있습니다.
즉, 조수는 실용적이며 실제로는 최선을 다하고 있으며, 경고가 너무 유용한 방식으로 너무 많이 얻지 못하게합니다.
스타 코더 모델은 스택 (v1.2) (옵트 아웃 요청 제외)에서 80 개의 프로그래밍 언어로 훈련 된 일련의 15.5b 매개 변수 모델입니다.
이 모델은 멀티 쿼리주의를 사용하고, 중간에 채우는 목표를 사용하여 교육을 받았으며, 8,192 개의 토큰 컨텍스트 창이 포함되어 있습니다.
-----
질문 : 두 목록을 가져 와서 각 입력 목록의 교대 요소가있는 목록을 반환하는 함수를 작성하십시오.
답 : 물론. 다음은 기능이 있습니다.
DEF 교대 (List1, List2) :
결과 = []
IN RANGE (LEN (LEN (LIST1))의 경우 :
결과.
결과.
반환 결과
질문 :이 기능에 대한 테스트 사례를 쓸 수 있습니까?
답변 : 물론, 몇 가지 테스트가 있습니다.
교대 ([10, 20, 30], [1, 2, 3]) == [10, 1, 20, 2, 30, 3]
교대 ([true, false], [4, 5]) == [true, 4, false, 5]
교대 ([], []) == []를 주장합니다.
질문 : 목록의 길이가 고르지 않을 때 모든 입력 요소를 반환하도록 함수를 수정하십시오. 더 긴 목록의 요소는 끝에 있어야합니다.
답변 : 수정 된 기능은 다음과 같습니다.
DEF 교대 (List1, List2) :
결과 = []
IN RANGE (min (len (len), len (list2)))의 경우 :
결과.
결과.
LEN (LEST1)> LEN (LIST2) 인 경우 :
results.extend (list1 [i 1 :])
또 다른:
results.extend (list2 [i 1 :])
반환 결과
-----
"" "
long_prompt = 10 * System_Prompt 프롬프트
model = automodelforcausallm.from_pretrained ( "bigcode/octocoder", torch_dtype = torch.bfloat16, device_map = "auto")
Tokenizer = Autotokenizer.from_pretraind ( "BigCode/Octocoder")
파이프 = 파이프 라인 ( "텍스트 생성", Model = Model, Tokenizer = Tokenizer)
수입 시간
start_time = time.time ()
결과 = 파이프 (long_prompt, max_new_tokens = 60) [0] [ "generated_text"] [len (long_prompt) :]
print (f "{time.time () - start_time} 초에 생성되었습니다.")
결과
bytes_to_giga_bytes (torch.cuda.max_memory_allocated ())
산출:

플러시()
model = model.to_bettertransformer ()
start_time = time.time ()
결과 = 파이프 (long_prompt, max_new_tokens = 60) [0] [ "generated_text"] [len (long_prompt) :]
print (f "{time.time () - start_time} 초에 생성되었습니다.")
결과
bytes_to_giga_bytes (torch.cuda.max_memory_allocated ())
플러시()
산출:

LLM 아키텍처의 과학
지금까지 우리는 다음을 포함하여 계산 및 메모리 효율성을 향상시키기위한 전략을 탐색했습니다.
- 더 낮은 정밀 형식으로 무게를 주조합니다.
- 보다 효율적인 자체 변환 알고리즘을 구현합니다.
이제 우리는 LLM (Langer Models)의 아키텍처를 수정하여 다음과 같은 긴 텍스트 입력이 필요한 작업에 최적화하는 방법에주의를 기울입니다.
- 검색된 질문 응답,
- 요약,
- 채팅 응용 프로그램.
특히 채팅 상호 작용은 LLM이 긴 텍스트 입력을 처리 할뿐만 아니라 Chatgpt가 수행하는 것과 유사하게 사용자와 모델 간의 동적, 앞뒤 대화를 효율적으로 처리해야합니다.
LLM 사후 훈련의 기본 아키텍처를 수정하는 것은 어려운 일이므로, 잘 고려 된 설계 결정을 선행으로 만드는 것이 필수적입니다. LLM 아키텍처의 두 가지 기본 구성 요소는 종종 큰 입력 시퀀스에 대한 성능 병목 현상이됩니다.
이 구성 요소를 더 깊이 파고합시다.
LLM의 위치 임베딩 개선
자체 변환 메커니즘은 각 토큰을 텍스트 시퀀스 내에서 다른 토큰과 관련시킵니다. 예를 들어, 입력 순서 "Hello", "I", "Love", "You"에 대한 SoftMax (QKT) 행렬은 다음과 같이 나타날 수 있습니다.
|
안녕하세요 |
나 |
사랑 |
너 |
안녕하세요 |
0.2 |
0.4 |
0.3 |
0.1 |
나 |
0.1 |
0.5 |
0.2 |
0.2 |
사랑 |
0.05 |
0.3 |
0.65 |
0.0 |
너 |
0.15 |
0.25 |
0.35 |
0.25 |
각 단어 토큰은 다른 토큰에 얼마나 많은 참석을 나타내는 확률 분포가 있습니다. 예를 들어,“사랑”이라는 단어는 0.05 확률,“I”는 0.3, 그 자체는 0.65로“hello”에 참석합니다.
그러나 위치 임베드가 없으면 LLM은 토큰의 상대적인 위치를 이해하기 위해 고군분투하여“Hello I Love You”와 같은 시퀀스를“You Love I Hello”와 구별하기가 어렵습니다. QKT 계산은 위치 거리를 고려하지 않고 토큰과 관련이 있으며 각각은 각각 등거리로 취급합니다.
이를 해결하기 위해 위치 인코딩이 도입되어 모델이 토큰의 순서를 이해하는 데 도움이되는 수치 적 신호를 제공합니다.
전통적인 위치 임베딩
원래주의에는 종이가 필요한 전부입니다. 각 벡터는 위치의 정현파 기능으로 정의되는 정현파 위치 임베드가 제안되었습니다. 이들 임베딩은 입력 서열 벡터에 다음과 같이 추가된다.
Bert와 같은 일부 모델은 교육 중에 배운 배운 위치 임베딩을 소개했습니다.
절대적인 위치 임베드와의 도전
정현파 및 배운 위치 임베드는 절대적이며 고유 한 위치를 인코딩합니다. 그러나 Huang et al. 그리고 Su et al., 절대 임베딩은 긴 시퀀스의 성능을 방해 할 수 있습니다. 주요 문제는 다음과 같습니다.
- 긴 입력 제한 : 상대 거리 대신 고정 위치에 초점을 맞추기 때문에 긴 시퀀스를 처리 할 때 절대 임베딩이 제대로 작동하지 않습니다.
- 고정 훈련 길이 : 학습 된 임베딩은 모델을 최대 훈련 길이로 묶어 더 긴 입력으로 일반화하는 능력을 제한합니다.
진보 : 상대 위치 임베딩
이러한 과제를 해결하기 위해 상대적 위치 임베드는 견인력을 얻었습니다. 주목할만한 두 가지 방법은 다음과 같습니다.
- 로터리 위치 임베딩 (로프)
- 알리바이 (선형 바이어스와의주의)
두 방법 모두 QKT 계산을 수정하여 문장 순서를 자체 변환 메커니즘에 직접 통합하여 모델이 긴 텍스트 입력을 처리하는 방법을 개선합니다.
로터리 위치 임베딩 (로프)은 쿼리와 키 벡터를 각각 각도로 회전시키고 위치를 나타내는 위치 정보를 인코딩합니다.
여기에는 회전 매트릭스가 있으며 교육의 최대 입력 길이에 따라 사전 정의됩니다.
이러한 접근 방식을 통해 LLM은 상대 거리에 초점을 맞출 수 있으며, 더 긴 시퀀스의 일반화를 향상시키고 효율적인 작업 별 최적화를 촉진합니다.
input_ids = tokenizer (프롬프트, return_tensors = "pt") [ "input_ids"]. to ( "cuda")
_ 범위 (5)의 경우 :
next_logits = model (input_ids) [ "logits"] [:, -1 :]
next_token_id = torch.argmax (next_logits, dim = -1)
input_ids = torch.cat ([input_ids, next_token_id], dim = -1)
print ( "input_ids의 모양", input_ids.shape)
generated_text = tokenizer.batch_decode (input_ids [:, -5 :])
생성 된_text

past_key_values = 없음 # past_key_values는 키 값 캐시입니다
Generated_tokens = []
next_token_id = tokenizer (프롬프트, return_tensors = "pt") [ "input_ids"]. to ( "cuda")
_ 범위 (5)의 경우 :
next_logits, past_key_values = model (next_token_id, past_key_values = past_key_values, use_cache = true) .to_tuple ()
next_logits = next_logits [:, -1 :]
next_token_id = torch.argmax (next_logits, dim = -1)
print ( "input_ids의 모양", next_token_id.shape)
print ( "키-값 캐시 길이", len (past_key_values [0] [0])) # past_key_values [num_layers, 0, v의 경우 1, batch_size, 길이, hidden_dim]
generated_tokens.append (next_token_id.item ())
generated_text = tokenizer.batch_decode (generated_tokens)
생성 된_text

config = model.config
2 * 16_000 * config.n_layer * config.n_head * config.n_embd // config.n_head
산출
7864320000
결론
긴 텍스트 입력 및 동적 채팅 응용 프로그램에 대한 LLM 아키텍처 최적화는 실제 적용 가능성을 발전시키는 데 중추적입니다. 광범위한 입력 컨텍스트를 관리하고, 계산 효율성을 유지하며, 의미있는 대화 상호 작용을 제공하는 데 어려움이 있으므로 건축 수준에서 혁신적인 솔루션이 필요합니다. 로터리 위치 임베딩 (ROPE), ALIBI 및 FLASH주의와 같은 기술은 위치 임베딩 및 자체 변환과 같은 미세 조정 센터 구성 요소의 변형 가능성을 보여줍니다.
이 분야가 발전함에 따라, 계산 효과와 엔지니어 인 독창성을 혼합하는 센터는 다음과 같은 획기적인 물결을 유발할 것입니다. 이러한 절차를 이해하고 실현함으로써 디자이너는 LLM의 전체 제어를 해결하여 다양한 실제 응용 프로그램에 대해 훌륭하지는 않지만 너무 적응할 수 있고 반응이 좋으며 일반적이지 않도록 보장 할 수 있습니다.
주요 테이크 아웃
- 로프 및 알리바이와 같은 기술은 성능을 희생하지 않고 더 긴 텍스트를 처리하는 LLM의 능력을 향상시킵니다.
- 플래시주의 및 슬라이딩 윈도우주의와 같은 혁신은 메모리 사용량을 줄여서 대규모 모델을 실제 응용 프로그램에 실용적으로 만듭니다.
- 긴 텍스트 입력을 위해 LLM을 최적화하면 확장 된 대화 및 복잡한 작업에서 컨텍스트와 일관성을 유지하는 능력이 향상됩니다.
- LLM은 더 나은 확장 성과 응답 성으로 요약, 검색 및 다중 회전 대화와 같은 작업을 지원하기 위해 발전하고 있습니다.
- 모델 정밀도를 줄이면 정확도를 유지하면서 계산 효율성이 향상되어 더 넓은 채택이 가능합니다.
- 아키텍처 설계 및 자원 최적화 균형을 유지하면 LLM이 다양하고 증가하는 사용 사례에 효과적인 상태를 유지합니다.
자주 묻는 질문
Q1. 1. LLM이란 무엇이며 왜 중요한가? A. 대형 언어 모델 (LLMS)은 AI 모델을 얻고 인간과 같은 컨텐츠를 생성하도록 설명합니다. 질문 응답에서 상상력있는 작곡에 이르기까지 다양한 비즈니스에 대한 유연한 장치를 만들 수있는 능력이 광범위하게 수행 할 수있는 능력으로 인해 중요합니다.
Q2. 로프와 알리바이는 LLM을 어떻게 개선합니까? A. 로프 (회전 위치 인코딩) 및 알리바이 (선형 바이어스를 사용한주의)는 긴 상황을 처리하는 능력을 향상시켜 일관성을 잃지 않고 확장 된 텍스트의 효율적인 처리를 보장함으로써 LLM을 향상시킵니다.
Q3. 플래시주의 란 무엇이며 메모리 사용량을 어떻게 최적화합니까? A. 플래시주의는 주의력을보다 효율적으로 계산하여 메모리 소비를 크게 줄이고 대규모 모델의 처리 속도를 높이는 알고리즘입니다.
Q4. LLM에 양자화가 중요한 이유는 무엇입니까? A. 양자화는 시연 가중치 (예 : 32 비트에서 8 비트까지)의 정확도를 감소시켜 계산 필요성과 메모리 활용도를 낮추는 반면, 유지하는 것은 실행을 보여주고, 더 작은 가제트의 배열을 강화합니다.
Q5. LLM을 더 스케일링하는 데 어떤 문제가 남아 있습니까? A. 주요 과제에는 계산 및 메모리 비용 관리, 편견 및 오용과 같은 윤리적 문제 해결 및 모델이 다양한 작업과 언어에서 효과적으로 일반화 될 수 있도록하는 것이 포함됩니다.
Q6. 긴 텍스트 입력을 효과적으로 처리하기 위해 LLM을 어떻게 최적화 할 수 있습니까? A. 긴 텍스트 입력에 대한 LLM 최적화에는 컨텍스트 창 확장, 메모리 메커니즘 및 효율적인 토큰 처리와 같은 기술이 포함되어 연장 된 대화 또는 문서 분석 중 일관성 및 성능을 유지할 수 있습니다.