富岳のPyTorch-1.13.0でja-ginza-bert-large (β版)をムリヤリ動かすには

[昨日の記事](https://qiita.com/KoichiYasuoka/items/71b1044f2389c7b604d9)で書いたja-ginza-bert-large (β版)のプログラムを、スーパーコンピュータ「富岳」のspack0.19版python3.10に移植することを考えた。移植でツライのは[SudachiPy](https://pypi.org/project/SudachiPy/)で、富岳のrust1.60.0ではコンパイルしきれない。仕方ないので、[rustの公式サイト](https://www.rust-lang.org/ja)からnightly toolchainをダウンロードして、`RUSTFLAGS='-Z threads=8'`で[高速コンパイル](https://blog.rust-lang.org/2023/11/09/parallel-rustc.html)に挑戦することにした。

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

. /vol0004/apps/oss/spack/share/spack/setup-env.sh
spack load py-torch@1.13.0/glqavnh
G=`id | sed 's/^.*gid=[0-9]*(\([^)]*\)).*$/\1/'`
set `ls -d /vol*/$G /vol*/data/$G` $HOME
export PYTHONUSERBASE=$1/GiNZA
export TMPDIR=$PYTHONUSERBASE/tmp
export CARGO_HOME=$TMPDIR/cargo
export PATH=$PYTHONUSERBASE/bin:$CARGO_HOME/bin:$PATH
mkdir -p $TMPDIR
pip3 install -U typing-extensions setuptools setuptools-rust deplacy --user
if [ ! -f $CARGO_HOME/bin/cargo ]
then P=$TMPDIR/rustup.$PJM_JOBID.$$.sh
     curl -L https://sh.rustup.rs -o $P
     sh $P -y --no-modify-path --profile minimal --default-toolchain nightly
     ln -s /opt/FJSVxtclanga/tcsds-1.2.36/bin/fcc $CARGO_HOME/bin/gcc
fi
env RUSTFLAGS='-Z threads=8' pip3 install https://github.com/megagonlabs/ginza/releases/download/v5.1.3/ja_ginza_bert_large-5.1.3b1-py3-none-any.whl --user

P=$TMPDIR/ginza.$PJM_JOBID.$$.py
cat << 'EOF' > $P
import spacy
nlp=spacy.load("ja_ginza_bert_large")
doc=nlp("吾輩はここで始めて人間というものを見た")
import deplacy
print(deplacy.to_conllu(doc))
deplacy.render(doc,Japanese=True)
print("\n")
from ginza 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
python3 $P
```

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

```
1	吾輩	吾輩	PRON	代名詞	Reading=ワガハイ	12	nsubj	_	SpaceAfter=No|Translit=我が輩
2	は	は	ADP	助詞-係助詞	Reading=ハ	1	case	_	SpaceAfter=No
3	ここ	ここ	PRON	代名詞	Reading=ココ	5	obl	_	SpaceAfter=No|Translit=此処
4	で	で	ADP	助詞-格助詞	Reading=デ	3	case	_	SpaceAfter=No
5	始め	始める	VERB	動詞-非自立可能	Inflection=下一段-マ行;連用形-一般|Reading=ハジメ	12	advcl	_	SpaceAfter=No|Translit=始める
6	て	て	SCONJ	助詞-接続助詞	Reading=テ	5	mark	_	SpaceAfter=No
7	人間	人間	NOUN	名詞-普通名詞-一般	Reading=ニンゲン	10	nmod	_	NE=B-Mammal|SpaceAfter=No
8	と	と	ADP	助詞-格助詞	Reading=ト	7	case	_	SpaceAfter=No
9	いう	いう	VERB	動詞-一般	Inflection=五段-ワア行;連体形-一般|Reading=イウ	8	fixed	_	SpaceAfter=No|Translit=言う
10	もの	もの	NOUN	名詞-普通名詞-サ変可能	Reading=モノ	12	obj	_	SpaceAfter=No|Translit=物
11	を	を	ADP	助詞-格助詞	Reading=ヲ	10	case	_	SpaceAfter=No
12	見	見る	VERB	動詞-非自立可能	Inflection=上一段-マ行;連用形-一般|Reading=ミ	0	ROOT	_	SpaceAfter=No|Translit=見る
13	た	た	AUX	助動詞	Inflection=助動詞-タ;終止形-一般|Reading=タ	12	aux	_	SpaceAfter=No


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


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

[単語間係り受け](http://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/publications/kakariuke.html#3)も[二文節間係り受け](http://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/publications/kakariuke.html#2)も、ちゃんと解析できているようだ。ただ、[fugashi](https://pypi.org/project/fugashi/)とSudachiPyの両方をインストールする、ってどう考えても無駄なので、できれば[GiNZA](https://megagonlabs.github.io/ginza/)(というか[日本語spaCy](https://github.com/explosion/spaCy/blob/master/spacy/lang/ja/__init__.py#L231))がfugashiでも動くようになれば(実際spaCy 2.2.4あたりまではfugashiだった)、富岳で動かしやすくなるんだけどなあ。それともSudachiPyの方に、manylinux2014_aarch64のwheelをお願いする方がいいのかな。