TL;DR
Deep Speedã®offload_optimizeræ©èœã䜿ã£ãŠãVRAM40GBã®GPU1æã§3.6Bãã©ã¡ãŒã¿ã®LLMããã¡ã€ã³ãã¥ãŒãã³ã°ããŸããã
ããã«ãFlash Attentionã䜿ãããšã§ãåŠç¿ãé«éåãã€ã€äœ¿çšã¡ã¢ãªéãæžãããããé·ãç³»åé·ã§åŠç¿ãè¡ãããšãã§ããŸããã
ã¯ããã«
Flash Attentionã¯Attentionã®èšç®ã§äœ¿çšããGPUã¡ã¢ãªéãç³»åé·ã®2ä¹ã®ãªãŒããŒãã1ä¹ã«åæžããæè¡ã§ãxformersãoptimumãããã«ã¯transformersã©ã€ãã©ãªã§ãç°¡åã«äœ¿çšã§ããããã«ãªã£ãŠããŠããŸãã
ååã®èšäº(1, 2)ã§ã¯ãLLMã®æšè«ã«ãããŠFlash Attentionã䜿ã£ãŠã¿ãã®ã§ãããæšè«ã§ã¯ããŸã广ãèŠãããªããšããçµè«ãåŸãŸããã
ä»åã¯Flash Attentionãæ¬é ãçºæ®ããã§ãããåŠç¿ïŒãã¡ã€ã³ãã¥ãŒãã³ã°ïŒã§å¹æã確èªããŸãã
ãã£ãããªã®ã§ãLoRAã¯äœ¿ããå šãã©ã¡ãŒã¿ããã«ãã¡ã€ã³ãã¥ãŒãã³ã°ããããšãšããéããããªãœãŒã¹ïŒGPUã¡ã¢ãªïŒã§ãã«ãã¡ã€ã³ãã¥ãŒãã³ã°ãè¡ãããã«ãDeep Speedã©ã€ãã©ãªã䜿çšããŸãã
ãã¡ã€ã³ãã¥ãŒãã³ã°ã®æ¹æ³ãDeep Speedã©ã€ãã©ãªã®äœ¿ãæ¹ã¯ãäž»ã«ä»¥äžã®èšäºãåèã«ããŸããã
Fine-tune Falcon 180B with DeepSpeed ZeRO, LoRA & Flash Attention
ãã¡ãã®èšäºã¯Falcon 180Bãšããè¶ å·šå€§ã¢ãã«ãæ±ã£ãŠããŸãããæ¬èšäºã§ã¯3.6Bã®æ¥æ¬èªLLM line-corporation/japanese-large-lm-3.6bã䜿çšããŸãã
ç°å¢
å®éšã¯Google Colab (Pro)äžã§ãA100GPU (Syetem RAM 83.5GB, GPU RAM 40.0GB)1æã䜿çšããŠè¡ããŸããã
ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã«
transformersãšé¢é£ã©ã€ãã©ãª
!pip install transformers datasets accelerate bitsandbytes sentencepiece
transformersã®ã¢ãã«ã§Flash Attentionã䜿ãããã®ã©ã€ãã©ãª
!pip install optimum
deepspeedãšé¢é£ã©ã€ãã©ãª
!pip install deepspeed ninja
Pythonããã³ã©ã€ãã©ãªã®ããŒãžã§ã³
Python 3.10.12
accelerate 0.23.0
bitsandbytes 0.41.1
datasets 2.14.5
deepspeed 0.10.3
ninja 1.11.1
optimum 1.13.2
sentencepiece 0.1.99
torch 2.0.1+cu118
transformers 4.33.3
ããŒã¿ã»ããæºå
ãã¡ã€ã³ãã¥ãŒãã³ã°ã«ã¯æ¥æ¬èªinstruction tuningçšããŒã¿ã»ããã®databricks-dolly-15k-jaã䜿çšããŸããã
åèèšäºã®æ¹æ³ã«åŸã£ãŠåŠçããŸãã
ãã®æ®µéã§ã¯GPUã¯å¿ èŠãªãã®ã§ãåŠç¿ãšã¯å¥ã®ããŒãããã¯äžã§CPUã€ã³ã¹ã¿ã³ã¹ãçšããŠè¡ããŸãã
Google DriveããŠã³ã
from google.colab import drive
drive.mount('/content/drive')
%cd /content/drive/MyDrive/working_dir
ããŒã¿ã»ããèªã¿èŸŒã¿
from datasets import load_dataset
dataset = load_dataset("kunishou/databricks-dolly-15k-ja", split="train")
print(f"dataset size: {len(dataset)}") # -> dataset size: 15015
ãã®ããŒã¿ã»ããã¯ãæç€ºæã§ãã'instruction'ãšè£å©çãªæ å ±ã®'input'ããããŠåçã®'output'ãåãããããã®ã§ãã'input'ãååšããªãããŒã¿ãååšããŸãã
ããŒã¯ãã€ã¶ãŒæºå
import torch
from transformers import AutoTokenizer
model_name = "line-corporation/japanese-large-lm-3.6b"
tokenizer = AutoTokenizer.from_pretrained(model_name, use_fast=False)
ããŒã¿ã»ãããããã³ããã®ãã³ãã¬ãŒãã®åœ¢ã«æŽãã颿°format_prompt()ãštemplate_dataset()ãæºåããŠãdatasetã«é©çšããŸãã
def format_prompt(sample):
instruction = f"### Instruction\n{sample['instruction']}"
input = f"### Context\n{sample['input']}" if len(sample["input"]) > 0 else None
output = f"### Answer\n{sample['output']}"
# join all the parts together
prompt = "\n\n".join([i for i in [instruction, input, output] if i is not None])
return prompt
def template_dataset(sample):
sample["text"] = f"{format_prompt(sample)}{tokenizer.eos_token}"
return sample
dataset = dataset.map(template_dataset, remove_columns=list(dataset.features))
ããŒã¿ãäžã€ãµã³ãã«ãããšä»¥äžã®ãããªåœ¢åŒã«ãªã£ãŠããŸãã
from random import randint
print(dataset[randint(0, len(dataset))]["text"])
### Instruction
ã³ã«ããŸãŒã«ãã³ã³ãããŒã«ããããã®5ã€ã®ãã¹ããªæ¹æ³ãšã¯
### Answer
ãã€ããŒã©ã«ãµãŠã³ããããããã³ã§èŽãã1æ¥5å以äžã®çæ³ã1æ¥30å以äžã®ãªã©ãã¯ã¹ã§ããå
å®¹ã®æ¬ãèªãã1æ¥10å以äžã®æãæ¹ã倿®ãæã®æ¥å
ãæµŽã³ãã1æ¥30å以äžã®ãŠã©ãŒãã³ã°ãæ¯æ¥ããã</s>
çŽ ã®LLMã1ããinstruction tuningããã®ã§ããã³ãã¬ãŒãã¯èªç±ã«æ±ºããŠãæ§ããŸããã
äŸãã°ãæ¥æ¬èªLLMãªã®ã§ãInstruction, Answerã«é¢ããŠã¯æç€ºãåçãªã©ã®ããã«æ¥æ¬èªã«ããŠãåé¡ãªãã§ãããã
ä»åã¯ãã¯ããELYZA-japanese-Llama-2-7bã¢ãã«ã䜿ãããšããçµç·¯ããããELYZA-japanese-Llama-2ã¢ãã«ã§ã¯ããŒã¯ãã€ã¶ãŒãè±èªã§åŠç¿ããããã®ã ã£ãã®ã§è±èªã®ãŸãŸã«ããŠããŸããã
datasetã«ããŒã¯ãã€ã¶ãŒãé©çšããŸãã
tokenized_dataset = dataset.map(
lambda sample: tokenizer(sample["text"]), batched=True, remove_columns=list(dataset.features)
)
print(tokenized_dataset[0].keys()) # -> dict_keys(['input_ids', 'attention_mask'])
ããŒã¯ã³åããåŸã®ç³»åé·ã®çµ±èšæ å ±ãèŠãŠã¿ãŸãããã
import numpy as np
seq_lengths = [len(sample["input_ids"]) for sample in tokenized_dataset]
print(f"mean: {np.mean(text_lengths)}")
print(f"median: {np.median(text_lengths)}")
print(f"min: {np.min(text_lengths)}")
print(f"max: {np.max(text_lengths)}")
mean: 397.3209457209457
median: 250.0
min: 39
max: 14037
äžéšãå€ãå€çã«é·ãããŒã¿ãå«ãŸããŠããããã§ãã
ãã®ããã«ãé·ãã®éãããŒã¿ãããããšããŠãŸãšããŠTransformerã¢ãã«ã«å
¥åããäžã€ã®æ¹æ³ã¯ããã£ã³ã°ãè¡ã£ãŠé·ããæããããšã§ããããããè¡ããšããŒã¿å¹çãæªããªã£ãŠããŸããŸããä»åã®ãããªãã¡ã€ã³ãã¥ãŒãã³ã°ãªããšãããã倧éã®ããŒã¿ã䜿çšããäºååŠç¿æã«ã¯èŽåœçã§ãããŸããFlash Attentionã§ã¯ãããå
ã§ããŒã¿è¡ããšã«ç°ãªããã¹ã¯(attention bias)ããããããšã¯ã§ããªãã®ã§ãã³ãŒãã¬ãã«ã§ã®ç¹å¥ãªå¯ŸåŠãå¿
èŠãšãªã£ãŠããŸããŸãã
ããã§ã¯å¥ã®æ¹æ³ãšããŠãæå€§ç³»åé·ã«éãããŸã§æ¬¡ã®ããŒã¿ãè©°ã蟌ã¿ãäžã€ã®ããŒã¿ã®éäžã§æå€§ç³»åé·ã«éããå Žåã¯ããã§æç« ãåã£ãŠã次ã®ããŒã¿è¡ã«ç¶ãããè©°ã蟌ããšããããšãããŸãããã®æ¹æ³ã§ã¯ãäžéšã®æç« ã¯éäžã§åæãããŠããŸããšãããã¡ãªããã¯ãããã®ã®ãå
šãŠã®ããŒã¿è¡ã§æå€§ç³»åé·ãŸã§ããã¹ããè©°ãŸã£ãŠããã®ã§ãèšç®å¹çãè¯ããšããã¡ãªããããããŸãã
以äžãåèèšäºããæåããå®è£ ã³ãŒãã§ããæå€§ç³»åé·ã¯2048ãšããŠããŸãã
é·ãã®ã§æãç³ãã§ãããŸãã
# empty list to save remainder from batches to use in next batch
remainder = {"input_ids": [], "attention_mask": [], "token_type_ids": []}
def chunk(sample, chunk_length=2048):
# define global remainder variable to save remainder from batches to use in next batch
global remainder
# Concatenate all texts and add remainder from previous batch
concatenated_examples = {k: list(chain(*sample[k])) for k in sample.keys()}
concatenated_examples = {k: remainder[k] + concatenated_examples[k] for k in concatenated_examples.keys()}
# get total number of tokens for batch
batch_total_length = len(concatenated_examples[list(sample.keys())[0]])
# get max number of chunks for batch
if batch_total_length >= chunk_length:
batch_chunk_length = (batch_total_length // chunk_length) * chunk_length
# Split by chunks of max_len.
result = {
k: [t[i : i + chunk_length] for i in range(0, batch_chunk_length, chunk_length)]
for k, t in concatenated_examples.items()
}
# add remainder to global variable for next batch
remainder = {k: concatenated_examples[k][batch_chunk_length:] for k in concatenated_examples.keys()}
# prepare labels
result["labels"] = result["input_ids"].copy()
return result
# tokenize and chunk dataset
chunked_dataset_2048 = tokenized_dataset.map(
partial(chunk, chunk_length=2048),
batched=True,
)
# Print total number of samples
print(f"Total number of samples: {len(chunked_dataset_2048)}") # -> Total number of samples: 1407
# Save
chunked_dataset_2048.save_to_disk("dolly-15k-ja_processed_2048.hf")
ããŒã¿ã®1è¡ç®ããã³ãŒãããŠè¡šç€ºããŠã¿ãŸãã
print(tokenizer.decode(chunked_dataset_2048[0]['input_ids'], skip_special_tokens=False))
### Instruction
ãŽã¡ãŒãžã³ã»ãªãŒã¹ãã©ãªã¢èªç©ºã¯ãã€ããéèªãéå§ããã®ã§ãã?
### Context
ãŽã¡ãŒãžã³ã»ãªãŒã¹ãã©ãªã¢èªç©º(Virgin Australia Airlines Pty Ltd)ã¯ïŒïœç¥ïœïŒ
### Answer
ãŽã¡ãŒãžã³ã»ãªãŒã¹ãã©ãªã¢èªç©ºã¯ã2000幎8æ31æ¥ã«ãŽã¡ãŒãžã³ã»ãã«ãŒèªç©ºãšããŠã2æ©ã®èªç©ºæ©ã§åäžè·¯ç·ã®éèªãéå§ããŸããã</s> ### Instruction
éã®çš®é¡ã¯ã©ã£ã¡?ã€ã³ã¯ãšã€ã©ã¯ãã«ãšããŒã
### Answer
ã€ã³ã¯ãšã€ã©ã¯ãã«</s> ### Instruction
ã©ã¯ãã¯ãªãæ°Žãªãã§é·ãçããããã®ã?
### Answer
ïŒïœïœç¥ïœïœïŒ
### Context
ããŒãã¹ã»ãžã§ãã¡ãŒãœã³(1743幎4æ13æ¥[a]-1826幎7æ4æ¥)ã¯ãïŒïœç¥ïœïŒã¢ã¡ãªã«ç¬ç«æŠäº
äžéšãäžç¥ããŠããŸããEOSããŒã¯ã³</s>ã®åŸã«æ¹è¡ãå
¥ããªãã®ã§èŠã¥ããã§ãããå
ããŒã¿ã»ããã§ã®è€æ°ã®ããŒã¿è¡ãäžã€ã®ããŒã¿è¡ã«ãŸãšããããŠããããšãããããŸãã
ãŸããæåŸã¯Contextã®æç« ã®éäžã§ã¶ã€åãã«ãããŠããŸãã
ãã®ç¶ãã¯ã次ã®ããŒã¿è¡ã®æåã«æ¥ãã®ã§ãããåŠç¿æã¯ç¶ããšããŠã¢ãã«ã«å
¥åãããããšã¯ãªããã¢ãã«ã¯éäžããå§ãŸãè¬ã®æç« ãèŠãããïŒäºæž¬ããããïŒãInstructionãèŠãŠãªãã®ã«AnswerãèŠããããïŒäºæž¬ãããããïŒãšããããšã«ãªããŸãã
ãããããã®ãããªããŒã¿ã»ããã®åŠçã¯LLMã®åŠç¿ã§ã¯æ®éã«è¡ãããŠããããšã ãšæãã®ã§ãããã ãšãããšçµ¶å¯Ÿäœçœ®åã蟌ã¿ã¯è¯ãæ¹æ³ã§ã¯ãªããçžå¯Ÿäœçœ®ãèæ ®ããããšãã§ããé·è·é¢ã§ã®äŸåæ§ãæžè¡°ããæ§è³ªãæã€Rotary Position Embedding (RoPE)ãxPosãLLMã§ã¯ã¡ãžã£ãŒãªææ³ãšãªã£ãŠããã®ãçŽåŸã§ãã
åŸã®å®éšã®ãããç³»åé·512ãš1024ã®datasetãäœæããŠä¿åããŠãããŸãã
remainder = {"input_ids": [], "attention_mask": [], "token_type_ids": []}
chunked_dataset_512 = tokenized_dataset.map(
partial(chunk, chunk_length=512),
batched=True,
)
print(f"Total number of samples: {len(chunked_dataset_512)}") # Total number of samples: 5629
chunked_dataset_512.save_to_disk("dolly-15k-ja_processed_512.hf")
remainder = {"input_ids": [], "attention_mask": [], "token_type_ids": []}
chunked_dataset_1024 = tokenized_dataset.map(
partial(chunk, chunk_length=1024),
batched=True,
)
print(f"Total number of samples: {len(chunked_dataset_1024)}") # Total number of samples: 2814
chunked_dataset_1024.save_to_disk("dolly-15k-ja_processed_1024.hf")
åŠç¿
ã¢ãã«ã¯LINEãå ¬éããŠããjapanese-large-lm-3.6bã䜿çšããŸããäºååŠç¿ã®ã¿ã§instruction tuningã¯è¡ãããŠããªãã¢ãã«ã§ãã
åŠç¿ã¯Hugging Face Transformerã©ã€ãã©ãªã®TrainerãçšããGPU1æã§åŠç¿ãè¡ãããã«Deep Speedã®ZeRO-2ã䜿çšããŸããDeep Speedã®äœ¿ãæ¹ã«é¢ããŠã¯ãå ã«æããèšäºãšHugging Faceã®ããã¥ã¡ã³ããåèã«ããŸããã
以äžã®å®éšã¯ãA100GPUã®ã€ã³ã¹ã¿ã³ã¹ãçšããŠè¡ããŸãããGPU RAMã¯40.0GBãã·ã¹ãã (CPU) RAMã¯83.5GBã§ãã
éåžžã®Attentionãçšããå ŽåãšFlash Attentionãçšããå Žåã§ãããããç³»åé·512, 1024, 2048ã®ããŒã¿ã§åŠç¿ãããããšã詊ã¿ãŸãã
éåžžAttention
A100GPUã®ã«ãŒãã«ã䜿ã£ãColabããŒãããã¯äžã§ãç°å¢ã®ã»ã¯ã·ã§ã³ã«èšããã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããGoogle DriveãããŠã³ããããŒã¿ã»ãããä¿åãããã£ã¬ã¯ããªã«ç§»åãããã®ãšããŸãã
åãã«ãããŒãããã¯äžã§Deep Speedã䜿ãããã®ç°å¢å€æ°ã®èšå®ãããŸãã
import os
os.environ["MASTER_ADDR"] = "localhost"
os.environ["MASTER_PORT"] = "9994"
os.environ["RANK"] = "0"
os.environ["LOCAL_RANK"] = "0"
os.environ["WORLD_SIZE"] = "1"
次ã«ããŒã¿ã»ãããèªã¿èŸŒã¿ãŸãããŸãã¯ç³»åé·512ã®ããŒã¿ã䜿ããŸãã
from datasets import load_from_disk
dataset = load_from_disk("./dolly-15k-ja_processed_512.hf")
ã¢ãã«ãšããŒã¯ãã€ã¶ãŒãèªã¿èŸŒã¿ãŸããã¢ãã«ã®ãã©ã¡ãŒã¿ã¯float16ãšããŸãã
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "line-corporation/japanese-large-lm-3.6b"
tokenizer = AutoTokenizer.from_pretrained(model_name, use_fast=False)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16,
)
model.cuda()
ããã«ãèšèªã¢ãã«ã®åŠç¿ã®ããã®collatorãæºåããŸãã
from transformers import DataCollatorForLanguageModeling
tokenizer.pad_token = tokenizer.eos_token
data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)
Deep Speedã䜿ãããã«ã¯jsonã®èšå®ãã¡ã€ã«ãTrainerã«æž¡ãå¿ èŠãããã®ã§ãäœæããŸãã
%%writefile zero_train.json
{
"fp16": {
"enabled": "auto",
"loss_scale": 0,
"loss_scale_window": 1000,
"initial_scale_power": 16,
"hysteresis": 2,
"min_loss_scale": 1
},
"optimizer": {
"type": "AdamW",
"params": {
"lr": "auto",
"betas": "auto",
"eps": "auto",
"weight_decay": "auto"
}
},
"scheduler": {
"type": "WarmupLR",
"params": {
"warmup_min_lr": "auto",
"warmup_max_lr": "auto",
"warmup_num_steps": "auto"
}
},
"zero_optimization": {
"stage": 2,
"offload_optimizer": {
"device": "cpu",
"pin_memory": true
},
"allgather_partitions": true,
"allgather_bucket_size": 2e9,
"overlap_comm": true,
"reduce_scatter": true,
"reduce_bucket_size": 2e9,
"contiguous_gradients": true
},
"gradient_accumulation_steps": "auto",
"gradient_clipping": "auto",
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": "auto"
}
"auto"ãšæžããŠããéšåã¯Trainerã®èšå®ã§äžæžããããŸãã
ããã§éèŠãšãªãã®ã¯ã"zero_optimization"ã®é
ç®ã§ãã"stage"ã¯1, 2, 3ããéžã¹ãŸãããoffload_optimizeræ©èœã䜿ããã®ã¯Stage 2ã3ã§ããStage 3ã¯ã¢ãã«ãã©ã¡ãŒã¿ãè€æ°GPUã«åæ£ãããå¿
èŠãããå Žåãªã©ã«äœ¿ãããèšå®ã§ãGPU1æã§åŠç¿ãããä»åã®ãããªã±ãŒã¹ã§ã¯ã¡ãªããã¯ç¡ããããªã®ã§ãä»åã¯Stage 2ã䜿ãããšãšããŸãã"offload_optimizer"ã§"cpu"ãæå®ããããšã§ããªããã£ãã€ã¶ãŒãä¿æãããã©ã¡ãŒã¿ãCPUã¡ã¢ãªã«éé¿ãããGPUã¡ã¢ãªã®äœ¿çšéãæããããšãã§ããŸãããŸãã"allgather_bucket_size"ã¯GPUã¡ã¢ãªäœ¿çšéãšéä¿¡ã®é »åºŠã®ãã¬ãŒããªããã³ã³ãããŒã«ãããã©ã¡ãŒã¿ã§ãå°ãããããšGPUã¡ã¢ãªäœ¿çšéãäžããããšãã§ããŸãããåŠç¿ã¯é
ããªããŸãã系統çã«å€ãå€ããŠæ¯èŒã¯ã§ããŠããªãã®ã§ããã"allgather_bucket_size"ã2e8ãšãããåŠç¿ãããªãé
ãã£ãã®ã§ã2e9ãšããŸãããããããŠ"reduce_bucket_size"ã®å€ã2e9ãšããŠããŸããããããã®èšå®ã®æå³ã¯çè§£ããããŠããªãã®ã§ã詳ããã¯Hugging Faceã®ããã¥ã¡ã³ããDeep Speedå
¬åŒããã¥ã¡ã³ãããåç
§ãã ããã
以äžã®å®éšã¯ãã¹ãŠäžèšã®zero_train.jsonã®èšå®ã§è¡ããŸããã
æåŸã«Trainerã®èšå®ãè¡ã£ãŠãåŠç¿ãå®è¡ããŸãã
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
output_dir="/content/tmp",
overwrite_output_dir=True,
per_device_train_batch_size=4,
gradient_accumulation_steps=16,
learning_rate=5e-5,
weight_decay=0.01,
num_train_epochs=1,
logging_steps=5,
lr_scheduler_type="constant_with_warmup",
warmup_steps=10,
save_strategy="no",
fp16=True,
deepspeed="./zero_train.json",
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset,
data_collator=data_collator,
)
# åŠç¿å®è¡
trainer.train()
TrainingArgumentsã§éèŠãªã®ã¯fp16ãèšå®ããããšãšãdeepspeedåŒæ°ã«èšå®ãã¡ã€ã«ã®ãã¹ãäžãããšããã§ããããã ãã§ãDeep Speedã䜿ã£ãåŠç¿ãè¡ãããšãã§ããŸããïŒè©ŠããŠããŸããããfp16ã®ä»£ããã«bf16ã§ãè¯ãã¯ãã§ããïŒ
ããããµã€ãºper_device_train_batch_sizeã¯4ãgradient_accumulation_stepsã¯16ãšããããšã§ãå®è³ªã®ããããµã€ãºã64ãšããŠããŸãã
ä»åã®å®éšã®ç®çã¯ãDeep SpeedãFlash Attentionã«ããåŠç¿å¹çåã®å¹æã確èªããããšã§ãã¢ãã«ã®æ§èœã¯2ã®æ¬¡ãšããŠããŸãã®ã§ãåŠç¿ã¯ïŒãšããã¯ã®ã¿ã§ããã®ã»ãã®ãã€ããŒãã©ã¡ãŒã¿ã®èšå®ãé©åœã§ãã
ãŸããFlash Attention䜿çšã®ãšããã§åŸè¿°ããçç±ã§ãTrainerãã¢ãã«ãä¿åããªãèšå®save_strategy="no"ãšããŠããŸãã
åŠç¿éå§åã®RAMã®äœ¿çšéã¯ã
System RAM: 4.8 / 83.5GB, GPU RAM 8.0 / 40.0GB
ã§ããããåŠç¿äžã¯
System RAM: 75.1 / 83.5GB, GPU RAM 32.5 / 40.0GB
ãšãªããoffload_optimizerã®æ©èœã«ãã£ãŠCPUã¡ã¢ãªã倧éã«äœ¿çšãããŸããã
CPUã¡ã¢ãªå®¹éãå°ããå¥ã®Colabã€ã³ã¹ã¿ã³ã¹ã§è©Šããæã¯CPUã¡ã¢ãªãããµããŠåŠç¿å®è¡ã§ããªãã£ãã®ã§ãoffload_optimizeræ©èœã䜿ããšãã«ã¯GPUã¡ã¢ãªã ãã§ãªãCPUã¡ã¢ãªã®ã¹ããã¯ãéèŠãšãªããŸãã
88ã¹ãããã®åŠç¿ã«å¯ŸããŠãåŠç¿æéã»é床ã®ã¡ããªãã¯ã¯
'train_runtime': 2456.4699, 'train_samples_per_second': 2.291, 'train_steps_per_second': 0.036
ãšãªããŸãããåŠç¿å šäœã§40åçšåºŠã§ãã®ã§ãååæé ãªæéããšæããŸãã
Trainerã¯ã¢ãã«ãä¿åããªãèšå®ã«ããã®ã§ãèªåã§ä¿åããå¿ èŠãããã®ã§ãããåŠç¿åŸãRAMã«ãã£ãã·ã¥ãæ®ã£ãŠããããã§ãä¿åäžã«ã·ã¹ãã RAMãOOMã«ãªã£ãŠã«ãŒãã«ãèœã¡ãŠããŸã£ãããšããã£ãã®ã§ããŸãRAMãå¯èœãªéã空ããŸãã
import gc
import deepspeed
del dataset
del trainer
gc.collect()
deepspeed.runtime.utils.empty_cache()
torch.cuda.empty_cache()
ãã®åŠçãè¡ã£ãŠãCPU RAMäžã®å€§éã®ãã£ãã·ã¥ã¯æ¶ããªãã£ãã®ã§ãããã¢ãã«ä¿åäžã«OOMã¯çºçããªããªããŸããã
ã¢ãã«ä¿åã¯ä»¥äžã®ã³ãã³ãã§è¡ããŸãã
model.save_pretrained("/content/tmp/model")
ããŠã³ãããDriveã®ãã£ã¬ã¯ããªãçŽæ¥æå®ãããšä¿åãé
ãã£ãã®ã§ããã£ããããŒã«ã«ã®ãã£ã¹ã¯ã«ä¿åããŠãåŸããDriveã«ã³ããŒããŸããã
ãã®ã³ãã³ãã§ä¿åããã¢ãã«éã¿ã¯from_pretrained()ã§èªã¿èŸŒãããšãã§ããŸãã
Flash Attention
Flash Attentionã䜿ãå Žåã§ããåŠç¿ã®æé ã¯äžèšãšã»ãšãã©åãã§ãã®ã§ãéãéšåã®ã¿èª¬æããŸãã
ä»å䜿çšããŠããã¢ãã«ã¯GPT-NeoXããŒã¹ã§ããã¡ãã®èšäºã§ç޹ä»ããfrom_pretrained()ã«use_flash_attention_2=Trueãæž¡ããšããæ¹æ³ã¯ïŒèšäºå·çæç¹ã§ã¯ïŒäœ¿ããŸããã®ã§ããã¡ãã®èšäºã§ç޹ä»ããoptimumã©ã€ãã©ãªã®BetterTransformerã®æ©èœãçšããŸãã
ã¢ãã«ã€ã³ã¹ã¿ã³ã¹ãç«ã¡äžããåŸã§ã
model.to_bettertransformer()
ãå®è¡ããã ãã§ãã
Flash Attentionã䜿çšããããã«ã¯ãtorch.backends.cuda.flash_sdp_enabled()ãTrueã«èšå®ãããŠããå¿
èŠãããã®ã§ãããä»åã®ç°å¢ã§ã¯ããã©ã«ãã§Trueã«ãªã£ãŠããŸããã以äžã®ã³ãã³ãã§èšå®ã確èªã§ããŸãã
import torch
torch.backends.cuda.flash_sdp_enabled() # -> True
ãããFalseã«ãªã£ãŠããå Žåã¯ã
torch.backends.cuda.enable_flash_sdp(True)
ãå®è¡ããã°åãæ¿ããããŸãã
BetterTransformerã§å€æããã¢ãã«ã¯ãã®ãŸãŸTrainerã«æž¡ããŠåŠç¿ããããšãã§ããŸãã
ãã ããã¢ãã«ãä¿åãããšãã«BetterTransformer圢åŒããéåžžã®åœ¢åŒã«æ»ããªããšä¿åã§ããªããšãããšã©ãŒãçºçããŠãTrainerã忢ããŠããŸããŸããTrainerãšoptimumã©ã€ãã©ãªã®é£æºãæªå®è£
ã®ããã§ãããã®ãšã©ãŒãé¿ãããããTrainingArgumentsã§save_strategy="no"ãšããŠããã®ã§ãããåŠç¿ãçµäºãããã以äžã®ããã«ã¢ãã«ãéåžžã®åœ¢åŒã«æ»ããŠãããŸãã
from optimum.bettertransformer import BetterTransformer
model = BetterTransformer.reverse(model)
ãã®å Žåããã£ãã·ã¥ãæé€ããŠããã¢ãã«ãä¿åããŸããã
ããŠãFlash Attentionã䜿ã£ãå Žåã®åŠç¿äžã®RAM䜿çšéã¯ä»¥äžã®ããã«ãªããŸããã
System RAM: 75.0 / 83.5GB, GPU RAM 26.3 / 40.0GB
System RAMã¯å€ãããŸããããGPU RAMã¯32.5GBãã26.3GBã«æžå°ããŸããã確ãã«Flash Attentionã®å¹æãããããã§ãã
ããè©³çŽ°ãªæ¯èŒã¯ä»¥äžã§ç³»åé·ã®éãããŒã¿ã«å¯Ÿããçµæãšäžç·ã«ãŸãšããŸãã
çµæ
ã¡ã¢ãªäœ¿çšéã»åŠç¿æé
éåžžã®Attentionãçšããå ŽåãšFlash Attentionãçšããå Žåã§ãããããç³»åé·512, 1024, 2048ã®ããŒã¿ã§åŠç¿ãããçµæãäžã®è¡šã«ãŸãšããŸããã
ç³»åé·512ã§ã¯ããããµã€ãº4ãšããŠãç³»åé·1024ãš2048ã§ã¯Out of Memory (OOM)ã«ãªã£ãå Žåã¯ããããµã€ãºãååã«ããŠããŸãã
ããããµã€ãº (per_device_batch_size)ãå€ããæã«ã¯ãå®è³ªã®ããããµã€ãºã64ã®ãŸãŸã«ãªãããã«gradient_accumulation_stepsãå€ããŠããŸãã
å®è³ªããããµã€ãºãæããŠããã®ã§ãç³»åé·ãé·ããªãã°ã忝äŸããŠ1ãšããã¯åœããã®ã¹ãããæ°ã¯æžã£ãŠããŸãã
| Attention | ç³»åé· | ããããµã€ãº | ã¹ãããæ° | GPU RAM (GB) | System RAM (GB) | train runtime (sec) | train samples per second |
|---|---|---|---|---|---|---|---|
| Normal | 512 | 4 | 88 | 32.5 | 75.1 | 2456 | 2.29 |
| Normal | 1024 | 2 | 44 | 38.9 | 75.1 | 2322 | 1.21 |
| Normal | 2048 | 1 | 22 | OOM | - | - | - |
| Flash | 512 | 4 | 88 | 26.3 | 75.0 | 2354 | 2.39 |
| Flash | 1024 | 4 | 44 | 33.2 | 74.8 | 1330 | 2.11 |
| Flash | 2048 | 2 | 22 | 33.2 | 74.5 | 1265 | 1.11 |
RAMã«ã€ããŠã¯ãåŠç¿äžã®é©åœãªã¿ã€ãã³ã°ã§Colabã®ãªãœãŒã¹è¡šç€ºãèŠãŠèšé²ãããã®ãªã®ã§ãå€å°ã®å€åã¯ãããŸãã
éåžžã®Attentionã§ã¯ç³»åé·1024ã¯ããããµã€ãº2ã§åŠç¿ãåã£ãã®ã§ãããç³»åé·ã2048ã«ãããšããããµã€ãº1ã§ãOOMã«ãªã£ãŠããŸããŸããã
äžæ¹ã§ãFlash Attentionã䜿ã£ãå Žåã¯ãç³»åé·1024ã¯ããããµã€ãº4ã§ãåŠç¿ãå®è¡ã§ããç³»åé·ã§ã2048ããããµã€ãºãååã«ããã ãã§OOMãåé¿ã§ããŸãããæ³šç®ãã¹ãã¯ãç³»åé·1024ã»ããããµã€ãº4ã®æãšç³»åé·2048ã»ããããµã€ãº2ã®æã®GPUã¡ã¢ãªäœ¿çšéãåããšãããšããã§ããããã¯ãFlash Attentionäœ¿çšæã®GPUã¡ã¢ãªäœ¿çšéã¯ç³»åé·ã«æ¯äŸããããšã®åž°çµã§ãã

