æ¥æ¬èªããŒã¯ãã€ã¶ãŒã®äœãæ¹ïŒããŒã¯ãã€ã¶ãŒåŸç·šïŒ
ã¯ããã«
ãããŸã§ãæŸå°Ÿã»å²©æŸ€ç ç©¶å®€ã®æçš¿ã§ã¯ãäœåºŠãããŒã¯ãã€ã¶ãŒã«ã€ããŠè§ŠããŠããŸãã
ååïŒããŒã¯ãã€ã¶ãŒåç·šïŒã¯ãæ¥æ¬èªããŒã¯ãã€ã¶ãŒãæºåããæå³ã«ã€ããŠè§£èª¬ããŸããããä»åã¯å®éã«ããŒã¯ãã€ã¶ãŒãã©ã®ããã«äœæããããç¹ã«
- Team JINIAC(phase1)ã«ãããtokenizerã§å·¥å€«ããç¹
- Phase2ã§å·¥å€«ãããã£ãäº
ã«ã€ããŠæžããããšæããŸãã
ãªããäžé£ã®æé ã«ã€ããŠã¯ãããŒã¯ãã€ã¶ãŒæ§ç¯ã®ãã¬ããžãšããŒã ã®åãçµã¿ç޹ä»ãTeam Kumaãã§ãã§ã«è©³ããè¿°ã¹ãããŠããŸããåèã«ãããŠãã ããã
ããŒã¯ãã€ã¶ãŒæ§ç¯ã®ãã€ãã©ã€ã³
ããŒã¿ååŸã«ã€ããŠ
ããã§ã¯ãäºååŠç¿ã«äœ¿çšããããŒã¿ãå
šé䜿çšããã¹ããã©ããè°è«ã«ãªããŸããã
確ãã«äœ¿çšããŒã¿ãå
šé䜿çšããããšã§ãäºååŠç¿ã§æªç¥èªãçºçãããªã¹ã¯ãæžããããšãã§ããŸããããããsentencepieceã®byte_fallbackãªãã·ã§ã³ãTrueã«ããããšã§æªç¥èªå¯Ÿå¿ã¯ã§ããããšãäœå質ãªããŒã¿ã»ããã«å€ãå«ãŸããèªåœããªãã¹ãæé€ãããã£ãããšãããæ¥æ¬èªãšè±èªã«ã€ããŠã¯wikipediaãããŒã¹ã«ããããšã«ããŸããã
äžæ¹ããã³ãã£ãŒèªã«ã€ããŠã¯ãããããwikipediaã®æ
å ±éãäžè¶³ããŠããããšãããåŠç¿ããŒã¿ã»ãããå
šé䜿çšããŠäœæããããšã«ããŸããã
åèãæ¥æ¬èªwikipediaã®ååŸã³ãŒãïŒgoogle colabïŒ
æ§ç¯ã«ããã£ãŠã¯ãæŸå°Ÿã»å²©æŸ€ç 究宀ããæäŸããã ãããæšæºã³ãŒããã«æ¹å€ãå ããŸããã
# ãã©ã€ãã®ããŠã³ã
from google.colab import drive
drive.mount('/content/drive')
# ããŒã¹ãšãªããã¹ã®æå®
import os
BASE_PATH = "/content/drive/MyDrive/GENIAC/WORK/tokenizer"
%cd {BASE_PATH}
!pip install wikiextractor
import logging
import os
import bz2
import json
import shutil
import requests
# ããŒã¿ã»ããããŠã³ããŒã颿°
def download_dataset(date: str, output_base: str = "output", lang: str = "ja") -> None:
filename = f"{lang}wiki-{date}-pages-articles-multistream.xml.bz2"
dump_path = os.path.join(output_base, f"tmp/wikipedia/{date}/{lang}")
os.makedirs(dump_path, exist_ok=True)
url = f"https://dumps.wikimedia.org/{lang}wiki/{date}/{filename}"
if not os.path.exists(os.path.join(dump_path, filename)):
logging.info(f"Downloading {url}")
with requests.get(url, stream=True) as r:
r.raise_for_status()
logging.info(f"Saving to {os.path.join(dump_path, filename)}")
with open(os.path.join(dump_path, filename), 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
else:
logging.info(f"File {os.path.join(dump_path, filename)} already exists")
logging.info(f"Skipping download\n")
# ãã³ãããŒã¿ãããŒã¹ãã
output_path = os.path.join(output_base, f"datasets/wikipedia/{date}/{lang}")
if os.path.exists(output_path):
shutil.rmtree(output_path)
os.makedirs(output_path)
logging.info(f"Parse and process {os.path.join(dump_path, filename)}")
# ãã³ãããŒã¿ã®ããŠã³ããŒã
input_date = "20240301" #ææ°ã®ãšãã¯ã"latest"
output_base = "dump"
lang = "ja"
status = download_dataset(input_date, output_base, lang)
# ïŒïŒ¬ãã¡ã€ã«ãããã¹ã圢åŒã«å€æ
import wikiextractor
file_name = lang + "wiki-" + input_date + "-pages-articles-multistream.xml.bz2"
dump_dir = os.path.join(output_base, f"tmp/wikipedia/{input_date}/{lang}")
dump_path = os.path.join(dump_dir, file_name)
output_path = os.path.join(output_base, f"datasets")
!python -m wikiextractor.WikiExtractor --processes 8 -o {output_path} --no-templates {dump_path}
æªç¥èªãéåŒãïŒphase1,2ã§ã®å·¥å€«ïŒ
æ¥æ¬èªã®wikipediaãããŒã¹ã«æ§ç¯ãããšãã«ã解決ããŠããããããšããããŸãããããã¯ãã»ãšãã©äœ¿çšãããªãã§ãããåèªãå«ãŸããæç« ã¯ãäºåã«çããŠãããããšããããšã§ãã
ã§ã¯ãã©ããã£ãŠãã»ãšãã©äœ¿çšãããªããåèªãç¹å®ããã°ããã§ãããïŒ
ä»åã圢æ
çŽ è§£æåšã«çšããããŠããèŸæžã䜿ããããã«ç»é²ãããŠããªãèªåœã«ã€ããŠã¯ããŒã¯ãã€ã¶ãŒæ§ç¯çšã®ããŒã¿ã»ããããéåŒãããšã«ããŸããã
䜿çšããèŸæžã«ã€ããŠã¯ãmecab-ipadic-NEologdãJuman++ã§äœ¿çšãããŠããèŸæžãUnidicãæ¯èŒããçµæãæ¯èŒçæè¿ãŸã§æŽæ°ãè¡ãããŠããUnidicã䜿çšããäºã«ããŸããã
ãŸããæªç¥èªã§ããããšã®å€å®ã¯ãfugashiãçšãããšãã«ãåè©ãè¿ããŠããªãèªãšããŸããã
åèãæªç¥èªãéåŒãã³ãŒãïŒgoogle colabïŒ
# ãã©ã€ãã®ããŠã³ã
from google.colab import drive
drive.mount('/content/drive')
# ããŒã¹ãšãªããã¹ã®æå®
import os
BASE_PATH = "/content/drive/MyDrive/GENIAC/WORK/tokenizer"
%cd {BASE_PATH}
# fugashiã®ã€ã³ã¹ããŒã«
!pip install fugashi[unidic]
!python -m unidic download
# æªç¥èªã®éåŒãåŠç
import os
import logging
import sys
logging.basicConfig(
stream=sys.stdout,
level=logging.INFO,
force=True)
def thin_out_unknown(input_path: str, output_base: str, testmode: bool) -> None:
from fugashi import Tagger
tagger = Tagger('-Owakati')
input = 0
output = 0
flag = 0
logging.info(f"testmode: {testmode}")
if testmode:
output_path = os.path.join(output_base, f"ja_wiki_thinout_test.txt")
else:
#output_path = os.path.join(output_base, f"ja_wiki_thinout.txt")
output_path = os.path.join(output_base, f"ja_wiki_filter_thinout.txt")
logging.info(f"output_path: {output_path}")
with open(output_path, 'w', encoding='utf-8') as o:
with open(input_path, 'r', encoding='utf-8') as f:
for line in f:
input += 1
for word in tagger(line):
if word.feature.lForm == None:
flag += 1
if flag == 0:
o.write(line)
output += 1
flag = 0
if input % 100000 == 0:
logging.info(f"input: {input}, output: {output}, rate: {output / input}")
if testmode:
break
logging.info(f"input: {input}, output: {output}, rate: {output / input}")
DATA_PATH = BASE_PATH + "/datasets"
text_path = DATA_PATH + "hogehoge.txt" # 䜿çšããããŒã¿ã»ããåã«å€æŽããŠãã ãã
thinout_path = os.path.join(DATA_PATH, f"thinout")
os.makedirs(thinout_path, exist_ok=True)
status = thin_out_unknown(text_path, thinout_path, testmode=False)
圢æ çŽ è§£æã䜿çšããïŒphase1ã®ã¿ïŒ
ååïŒããŒã¯ãã€ã¶ãŒåç·šïŒã®æçš¿ã§ãè¿°ã¹ãéãã圢æ
çŽ è§£æã䜿çšãããã©ããã¯ãã¡ãªãããšãã¡ãªãããååšããŸãã
çµå±ãphase1ã§ã¯ãæ¥æ¬èªãããåºåãã§åŠç¿ããããšãåªå
ãã圢æ
çŽ è§£æã䜿çšããŸããããŸããphase2ã§ã¯ãåŠç¿é床ãåªå
ãã圢æ
çŽ è§£æã¯äœ¿çšããŸããã§ããã
åèãããŒã¿ã»ããã«åèªåºåããä»äžããïŒgoogle colabïŒ
Sentencepiece ã®åå²ã MeCab ã£ãœããããåèã«äœæ
# ãã©ã€ãã®ããŠã³ã
from google.colab import drive
drive.mount('/content/drive')
# ããŒã¹ãšãªããã¹ã®æå®
import os
BASE_PATH = "/content/drive/MyDrive/GENIAC/WORK/tokenizer"
%cd {BASE_PATH}
# Mecabã®ã€ã³ã¹ããŒã«
!sudo apt install -y mecab libmecab-dev mecab-ipadic-utf8
# åãã¡æžãåŠç
!mecab -F"%M||||" -E"\n" input.txt -o output.txt
èªåœæ°ãããã€ã«ãããïŒïŒäºå調æ»ïŒ
HuggingFaceã®è§£èª¬ã§ã¯ã
倧ããªèªåœãµã€ãºã¯ãã¢ãã«ã«éåžžã«å€§ããªåã蟌ã¿è¡åãå ¥åããã³åºåã¬ã€ã€ãŒãšããŠæãããããšã匷å¶ããã¡ã¢ãªããã³æéã®è€éãã®å¢å ãåŒãèµ·ãããŸããäžè¬çã«ããã©ã³ã¹ãã©ãŒããŒã¢ãã«ã¯ãç¹ã«åäžã®èšèªã§äºåãã¬ãŒãã³ã°ãããå Žåã50,000ãè¶ ããèªåœãµã€ãºãæã€ããšã¯ã»ãšãã©ãããŸããã
ãšããèšè¿°ããããŸãããŸããå人çãªå顿èãšããŠã¯ãBERTç³»ã®ããŒã¯ãã€ã¶ãŒã®èªåœãµã€ãºã¯ããããŸã§32,000ã§ããäºãå€ãã64ãããCPUã«ãããŠãã¡ã¢ãªã®å¹ççãªå©çšãèãããšã64ã®åæ°ã§ãã32,768ãç®å®ã«ããããšã¯çè§£ã§ããŸããããããã¡ã¢ãªã®ããŒãžã³ã°ãèæ ®ãããšã65,535ãžã®æ¡åŒµã¯åœ±é¿ãå°ãªãã®ã§ã¯ãªãããšèããŸãããããã§ãèªåœæ°32,000ã48,000ã60,000ã®ïŒã€ã®ããŒã¯ãã€ã¶ãŒãäœæããäºååŠç¿éåºŠã®æ¯èŒãããŠã¿ãŸããã
å®éšæŠèŠ
- å ¥åããŒã¿ã»ãããé空æåº«ïŒæ³åŸããŒã¿ïŒæ¥æ¬èªwikipediaïŒãã£ã«ã¿æžïŒ
- 䜿çšã¢ãã«ãGPT-3 Small 125MïŒæŸå°Ÿã»å²©æŸ€ç 究宀ããæäŸããã ãããæšæºã³ãŒãããæ¹å€ããŠäœ¿çšïŒ
- 䜿çšGPUãH100 2GPU(1node)
- åèªåœããšã«6æéåŠçã宿œãåäœç¢ºèª
- å®éšã§ã®ç¢ºèªãã€ã³ã
- åŠç¿é床ïŒelapsed_ms_per_iteration,tflopsïŒ
- tflops
- loss
- GPU Memory Allocated (%)
å®éšçµæïŒæŠèŠïŒ
- åŠç¿é床ã¯ã32,000ã«æ¯ã¹48,000ãš60,000ã¯12ãã15%ã»ã©é
ã
- ïŒåèïŒïŒæéã§åã£ãiteration{ 32000 : 1410, 48000 : 1250, 60000 : 1200 }
- ïŒåèïŒtfolps(max) { 32000 : 15.886, 48000 : 15.286, 60000 : 15.136 }

- losså€ã«é¡èãªéãã¯èŠãããªã
- ïŒåèïŒïŒæéçµéæã®lm loss{ 32000 : 2.75, 48000 : 2.842, 60000 : 2.877 }
- ïŒåèïŒïŒæéçµéæã®lm loss{ 32000 : 2.75, 48000 : 2.842, 60000 : 2.877 }
- ã¡ã¢ãªç¢ºä¿ã«åœ±é¿ã¯ãªãã£ãã
以äžã®å®éšçµæãããèªåœæ°ã¯65,000ãŸã§å¢ããããšãæ³å®ããããšã«ããŸããã
èšèªããšã®èªåœæ°é åïŒphase1ã§ã®å·¥å€«ïŒ
ãã€ãã©ã€ã³ã«ããéããä»åã¯èšèªããšã®èªåœæ°ã決ããŠããŒãžããããšããææ³ããšããŸããã
ãã®æ¹æ³ã§ã¯ãããçšåºŠèªç±ã«èšèªããšã®èªåœæ°é
åãæ±ºå®ããããšãã§ããŸããããã§ãè±èªã»æ¥æ¬èªã»ãã³ãã£ãŒèªã®èªåœæ°ãæ€èšããããšã«ããŸããã
- ïŒphase1ã§ã®çµè«ïŒãTOEICæºç¹ã¬ãã«ã®è±èªãçè§£ãã倧åŠçãã¬ãã«ïŒç掻ã¬ãã«ã®ãã³ãã£ãŒèªã®èªåœæ°ãç®æã
- æ¥æ¬èªïŒ43,000èªïŒ
ãåœæåŠã®åéã§ã¯ãæ¥æ¬äººã®çè§£èªåœã¯ã倧åŠçã§43,000ïœ45,000èªãšããç ç©¶ãããã®ã§ããããåèã«ããŸãããïŒå€§åŠçã®æ¥æ¬èªã®äœ¿çšèªåœãçè§£èªåœïŒ - è±èªïŒ13,000èªïŒ
ãå€ãã®TOEIC察çã®ãµã€ãã§ã¯ãæºç¹ãåãããã«å¿ èŠãªåèªæ°ã«ã€ããŠç޹ä»ãããŠããŸãããã®äžã§ãæãå€ãåèªæ°ãæç€ºããŠããã13,000èªãåèã«ããŸããã - ãã³ãã£ãŒèªïŒ7,000èªïŒ
ãããŸãæ å ±ã¯å€ããªãã®ã§ãããããã³ãã£ãŒèªã®èªåœæ¬7000èªããšããæžç±ã販売ãããŠããããšãããçæŽ»ã¬ãã«ã®ãã³ãã£ãŒèªã7,000èªãšèšå®ããŸããã
- æ¥æ¬èªïŒ43,000èªïŒ
phase2ã§å®çŸãããã£ãããš
- ïŒphase2ã§ã®çµè«ïŒãTOEICæºç¹ã¬ãã«ã®è±èªãçè§£ããäžè¬äººãã¬ãã«ã®èªåœæ°ãç®æã
çµæçã«äœ¿çšãããªãã£ã38Bã¢ãã«ïŒ38Bã¢ãã«ã®Loss spikeã«ã€ããŠã®åçãã芧ãã ããã)ã§ã¯ãphase1ãæ¹è¯ããããŒã¯ãã€ã¶ãŒãæå ¥ããŠããŸããããã³ãã£ãŒèªãæå ¥ããªãããããã³ãã£ãŒèªçšã«ç¢ºä¿ããŠãã7,000èªã®èªåœãæ¥æ¬èªã«æ¯ãåããããšã§ãæ¥æ¬èª50,000èªïŒè±èª13,000èªã®ããŒã¯ãã€ã¶ãŒã«ãªããŸããã
Command R+ã¯ããŒã¯ãã€ã¶ãŒããããã£ãã§å®éšãããŠãããããŒã¯ã³æ°ç¢ºèªã®ããã°ã©ã ã§æ¯èŒãããšããã
| ããŒã¯ãã€ã¶ãŒ | ããŒã¯ã³æ° |
|---|---|
| LLaMA2 | 809 |
| OpenAI | 731 |
| JINIAC | 540 |
| LLaMA3 | 516 |
| ELYZA | 474 |
| tanuki 8Ã8B | 450 |
| llm-jp | 434 |
| Command R+ | 410 |
| Aya | 393 |
| phase2-38B | 329 |
ãšè¯ãå§çž®çã瀺ããŠããŸãããæ¥æ¬èªã«åŒ·ãããŒã¯ãã€ã¶ãŒãšããŠãæ«é²ç®ãããã£ãã®ã§ãããç§èªèº«ããã«ã¹ãã«ã¢ããããŠãæ¬¡ã®æ©äŒãç®æããããšèããŠããŸãã
æ±äº¬å€§åŠ æŸå°Ÿã»å²©æŸ€ç 究宀ãéå¶ããæŸå°Ÿç LLMã³ãã¥ããã£ã®LLMéçºãããžã§ã¯ã[GENIAC] ã®éçºèšé²ãæ å ±çºä¿¡ã«ãªããŸãã åçš®ãªã³ã¯ã¯ãã¡ã linktr.ee/matsuolab_community
Discussion