Share
Embed
AIアプリ Dojo #1 [入門者歓迎] GPUを活用して生成系AIに触れてみよう
https://ibm-developer.connpass.com/event/285217/ のセッション資料です。
生成系AIが一般に広まりつつある中で、企業内で独自の生成系AIを動かせる環境を作りたいというニーズが高まっています。 このセッションでは、NVIDIAのGPUを利用して、既存の生成系AIモデルを動かしてみる、という観点で、日本語での対話モデル、Stable Diffusionによる画像生成を実行するためにどうすればいいのか、モデルが実行される時にCPU、メモリ、GPUがどのように動くのかについて、デモを交えてご紹介します。加えて、IBM Cloudから利用できるGPUサーバーについてもご紹介します。
Akira Onishi (IBM) PRO
June 15, 2023
Transcript
30 slides
-
ຊΞΠɾϏʔɾΤϜגࣜձࣾ ςΫϊϩδʔࣄۀຊ෦ ΧελϚʔɾαΫηε ϓϦϯγύϧɾϚωʔδϟʔ ݉ 8JOEPXT$POUBJOFS1PSUJOH1SPHSBNਪਐϦʔμʔ େ জ "LJSB0OJTIJ!JCNDPN 5XJUUFS!POJBL
IUUQTXXXGBDFCPPLDPNBLJSBPOJTIJ IUUQTXXXMJOLFEJODPNJOPOJBL "*ΞϓϦ %PKPୈճ <ೖऀܴ> (16Λ׆༻ͯ͠ੜܥ"*ʹ৮ΕͯΈΑ͏ -
ࣗݾհ 1SPQFSUZ 7BMVF ࢯ໊ େ জ 5XJUUFS-JOLFE*O POJBL *5ۀքྺ
ϚΠϒʔϜ μΠΤοτ )BTI5BH ͍͍Ͷ͐੩Ԭੜ׆ ࠲ӈͷ ౿·Εͯͳ্ཱ͓͕ͪΔಓͷ Α͘͏ٕ มͰࣗΛϙδςΟϒʹ IUUQTXXXGBDFCPPLDPNBLJSBPOJTIJ 'BDFCPPLʮ͓ʹ͋͘ʯͰݕࡧ -
ࠓͷ 8JOEPXTͱ/7*%*"(16Λར༻ͯ͠ɺެ։͞Ε͍ͯΔϞσϧΛಈ͔͢ 1$ϋʔυΣΞͱιϑτΣΞ͕ͲͷΑ͏ʹܨ͕͍ͬͯΔ͔ΛΔ ϩʔΧϧϋʔυΣΞ 8JOEPXT 1ZUIPO 1Z5PSDI $6%" ରܕ"* ΞϓϦ
ը૾ੜ ΞϓϦ *#.$MPVE্ͷϕΞϝλϧ 8JOEPXT4FSWFS 1ZUIPO 1Z5PSDI $6%" ରܕ"* ΞϓϦ ը૾ੜ ΞϓϦ -
"*ͱର͢ΔαʔϏεͷߏ 8FCϒϥβ ΞϓϦ 8FCαΠτ 8FC "1* αʔϏε AIモデル 計算処理 ࠓ͜͜ͷ
͜ͷܭࢉΛ "*ਪॲཧͱݴ͏ -
"*ֶशͱ"*ਪΛ͚ͯߟ͑Α͏ "*ֶश Ϟσϧͷ࡞ɺվྑ "*ਪ ϞσϧΛར༻ͨ͠ܭࢉ ֶश σʔλ ਂֶश ʢܭࢉʣ ཧతͳԾઆɺݚڀɺ
࣮ূ͔Βͷཪ͚ େنͳܭࢉࢿݯ )1$)JHI1FSGPSNBODF $PNQVUJOH "*Ϟσϧ "*ਪʹదͨ͠ ίϯϐϡʔλʔ ඞཁͳࢿ "*ਪʹదͨ͠ 04ɺϥϯλΠϜ "*ϞσϧΛͬͨܭࢉ ϞσϧʹΑΔ࣮ݧɺݕূ "*ίϛϡχςΟͷϥΠϒϥϦΛར༻ͯ͠ ୯ମͰ࢝ΊΒΕΔ සൟʹߋ৽͕ൃੜ͢ΔલఏͰͷ ։ൃɾӡ༻͕ཧత ϑΟʔυόοΫ ڊେͳσʔλϨΠΫϋεɺ σʔλαΠΤϯςΟετɺ )1$ڥͷࢿ͕ඞཁ IUUQTIVHHJOHGBDFDP -
"*ਪͷ࣮ߦڥ IUUQTQZQJPSH IUUQTIVHHJOHGBDFDP ίϯϐϡʔλʔ 8JOEPXT-JOVY04 1ZUIPO 1Z5PSDI ͳͲ $16 (16ϝϞϦ
ϝϞϦ (16 ϝϞϦ (16ϝϞϦ /7.F 44% (16υϥΠό (1(16ԋࢉϥΠϒϥϦ "*ϞσϧΛར༻ͨ͠ΞϓϦ ϋʔυΣΞநԽϨΠϠʔ )BSEXBSF"CTUSBDUJPO-BZFS $IJQ ηοτ /FUXPSL *OUFSGBDF طଘͷ"*Ϟσϧ ࢲ͕࣮ͨͪ͢Δਪ༻ͷίʔυ "*ϞσϧΛͬͨܭࢉ طଘͷϥΠϒϥϦ IUUQTXXXOWJEJBDPNKBKQ ిݯϢχοτ -
ߦྻͱϕΫτϧͷੵɺ̎ͭͷߦྻͷੵ 𝑎!! ⋯ 𝑎!" ⋮ ⋱ ⋮ 𝑎#! ⋯ 𝑎#"
𝑝! ⋮ 𝑝" = ? 𝑎!! ⋯ 𝑎!" ⋮ ⋱ ⋮ 𝑎#! ⋯ 𝑎#" 𝑝!! ⋯ 𝑝!$ ⋮ ⋱ ⋮ 𝑝"! ⋯ 𝑝"$ = ? ͜ΕΒͷܭࢉࣗମɺ୯७ͳϧʔϓॲཧͰղܾͰ͖Δ O N Jͷ͕େ͖͘ͳΕɺ ܭࢉճ͞Βʹ૿͑Δ -
ྫ/7*%*"(F'PSDF359 https://www.gainward.com/main/vgapro.php?id=1162&lang=jp /7*%*""EB-PWFMBDFʢΤΠμɾϥϒϨεʣ "SDIJUFDUVSF https://www.nvidia.com/ja-jp/geforce/ada-lovelace-architecture/ 主なスペック トランジスタ数 763億 CUDA Core
(シェーダプロセッサ) 数 16,384 Tensor Core数 512 RT Core数 128 GPU クロック 2.23GHz (ブースト時 2.52GHz) TDP 450W PCIe 4.0接続 https://www.4gamer.net/games/656/G065603/20221010003/ -
/7*%*"(16υϥΠόͷΠϯετʔϧྫ ྫ*#.$MPVE্ͷϕΞϝλϧαʔόʔʹ/7*%*"5FTMB5ΛΈࠐΜͩڥ NVIDIA Tesla T4: https://www.nvidia.com/ja-jp/data-center/tesla-t4/ GPUメモリ 16GB, 消費電⼒ 70W
CUDAコア: 2,560 Turing Tensorコア: 320 FP32 8.1 TFLOPS -
128GB/2 = 64GBを 共有GPUメモリとして利⽤ $16ɺ(16ɺͦΕͧΕͷϝϞϦ CPU AMD Ryzen 9 5950X
DDR4 32GBメモリ DDR4 32GBメモリ DDR4 32GBメモリ DDR4 32GBメモリ ྫ݄ʹൃച͞Εͨ".%3Z[FO9ͱ(#%%3ϝϞϦɺ(16ΛΈ߹Θͤͨ߹ GPU NVIDIA GeForce RTX 4090 PCIe 4.0 x 16 GPU⽤GDDR6X 24GB メモリ -
$6%"ʹΑΔܭࢉͷྲྀΕʢͬ͘͟Γͱʣ ܭࢉʹ͏σʔλΛ$16ଆͷϝϞϦ͔Β (16ଆͷϝϞϦʹίϐʔ $16͔Β(16ܭࢉॲཧΛࢦࣔ (16ͰฒྻܭࢉΛ࣮ߦ (16༻ϝϞϦ͔Β݁ՌΛ$16ଆͷϝϞϦʹίϐʔ
˞(16্Ͱܭࢉॲཧ͔࣮͠ߦͰ͖ͳ͍ͨΊɺ ϑΝΠϧΞΫηεσʔλϕʔεΞΫηε $16ଆͰܭࢉͷࣄલɾࣄޙʹॲཧ͢Δ͜ͱ -
ຊޠಛԽͷݴޠϞσϧΛ࣮ߦͯ͠ΈΔ ڥ8JOEPXT1SP 1ZUPSDI $6%" /7*%*"(F'PSDF359 (#ϝϞϦ ڥ8JOEPXT4FSWFS 1ZUPSDI $6%" /7*%*"5FTMB5
(#ϝϞϦ ԯύϥϝʔλຊޠର(15ݴޠϞσϧ IUUQTIVHHJOHGBDFDPSJOOBKBQBOFTFHQUOFPYCJOTUSVDUJPOTGU -
import torch import time from transformers import AutoTokenizer, AutoModelForCausalLM prompt_base
= "ユーザー: {}<NL>システム: " start = time.perf_counter() tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft", use_fast=False) end = time.perf_counter() print("Tokenizer loaded:"+str(end-start)) start = time.perf_counter() model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft") #GPUメモリが12-16GBの場合、float16でなんとかメモリ内に収める #model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft", torch_dtype=torch.float16) end = time.perf_counter() print("CausalLM loaded:"+str(end-start)) if torch.cuda.is_available(): model = model.to("cuda") print ("cuda is available") def encoding(prompt): start = time.perf_counter() token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt") with torch.no_grad(): output_ids = model.generate( token_ids.to(model.device), do_sample=True, max_new_tokens=256, temperature=0.9, top_k=50, repetition_penalty=1.0, pad_token_id=tokenizer.pad_token_id, bos_token_id=tokenizer.bos_token_id, eos_token_id=tokenizer.eos_token_id ) output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1):]) output = output.replace("<NL>", "¥n") end = time.perf_counter() print("Encoding completed:"+str(end-start)) return output #続き def do_conversation(): text = input("Neox-3.6b>") if text == "end": return False prompt = prompt_base.format(text) result = encoding(prompt) print(result) return True while True: res = do_conversation() if res == False: break -
*#.$MPVE(164FSWFS ϕΞϝλϧ (16ֹ݄՝ۚ /7*%*"5 1 7 ԾϚγϯ 71$(FO (16࣌ؒ՝ۚ
/7*%*"7 ಛผจʹΑΓ" ߏ ͷఏڙ͋Γ ˞ৄࡉ4VQQPSU$BTFͰ͓͍߹Θ͍ͤͩ͘͞ https://www.ibm.com/cloud/gpu -
ϫʔΫγϣοϓɺηογϣϯɺ͓Αͼࢿྉɺ*#.·ͨηογϣϯൃදऀʹΑͬͯ४උ͞ΕɺͦΕͧΕಠࣗͷݟղΛөͨ͠ͷͰ͢ɻͦΕΒใ ఏڙͷతͷΈͰఏڙ͞Ε͓ͯΓɺ͍͔ͳΔࢀՃऀʹରͯ͠๏త·ͨͦͷଞͷࢦಋॿݴΛҙਤͨ͠ͷͰͳ͘ɺ·ͨͦͷΑ͏ͳ݁ՌΛੜΉ ͷͰ͋Γ·ͤΜɻຊߨԋࢿྉʹؚ·Ε͍ͯΔใʹ͍ͭͯɺશੑͱਖ਼֬ੑΛظ͢ΔΑ͏ྗ͠·͕ͨ͠ɺʮݱঢ়ͷ··ʯఏڙ͞Εɺ໌ࣔ·ͨ҉ ࣔʹ͔͔ΘΒ͍͔ͣͳΔอূΘͳ͍ͷͱ͠·͢ɻຊߨԋࢿྉ·ͨͦͷଞͷࢿྉͷ༻ʹΑͬͯɺ͋Δ͍ͦͷଞͷؔ࿈ʹΑͬͯɺ͍͔ͳΔଛ ͕ੜͨ͡߹ɺ*#.ΛෛΘͳ͍ͷͱ͠·͢ɻຊߨԋࢿྉʹؚ·Ε͍ͯΔ༰ɺ*#.·ͨͦͷαϓϥΠϠʔϥΠηϯεަऀ͔Β͍͔ͳ Δอূ·ͨද໌ΛҾ͖ͩ͢͜ͱΛҙਤͨ͠ͷͰɺ*#.ιϑτΣΞͷ༻Λنఆ͢Δద༻ϥΠηϯεܖͷ߲Λมߋ͢Δ͜ͱΛҙਤͨ͠ͷͰ ͳ͘ɺ·ͨͦͷΑ͏ͳ݁ՌΛੜΉͷͰ͋Γ·ͤΜɻ ຊߨԋࢿྉͰ*#.ɺϓϩάϥϜɺ·ͨαʔϏεʹݴٴ͍ͯͯ͠ɺ*#.͕Ӧۀ׆ಈΛߦ͍ͬͯΔͯ͢ͷࠃͰͦΕΒ͕༻ՄೳͰ͋Δ͜ͱΛ҉ࣔ ͢ΔͷͰ͋Γ·ͤΜɻຊߨԋࢿྉͰݴٴ͍ͯ͠ΔϦϦʔεػೳɺࢢػձ·ͨͦͷଞͷཁҼʹج͍ͮͯ*#.ಠࣗͷܾఆݖΛͬ ͍ͯͭͰมߋͰ͖Δͷͱ͠ɺ͍͔ͳΔํ๏ʹ͓͍ͯকདྷͷ·ͨػೳ͕༻ՄೳʹͳΔͱ֬͢Δ͜ͱΛҙਤͨ͠ͷͰ͋Γ·ͤΜɻຊߨ
ԋࢿྉʹؚ·Ε͍ͯΔ༰ɺࢀՃऀ͕։࢝͢Δ׆ಈʹΑͬͯಛఆͷൢചɺച্ߴͷ্ɺ·ͨͦͷଞͷ݁Ռ͕ੜ͡Δͱड़Δɺ·ͨ҉ࣔ͢Δ͜ͱ Λҙਤͨ͠ͷͰɺ·ͨͦͷΑ͏ͳ݁ՌΛੜΉͷͰ͋Γ·ͤΜɻύϑΥʔϚϯεɺཧ͞Εͨڥʹ͓͍ͯඪ४తͳ*#.ϕϯνϚʔΫΛ༻͠ ͨଌఆͱ༧ଌʹج͍͍ͮͯ·͢ɻϢʔβʔ͕ܦݧ͢Δ࣮ࡍͷεϧʔϓοτύϑΥʔϚϯεɺϢʔβʔͷδϣϒɾετϦʔϜʹ͓͚ΔϚϧνϓϩάϥ ϛϯάͷྔɺೖग़ྗߏɺετϨʔδߏɺ͓Αͼॲཧ͞ΕΔϫʔΫϩʔυͳͲͷߟྀࣄ߲ΛؚΉɺଟ͘ͷཁҼʹԠͯ͡มԽ͠·͢ɻ͕ͨͬͯ͠ɺ ݸʑͷϢʔβʔ͕͜͜Ͱड़ΒΕ͍ͯΔͷͱಉ༷ͷ݁ՌΛಘΒΕΔͱ֬͢ΔͷͰ͋Γ·ͤΜɻ هड़͞Ε͍ͯΔͯ͢ͷ͓٬༷ࣄྫɺͦΕΒͷ͓٬༷͕ͲͷΑ͏ʹ*#.Λ༻͔ͨ͠ɺ·ͨͦΕΒͷ͓٬༷͕ୡͨ݁͠Ռͷ࣮ྫͱͯࣔ͠͞Εͨ ͷͰ͢ɻ࣮ࡍͷڥίετ͓ΑͼύϑΥʔϚϯεಛੑɺ͓٬༷͝ͱʹҟͳΔ߹͕͋Γ·͢ɻ *#.ɺ*#.ϩΰɺJCNDPNɺ*#.$MPVEɺ*#.$MPVE1BLTɺੈքͷଟ͘ͷࠃͰొ͞Εͨ*OUFSOBUJPOBM#VTJOFTT.BDIJOFT$PSQPSBUJPOͷඪͰ͢ɻ ଞͷ໊͓ΑͼαʔϏε໊ɺͦΕͧΕ*#.·֤ͨࣾͷඪͰ͋Δ߹͕͋Γ·͢ɻݱ࣌Ͱͷ*#.ͷඪϦετʹ͍ͭͯɺ XXXJCNDPNMFHBMDPQZUSBEFTIUNMΛ͝ཡ͍ͩ͘͞ɻ .JDSPTPGU 8JOEPXT 8JOEPXT4FSWFS /&5'SBNFXPSL /&5 /&5$PSFɺ.JDSPTPGU$PSQPSBUJPOͷඪ·ͨొඪͰ͢ɻ /7*%*" /7*%*"ϩΰ /7*%*"$6%" /7*%*"$PSQPSBUJPOͷͷඪ·ͨొඪͰ͢ɻ