åŠç¿æé (train runtime)ãåãç³»åé·ã§æ¯èŒãããšãFlash Attentionã®æ¹ãåŠç¿ãé«éã§ããããšãããããŸããç³»åé·1024ã§åŠç¿æéã«å€§ããªå·®ãããã®ã¯ãper_device_batch_sizeãç°ãªãããã§ããïŒãã®æå³ã§ãç³»åé·512ã®æãOOMã«ãªããªãç¯å²ã§per_device_batch_sizeããªãã¹ã倧ããããŠæ¯èŒãè¡ãã¹ãã§ãããïŒ
ãŸããç³»åé·ãé·ãããŠ1ã¹ãããåœããã«å«ãŸããããŒã¯ã³æ°ãå¢ãããšãåŠç¿ãå¹çåãããŠé«éåãããåŸåããããŸãã®ã§ãFlash Attentionã«ããé·ãç³»åé·ã§ã®åŠç¿ãå¯èœã«ãªãããšã§ãããã«åŠç¿ãé«éåã§ããŠããããšãèŠãŠåããŸãã
åŠç¿çµæ
ä»åã®å®éšã®ç®çã¯ãDeep SpeedãšFlash Attentionã«ããåŠç¿å¹çåã®å¹æã確ãããããšã§ããã®ã§ãã¢ãã«ã®æ§èœã¯2ã®æ¬¡ãšããŠããŸããã
ããã§ããããããåŠç¿ããŸãšãã«è¡ããŠããªãã£ããå
ãåããããŸããã®ã§ãç°¡åã«ã§ã¯ãããŸããå®éã»å®æ§çã«ç¢ºãããŠãããŸãã
åŠç¿æ²ç·ã¯äžå³ã®ããã«ãªããŸãã

