0
0

富岳でSuPar-UniDicをムリヤリ動かすには

Posted at

昨日の記事で書いたSuPar-UniDicによる係り受けプログラムを、スーパーコンピュータ「富岳」のPyTorch-1.13.0で動かすことを試みた。しかし、富岳のPyTorch-1.13.0はコンパイル時にUSE_LAPACK=1を指定していないらしく、torch.nn.init.orthogonal_()まわりで

  File "/vol0004/apps/oss/spack-v0.19/opt/spack/linux-rhel8-a64fx/fj-4.8.1/py-torch-1.13.0-glqavnhys6plsjklw2bp3tkkh5ysyrqh/lib/python3.10/site-packages/torch/nn/init.py", line 484, in orthogonal_
    q, r = torch.linalg.qr(flattened)
RuntimeError: Calling torch.geqrf on a CPU tensor requires compiling PyTorch with LAPACK. Please use PyTorch built with LAPACK support.

という悲しいエラーが出て、動かすことができなかった。仕方ないので、富岳のPyTorchを最新のPyTorch-2.2.0に入れ替えた上、TOKENIZERS_PARALLELISM=falsetokenizerをなだめつつ、SuPar-UniDicを動かすことにした。

#! /bin/bash
#PJM -L rscgrp=small
#PJM -L elapse=1:00:00
#PJM -L node=1
#PJM -j
#PJM -S

. /vol0004/apps/oss/spack/share/spack/setup-env.sh
spack load py-numpy@1.23.4/hcqp4u5
G=`id | sed 's/^.*gid=[0-9]*(\([^)]*\)).*$/\1/'`
set `ls -d /vol*/$G /vol*/data/$G` $HOME
export PYTHONUSERBASE=$1/SuPar-UniDic
export PATH=$PYTHONUSERBASE/bin:$PATH
export TMPDIR=$PYTHONUSERBASE/tmp
mkdir -p $TMPDIR
pip3 install -U torch typing_extensions --user
pip3 install -U suparunidic --user

P=$TMPDIR/suparunidic.$PJM_JOBID.$$.py
cat << 'EOF' > $P
import suparunidic
nlp=suparunidic.load()
doc=nlp("吾輩はここで始めて人間というものを見た")
import deplacy
print(deplacy.to_conllu(doc))
deplacy.render(doc,Japanese=True)
print("\n")
from suparunidic import bunsetu_span,bunsetu_spans
from deplacy.deprelja import deprelja
for b in bunsetu_spans(doc):
  for t in b.lefts:
    print(bunsetu_span(t).text,f"-({deprelja[t.dep_]})->",b.text)
EOF
env TOKENIZERS_PARALLELISM=false python3 $P

富岳のログインノードからpjsubしてみたところ、ジョブ待ち・インストール・ダウンロード等も含め、20分ほどで以下の結果が得られた。

1	吾輩	我が輩	PRON	代名詞	_	12	nsubj	_	SpaceAfter=No|Translit=ワガハイ
2	は	は	ADP	助詞-係助詞	_	1	case	_	SpaceAfter=No|Translit=ワ
3	ここ	此処	PRON	代名詞	_	5	obl	_	SpaceAfter=No|Translit=ココ
4	で	で	ADP	助詞-格助詞	_	3	case	_	SpaceAfter=No|Translit=デ
5	始め	始める	VERB	動詞-非自立可能	_	12	advcl	_	SpaceAfter=No|Translit=ハジメ
6	て	て	SCONJ	助詞-接続助詞	_	5	mark	_	SpaceAfter=No|Translit=テ
7	人間	人間	NOUN	名詞-普通名詞-一般	_	9	obl	_	SpaceAfter=No|Translit=ニンゲン
8	と	と	ADP	助詞-格助詞	_	7	case	_	SpaceAfter=No|Translit=ト
9	いう	言う	VERB	動詞-一般	_	10	acl	_	SpaceAfter=No|Translit=ユー
10	もの	物	NOUN	名詞-普通名詞-サ変可能	_	12	obj	_	SpaceAfter=No|Translit=モノ
11	を	を	ADP	助詞-格助詞	_	10	case	_	SpaceAfter=No|Translit=オ
12	見	見る	VERB	動詞-非自立可能	_	0	ROOT	_	SpaceAfter=No|Translit=ミ
13	た	た	AUX	助動詞	_	12	aux	_	SpaceAfter=No|Translit=タ


吾輩 PRON  ═╗<════════╗ nsubj(主語)
は   ADP   <╝         ║ case(格表示)
ここ PRON  ═╗<╗       ║ obl(斜格補語)
で   ADP   <╝ ║       ║ case(格表示)
始め VERB  ═╗═╝<════╗ ║ advcl(連用修飾節)
て   SCONJ <╝       ║ ║ mark(標識)
人間 NOUN  ═╗<╗     ║ ║ obl(斜格補語)
と   ADP   <╝ ║     ║ ║ case(格表示)
いう VERB  ═══╝<╗   ║ ║ acl(連体修飾節)
もの NOUN  ═╗═══╝<╗ ║ ║ obj(目的語)
を   ADP   <╝     ║ ║ ║ case(格表示)
見   VERB  ═╗═════╝═╝═╝ ROOT(親)
た   AUX   <╝           aux(動詞補助成分)


ここで -(斜格補語)-> 始めて
人間と -(斜格補語)-> いう
いう -(連体修飾節)-> ものを
吾輩は -(主語)-> 見た
始めて -(連用修飾節)-> 見た
ものを -(目的語)-> 見た

単語間係り受け二文節間係り受けも、ちゃんと解析できているようだ。ただ、このやり方だと、manylinux2014_aarch64のバイナリをそのまま使ってしまうため、富岳のa64fxがイマイチ生かせていない。また、rustのスレッド周りを避けてしまっているので、tokenizersが遅くなってしまっている。py-torchpy-tokenizersの最新版をfcc(富岳のgccもどき)に合わせつつ、USE_LAPACK=1spack installすればいいのだろうけど、ちょっと私の手には余る感じだ。誰か代わりにやってくれないかなあ。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0