ã©ã®åŠç¿èšå®ã§ããã»ãŒåãããã«ãã¹ãæžå°ããŠããããšãèŠãŠåããŸãã
ç¹ã«ãåãç³»åé·ã ãšéåžžAttentionãšFlash Attentionã®æ²ç·ãéãªã£ãŠãããFlash Attentionã®èšç®å
容ã¯éåžžAttentionãšåãã§ããããšã確èªã§ããŸãã
次ã«ã宿§çãªç¢ºèªãšããŠãåŠç¿ãããã¢ãã«ã«ããã³ãããå
¥åããŠå¿çãèŠãŠã¿ãŸãããã
以äžã®æé ã§ãååœã®çåãå
šãŠåæããŠãã ãããããšãã質åã«å¯Ÿããå¿çã3ååºåãããŸãã
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
tokenizer = AutoTokenizer.from_pretrained(
"line-corporation/japanese-large-lm-3.6b",
use_fast=False,
)
model_dir = "model_save_dir" # ã¢ãã«ãä¿åãããã£ã¬ã¯ããªãæå®ãå
ã¢ãã«ã¯line-corporation/japanese-large-lm-3.6bãæå®ã
model = AutoModelForCausalLM.from_pretrained(
model_dir,
torch_dtype=torch.float16,
)
model.cuda()
generator = pipeline("text-generation", model=model, tokenizer=tokenizer, device="cuda")
generator_params = dict(
max_length = 256,
do_sample = True,
temperature = 0.7,
top_p = 0.9,
top_k = 0,
repetition_penalty = 1.1,
num_beams = 1,
pad_token_id = tokenizer.pad_token_id,
)
input_text = """ååœã®çåãå
šãŠåæããŠãã ããã"""
prompt = f"### Instruction\n{input_text}\n\n### Answer\n"
for _ in range(3):
output = generator(
prompt,
**generator_params,
)
print(output[0]["generated_text"])
print("----------------" * 3)
ãã¡ã€ã³ãã¥ãŒãã³ã°åã®å ã¢ãã«ãšãç³»åé·512ã§Flash Attentionã䜿ã£ãŠåŠç¿ãããã¢ãã«ã®çµæã瀺ããŸãã
ãã¡ã€ã³ãã¥ãŒãã³ã°åã®å ã¢ãã«
### Instruction
ååœã®çåãå
šãŠåæããŠãã ããã
### Answer
éŠå·ç
埳島ç
æåªç
é«ç¥ç
A: ãããçµæ§é£ããã§ããã»ã»ã»
1.ååœã«éœåºçã¯4ã€ãããããŸããã®ã§ããã®ãã¡3ã€ã®éœåºçãæžãã°OKã§ãã
2.æ±äº¬éœåºéšãå«ãéœåºçåãæžããŸã(äŸã»æ±äº¬éœ)
3.47éœéåºçã®ãã¡ãåæµ·éãšæ²çžçãé€ãã45éåºçãæžããŸã(äŸã»å€§éªåº)
4.éœåºçåã¯ã²ãããªã§ãéœéåºçåºæåšå°ã¯æŒ¢åã§æžããŠãã ãã(äŸã»æ±äº¬éœåºã倧éªåºåº)
5.45éœéåºç以å€ã®éœåºçåã¯æžããªãã§ããã§ã(äŸã»æç¥ç)
6.éœåºçåã®æ¬¡ã«ãéããä»ããæã¯ããéãã®åãçç¥ãããã®ãŸãŸä»ããŠãã ãã(äŸã»çŠå²¡ç)
7.ãéããçç¥ããå Žåã¯ããã®éœåºçã«ã¯ãéããä»ããããªãããšã«ãªããŸãã®ã§æ³šæããŠãã ãã(äŸã»åæµ·éãç§ç°ç)A: ããã«ã¡ã¯
#1ããã®åçã®è£è¶³ã§ãããå®®åŽçã®å Žåã¯
>å®®åŽçãã²ãããªã§æžãå Žåã¯ãå®®åŽåžã®ãããåæ¹ããšãåæ¹ãã«åããŠæžããŸãããã
â
ããã¯ééãã§ã
------------------------------------------------
### Instruction
ååœã®çåãå
šãŠåæããŠãã ããã
### Answer
1. é«ç¥çã埳島çãéŠå·çãæåªçãæåªçãé«ç¥ç
2. é«ç¥çã埳島çãéŠå·çã埳島çãé«ç¥çãéŠå·ç
3. é«ç¥çã埳島çãæåªçãé«ç¥çãæåªçãéŠå·çãæåªçãé«ç¥ç
4. é«ç¥çã埳島çãéŠå·çãæåªçã埳島çãéŠå·çãæåªçãæåªç
5. é«ç¥çã埳島çãéŠå·çãæåªçã埳島çãæåªçãéŠå·çã埳島çãæåªç
6. é«ç¥çã埳島çãéŠå·çãæåªçãæåªçãæåªçã埳島çãéŠå·çãéŠå·çãæåªç
7. é«ç¥çã埳島çãéŠå·çãæåªçã埳島çãæåªçã埳島çãéŠå·çã埳島çãéŠå·çãæåªç
8. é«ç¥çã埳島çãéŠå·çãæåªçã埳島çã埳島çãéŠå·çãæåªçãéŠå·çãéŠå·çãæåªç
9. é«ç¥çã埳島çãéŠå·çã埳島çãéŠå·çã埳島çãéŠå·çãéŠå·çãéŠå·çãéŠå·çã埳島ç
10. é«ç¥çã埳島çãéŠå·çã埳島çãéŠå·çã埳島çã埳島çãéŠå·çãéŠå·çã埳島çãéŠå·ç
11. é«ç¥çã埳島çãéŠå·çãéŠå·çãéŠå·çãéŠå·çãéŠå·çãéŠå·çã
------------------------------------------------
### Instruction
ååœã®çåãå
šãŠåæããŠãã ããã
### Answer
æåª é«ç¥ 埳島 éŠå· æåªA: 1.ãA-Zé ãã«äžŠã³æ¿ããåŸã«ãããã«ããããããé ãã«äžŠã³æ¿ããã
2.ããããããé ãã§äžŠã³æ¿ããŠããããA-Zé ãã«äžŠã³æ¿ããã
3.ããããããé ããšãA-Zé ãã®äž¡æ¹ã䜿ã£ãŠäžŠã³æ¿ããã
4.å
šéšã®æåãå
¥åããŠæ€çŽ¢ããã(ãã ããå
šè§ã®ã¿)
5.æåãäžæåãã€æ€çŽ¢ããŠããã
6.ããããããããããããããããå¥ã
ã«å
¥åããŠæ€çŽ¢ããã
7.äžæåãã€æ€çŽ¢ããæåŸã«ãããã ããæ€çŽ¢ããã
------------------------------------------------
æ£ããçããåŸãããŠããå ŽåããããŸããã察話圢åŒã§çããããã«åŠç¿ãããŠããŸããã®ã§ã質åãšé¢ä¿ãªãåºåãç¶ããŠããŸããŸãã
ç³»åé·512ã§Flash Attentionã䜿ã£ãŠåŠç¿ãããã¢ãã«
### Instruction
ååœã®çåãå
šãŠåæããŠãã ããã
### Answer
é«ç¥çã埳島çãæåªçãéŠå·çã§ããååœã¯4ã€ã®çããæ§æãããŠããŸã:
- é«ç¥ç
- 埳島ç
- æåªç
- éŠå·ç
ååœã¯çŽ æŽãããæ¯è²ãšèªç¶ã®å®åº«ã§ãçŸãã芳å
ã¹ãããããããããããŸãããŸããäŒçµ±çãªæåãé£ã¹ç©ãªã©ããŠããŒã¯ãªäœéšãã§ããå Žæã§ããååœã«ã¯ãããããã®ã¢ã¯ãã£ããã£ããããŸã!æ¯éã蚪ããŠã¿ãŠãã ããã
ååœèгå
ã¬ã€ã|ååœèгå
ã¬ã€ãã§ã¯ãååœãžã®æ
è¡ãèšç»ããããã®åœ¹ç«ã€æ
å ±ãæäŸããŠããŸããããã§ã¯ãååœãæ
ããéã«å©çšã§ããããŸããŸãªäº€éæ©é¢ãã玹ä»ããŸãã
ãã²ãã§ãã¯ããŠã¿ãŠãã ããã!
### Answer
ååœã¯ãé«ç¥çã埳島çãæåªçãéŠå·çã§æ§æãããŠããŸããååœã¯4ã€ã®çããæ§æãããŠããŸããååœã¯çŽ æŽãããæ¯è²ãšèªç¶ã®å®åº«ã§ããçŸãã芳å
ã¹ãããããããããããŸããååœã蚪ãããªãããã²èšªããŠã»ããå Žæã§ããååœã«ã¯ãããããã®ã¢ã¯ãã£ããã£ããããŸããæ¯éãæ¥œããã§ãã ãããååœã«ã¯ãäŒçµ±æåãšã°ã«ã¡ã楜ãããå ŽæããããããããŸãããŸããååœã«ã¯ãããããªããŒãããããæµ·æ°ŽæµŽãã§ããŸããååœã®æ
ããæ¥œãã¿ãã ãããååœã¯ãšãŠãé
åçãªå Žæã§ãããã²ã楜ããã§ãã ãã!
ååœèгå
ã¬ã€ãã§ã¯ãååœãžã®æ
è¡ãèšç»ããããã®æ§ã
ãªäº€éææ®µã玹ä»ããŠããŸãããã²ãã§ãã¯ããŠã¿ãŠãã ããã
------------------------------------------------
### Instruction
ååœã®çåãå
šãŠåæããŠãã ããã
### Answer
éŠå·ã埳島ãæåªãé«ç¥ã§ãããããã¯ååœã«ãã4ã€ã®çã§ããããããªããé«ç¥ãã©ãã«ãããç¥ããªãã£ãããããã¯ãšãŠãéãè¯ãããšã§ããååœã¯æ¬å·ã®æ±æµ·å²žã«äœçœ®ããååœã®äžå¿ã«ã¯å€ªå¹³æŽããããŸããååœã®è¥¿éšã«äœçœ®ããã®ãæåªçã§ãååœã®äžå€®éšã«äœçœ®ããã®ã埳島çã§ãããŸããéŠå·çã¯ååœã®è¥¿åŽã«äœçœ®ããŠããŸããååœã®æ±éšã«äœçœ®ããŠããã®ãé«ç¥çã§ããååœã®æ±åŽã«äœçœ®ããã®ã¯éŠå·çã§ããååœã®ååŽã«äœçœ®ããã®ãããã®äžã«ååœæµ·çãããé«ç¥çã§ãã
ãã®ãªã¹ãã®äžãããååœã®çåã2ã€ä»¥äžéžã¶ããšãã§ããã¯ãã§ããäŸãã°ãããªãã®çã¯é«ç¥ã ãšä»®å®ããŸãããããŠãååœã®æ®ãã®3ã€ã®çãéŠå·ã埳島ãæåªããéžã¶ããšãã§ããŸã:
1. é«ç¥ - éŠå·
2. éŠå· - 埳島
3. 埳島 - æåª
ããããããªãã¯ä»ã®éžæè¢ãšããŠã以äžã®ãã®ãéžã¶ããšãã§ããŸã:
1. é«ç¥ - æåª
2. é«ç¥ - 埳島
3. 埳島 - éŠå·
4. æåª -
------------------------------------------------
### Instruction
ååœã®çåãå
šãŠåæããŠãã ããã
### Answer
é«ç¥çã埳島çãæåªçãéŠå·çãé«ç¥çãæåªçãéŠå·çã§ããååœã¯4ã€ã®çãããªãããã®ãã¡3ã€ã¯ååœã«ãããŸã:é«ç¥çã埳島çãæåªçã§ãã4ã€ç®ã¯ããéè·¯ãã§ã88ç®æã®å¯ºãå·¡ã巡瀌ã®éã§ãããååœã«ã¯ä»ã«ããæ±äºãäžäºãåäºãšããå°åããããŸããäŸãã°ãæŸå±±ã¯æ±äºã«å±ããŠããŸããæŸå±±åžã¯ãååœã«ããæåã®å€§éœåžã§ãããæã人å£ã®å€ãéœåžã§ããããŸãããŸããååœã«ã¯å€ãã®å³¶ããããååœå
«åå
«ç®æã¯å³¶ã
ã«ç¹åšããŠããŸããååœã¯ãæ¥æ¬ã§5çªç®ã«å€§ããå³¶ã§ããååœã¯ãæ¥æ¬ã§æã人å£ãå€ããé¢ç©ãæãåºãçã§ãããååœã¯ãæ¥æ¬ã®æ¬å·ãšä¹å·ã®éã«ãã倧ããªå³¶ã§ãæ¬å·ããåãé¢ãããŠããŸãããã®å³¶ã®é¢ç©ã¯16,029km2(6,872å¹³æ¹ãã€ã«)ã§ã2ã€ã®äž»ãªè¡æ¿åºåã«åãããŠããŸã:æåªçãšé«ç¥çã§ããååœã¯ããã®èªç¶ã®çŸããã§ç¥ãããŠããŸããååœã¯ããã®èªç¶çŸãæåçæ¯èŠ³ã§ç¥ãããåœå
ã§ãææ°ã®èгå
å°ãšãªã£ãŠããŸããååœã«ã¯ãæ¥æ¬æå€§ã®æ¹ã§ããååœã«ã«ã¹ããçŸããæµ·å²ž
------------------------------------------------
ããã»ã©å質ã®é«ãåçã§ã¯ãããŸãããããã¡ã€ã³ãã¥ãŒãã³ã°åãšæ¯ã¹ãã°è³ªåãšé¢ä¿ã®ãªãå å®¹ãæžã£ãŠãããšæããŸãã
ãŸãšã
- Deep Speedã®offload_optimizeræ©èœã䜿ãã°ãVRAM 40GBã®GPU1æã§ã3.6Bãµã€ãºã®LLMããã«ãã¡ã€ã³ãã¥ãŒãã³ã°ã§ãã
- Flash Attentionã䜵çšããã°ãVRAM䜿çšéãæããããé·ãç³»åé·ã§ã¢ãã«ãåŠç¿ãããããšãå¯èœ
ãšããããšã確ãããŸããã
å°ããªããŒã¿ã»ãããšã¯èšãã1ãšããã¯ããã30åãããããã«åŠç¿ã§ããŸããã®ã§ãæ°è»œã«ãããããªå®éšãè¡ãããšãã§ãããã§ãã