第199回 お試しアカウント付き
並列プログラミング講習会「Wisteria実践」演習
東京⼤学情報基盤センター
塙 敏博
三⽊ 洋平
2023/2/14

講習会：Wisteria実践・演習

1ユーザアカウント• 使⽤システム： Wisteria/BDEC-01 (Wisteria)• $ ssh USERNAME@wisteria.cc.u-tokyo.ac.jp• 本講習会でのユーザ名• 利⽤者番号： tABCDE（ABCDEは，適宜書き換えてください）• 利⽤グループ： gt00

• 利⽤期限• 3/14 9:00まで有効• 注:本講習会関連の質問はhanawa[at]cc.u-tokyo.ac.jpまで• Slackで質問していただくほうがありがたいです• （講習会アカウントでは）公式の相談対応システムは使わないでください
2023/2/14

講習会：Wisteria実践・演習

2

バッチキューの設定のしかた• Wisteriaでのバッチ処理は、富⼠通のバッチシステムで管理されています。
• 以下、主要コマンドを説明します。
• ジョブの投⼊：pjsub <ジョブスクリプトファイル名>• ⾃分が投⼊したジョブの状況確認：pjstat• 投⼊ジョブの削除：pjdel <ジョブID>• バッチキューの状態を⾒る：pjstat --rsc• バッチキューの詳細構成を⾒る：pjstat --rsc -x• 投げられているジョブ数を⾒る：pjstat -b• 過去の投⼊履歴を⾒る：pjstat -H• 同時に投⼊できる数／実⾏できる数を⾒る：pjstat --limit
2023/2/14

講習会：Wisteria実践・演習

3

pjstat --rsc の実⾏画⾯例

ノードの
利⽤可能数

$ pjstat --rsc
SYSTEM: Odyssey
RSCGRP
lecture-otutorial-o

STATUS[ENABLE,START][ENABLE,START]

96
2x12x16使える
SYSTEM: Aquarius
キュー名
RSCGRP(リソース lecture-a
グループ) tutorial-a

STATUS[ENABLE,START][DISABLE,STOP]

NODE
7
2

現在使えるか2023/2/14

講習会：Wisteria実践・演習

NODE

GPU
56
16

GPUの
利⽤可能数
(Aquarius)
4

pjstat --rsc -x の実⾏画⾯例$ pjstat --rsc -x
SYSTEM: Odyssey
RSCGRPSTATUS
lecture-o[ENABLE,START]
tutorial-o[DISABLE,STOP]MIN_NODE MAX_NODE MAX_ELAPSE REMAIN_ELAPSE MEM(GiB) PROJECT
1
12 00:15:00
00:15:00
28 gt00
1
12 00:15:00--:--:-28 gt00

SYSTEM: Aquarius
RSCGRP
lecture-atutorial-a

MIN_NODE MAX_NODE AVAIL_GPU MAX_ELAPSE REMAIN_ELAPSE MEM(GiB) PROJECT
1
1
1,2,4 00:15:00
00:15:00
448 gt00
1
1
1,2,4 00:15:00--:--:-448 gt00

使える
キュー名
(リソース
グループ)
2023/2/14

STATUS[ENABLE,START][DISABLE,STOP]

現在
使えるか

ノードの
実⾏情報
講習会：Wisteria実践・演習

課⾦情報（財布）
実習では１つのみ5pjstat --rsc -b の実⾏画⾯例$ pjstat --rsc –b
SYSTEM: Odyssey
RSCGRP
lecture-otutorial-o

STATUS[ENABLE,START][DISABLE,STOP]TOTAL RUNNING QUEUED HOLD OTHER
0
0
0
0
0
0
0
0
0
0

NODE
96
2x12x16

SYSTEM: Aquarius
RSCGRP
lecture-atutorial-a

STATUS[ENABLE,START][DISABLE,STOP]TOTAL RUNNING QUEUED HOLD OTHER
0
0
0
0
0
0
0
0
0
0

NODE
7
2

使えるキュー名(リソースグループ)
2023/2/14

現在
ジョブの 実⾏しているジョブの使えるか 総数
数
講習会：Wisteria実践・演習

待たされているジョブの数

ノードの
利⽤可能数
6

moduleの指定• コンパイラ・ライブラリ等の環境をセットアップ• Odyssey向け富⼠通コンパイラ、MPIを使⽤$ module load odyssey• Aquarius向けgcc、cuda, OpenMPI(CUDA対応)を使⽤$ module load aquarius cuda ompi-cuda$ module load nvidia cuda ompi-cuda• 困った時は$ module purge
2023/2/14

講習会：Wisteria実践・演習

7

moduleの⼀覧• 現在利⽤中の環境に追加できるものを確認$ module avail---/work/opt/local/modules/modulefiles/LN/aquarius/mpi/gcc/8.3.1/ompi-cuda/4.1.1-11.4 ----gromacs/2021.2 lammps/29Oct2020…

• 全ての環境を確認$ show_module
ApplicationName
ModuleName
Node
BaseCompiler/MPI-------------------------------------------------------------------------Archiconda
archiconda3/0.2.3 odyssey
Arm Forge
forge/21.0.2
aquarius…
GROMACS
gromacs/2021.2
aquarius
gcc/8.3.1/ompi-cuda/4.1.1-11.2

2023/2/14

講習会：Wisteria実践・演習

8

サンプルプログラムの取得（1/2）• 実⾏してもらうコマンドは $ 以降に⻘字で記載しています• ターミナルへの⼊⼒が終わったら 「Enter」 キーを押してください

1. Lustreファイルシステムに移動$ cd /work/gt00/tABCDE# 下線部は⾃分のIDに変更
2. /work/gt00/share/Wisteria にあるサンプルファイルをコピー$ cp /work/gt00/share/Wisteria/*.gz .
* と .（ドット）の間に半⾓スペース
3. サンプルファイルを展開$ tar xvfz Samples-wo.tar.gz
2023/2/14

講習会：Wisteria実践・演習

9サンプルプログラムの取得（2/2）
4. Samples-wo ディレクトリに⼊る$ cd Samples-wo
5. ⾃分の使いたい⾔語のディレクトリに⼊る$ cd C# C⾔語を使⽤する場合$ cd F# Fortranを使⽤する場合
6. サンプルプログラムがあることを確認$ ls2023/2/14

講習会：Wisteria実践・演習

10

TIPS（タブ補完）• ターミナル上では[Tab]キーを⼊⼒してタブ補完を効かせながら⼊⼒すると良い• キー⼊⼒数が減るのでお得（⾃動的にtypoも減る）• ⾃動補完できる部分だけを⼊⼒するので，とりあえず[Tab]を⼊⼒した上で補っていけば良い• Windowsとは違い，候補を順番に表⽰するようなことはない• 先ほど⼊⼒してもらったコマンド群の場合：
1. $ cd /wo[Tab]/gt00/tABCDE
2. $ cp /wo[Tab]/gt00/z30105/W[Tab]/* .
3. $ tar xvfz S[Tab]4. $ cd S[Tab]2023/2/14

講習会：Wisteria実践・演習

11

ちなみに
• センター教員(zアカウント所有者)がダウンロード&ビルドしたものを以下に置いています。
/work/share• ベンチマーク• ⾃前ビルドしたツール• 有⽤なサンプル• コンテナファイル等• 動作保証、詳しい説明はありませんがご参考まで。
2023/2/14

講習会：Wisteria実践・演習

12

Streamプログラムをコンパイルしよう(1/2)
1. Samples-wo フォルダに⼊る$ cd Samples-wo
2. C⾔語： $ cd C
Fortran90⾔語： $ cd F
3. アプリ名のフォルダに⼊る$ cd stream

2023/2/14

講習会：Wisteria実践・演習

13

Streamプログラムをコンパイルしよう(2/2)
6. module loadしてmake する$ module load odyssey$ make7. 実⾏ファイル(stream)ができていることを確認する$ ls2023/2/14

講習会：Wisteria実践・演習

14

プログラムを実⾏しよう
1. streamフォルダ中で以下を実⾏する$ pjsub stream.bash
2. ⾃分の導⼊されたジョブを確認する$ pjstat3. 実⾏が終了すると、以下のファイルが⽣成される
stream.bash.XXXXXX.err
stream.bash.XXXXXX.out （XXXXXXは数字）
4. 上記の標準出⼒ファイルの中⾝を⾒てみる$ cat stream.bash.XXXXXX.out
5. エラー出⼒は以下のファイルにあるので念のため確認$ cat stream.bash.XXXXXX.err
2023/2/14

講習会：Wisteria実践・演習

15

通信性能
OSU Micro Benchmarks (Odyssey⽤)• オハイオ州⽴⼤学 D.K. Pandaのグループが開発, Version 7.0.1• インストール場所/work/share/benchmarks/Odyssey/osu-micro-benchmarks-7.0.1• 実⾏ジョブスクリプト/work/share/benchmarks/Odyssey/osu-micro-benchmarks-7.0.1/run/*.sh• 実⾏の⽅法

1. ディレクトリを作り、ジョブスクリプトをコピー$ mkdir omb-7.0.1-odyssey$ cd omb-7.0.1-odyssey$ cp /work/share/benchmarks/Odyssey/osu-microbenchmarks-7.0.1/run/*.sh .
2. ジョブ実⾏(スクリプトの修正)$ pjsub osu_latency.sh
2023/2/14

講習会：Wisteria実践・演習

16

Tea Leaf (1/2)• 熱伝導のベンチマーク• mantevoプロジェクトのミニアプリの⼀つ• http://uk-mac.github.io/TeaLeaf/• 展開$ tar xvfz TeaLeaf-wo.tar.gz$ cd TeaLeaf_ref-1.3• Wisteria-O向けバイナリのコンパイル$ make COMPILER=FJ MPI_COMPILER=mpifrtpx C_MPI_COMPILER=mpifccpx

2023/2/14

講習会：Wisteria実践・演習

17

Tea Leaf (2/2)

性能は以下の順に⾼くなるはず
フラットOMP << ハイブリッドMPI< ハイブリッド+形状指定

OpenMP+MPIハイブリッド(フラットOMP)$ pjsub tea_leaf.sh
OpenMP+MPIハイブリッド$ pjsub tea_leaf2.sh
OpenMP+MPIハイブリッド+ノード形状指定$ pjsub tea_leaf3.sh• ノード4x3形状、かつノード内4プロセス è 8x6の並びで実⾏• 実⾏時間を⽐較: (それぞれに⾏う)$ grep Wall tea_leaf.sh.XXXXX.err | tail -1
2023/2/14

講習会：Wisteria実践・演習

18

7点ステンシル

12
3• 拡散⽅程式のカーネル• ディリクレ境界条件
ü 境界では⾃⾝の値を参照• 倍精度• サイズ：256*384*384
ü A64FXが48コアのため、48*8 =384• Byte/Flop = 16/13

2023/2/14

for ( int z = 0; z < nz ; z ++) {int c =

x + y * nx + z * nx * ny ;7

int w = ( x == 0)8

int e = ( x == nx -1) ? c : c + 1;

9

int n = ( y == 0)

10

int s = ( y == ny -1) ? c : c + nx ;11

int b = ( z == 0)

12

int t = ( z == nz -1) ? c : c + nx * ny ;13

f2_t [ c ] = cc * f1_t [ c ]6

図? c : c - nx * ny ;15

+ cs * f1_t [ s ] + cn * f1_t [ n ]16+ cb * f1_t [ b ] + ct * f1_t [ t ];

る

A

呼

}

ノ

}

20

double * tmp = f1_t ;21

f1_t = f2_t ;22

f2_t = tmp ;23time += dt ;#? c : c - nx ;+ cw * f1_t [ w ] + ce * f1_t [ e ]}#? c : c - 1;

14

19

2

5

6

18

#

4

for ( int x = 0; x < nx ; x ++) {

5

1

3

for ( int y = 0; y < ny ; y ++) {17

ü 各ステップで読み込んだデータは全てキャッシュに乗ると仮定して性能評価
ü /work/gt00/share/wisteria_trial.tar.gz# pragma omp parallel for4ü ⾃⾝と前後左右上下の7点を参照して値を更新• ソースコードdo {24} while ( time + 0.5* dt < 0.1) ;講習会：Wisteria実践・演習

位

て

3
19

C⾔語版

性能評価：Odyssey 1 node

ソース：wisteria_trial/Odyssey/C
600

Throughput [GB/sec]

500

400

300

200

全最適化

新規最適化

ker0

naive

ナイーブな実装

ker1

firstTouch

ファーストタッチ適用

ker2

firstTouch_yDim

ker3

firstTouch_yzDim

ker4

firstTouch_yzDim_peelingYループに #pragma omp for
nowait を適用
ZループをCMG分割、Yループを
CMG内スレッド分割
ループピーリング適用

ker5

firstTouch_yzDim_peeling_intrinsic intrinsic実装• この問題では全体的にTrad modeが速い• clang modeでは、Intrinsicsを書くなどの処置をしないとSIMD化されない100

ü 今後のcompiler updateに期待
0
ker0

ker1

ker2

Trad mode
2023/2/14

ker3

ker4

ker5

Clang mode
講習会：Wisteria実践・演習

20

Fortran版

性能評価：Odyssey 1 node

ソース：wisteria_trial/Odyssey/F
600

Throughput [GB/sec]

500

400

300

全最適化

新規最適化

ker0

naive

ナイーブな実装

ker1

firstTouch

ファーストタッチ適用

ker2

firstTouch_noPointer

並列領域からPointer属性を排除

ker3

firstTouch_noPointer_yDim

ker4

firstTouch_noPointer_yzDim

ker5

firstTouch_noPointer_yzDim_peelingfirstTouch_noPointer_yzDim_peeli
ng_contiguous

Yループに !$omp do / !$omp end
do nowait を適用
ZループをCMG分割、Yループを
CMG内スレッド分割

ker6
200

ループピーリング適用
配列にcontiguous属性を追加• Fortran版ではTrad mode, Clang modeでほとんど
差はない

100

• Pointer属性を使う場合には注意が必要
0
ker0

ker1

ker2
Trad mode

2023/2/14

ker3

ker4

Clang mode

ker5

ker6

ü コンパイラの最適化がほとんど効かないü 左の結果は、FirstTouchの意味が無いわけではなく、Pointerのせいで効果が⾒えていないだけ

講習会：Wisteria実践・演習

21

C⾔語版

性能評価：Aquarius 1 CPU socket

ソース：wisteria_trial/Aquarius-CPU/C
140

120

Throughput [GB/sec]

100

80

60

全最適化

新規最適化

ker0

naive

ナイーブな実装

ker1

firstTouch

ファーストタッチ適用

ker2

firstTouch_yDim

ker3

firstTouch_yzDim

ker4

firstTouch_yzDim_peelingYループに #pragma omp for
nowait を適用
ZループをCMG分割、Yループを
CMG内スレッド分割
ループピーリング適用

ker5

firstTouch_yzDim_peeling_intrinsic intrinsic実装• Intel Xeon Platinum 8360Y (Ice Lake)は、socket
内で 2 numa 構成となっているため、A64FX の
CMG 向け最適化が同様に有効40• numactl --cpubind=0,1 --membind=0,1 ./a.out
20のように numactl を設定している

0
ker0
2023/2/14

ker1

ker2

ker3

ker4

• 講習会で使える lecture-a キューは CPU を共有しているため、遅くなる可能性がある

ker5
講習会：Wisteria実践・演習

22

Fortran版

性能評価：Aquarius 1 CPU socket

ソース：wisteria_trial/Aquarius-CPU/F
100

全最適化

新規最適化

ker0

naive

ナイーブな実装

ker1

firstTouch

ファーストタッチ適用

ker2

firstTouch_noPointer

並列領域からPointer属性を排除

ker3

firstTouch_noPointer_yDim

60

ker4

firstTouch_noPointer_yzDim

50

ker5

firstTouch_noPointer_yzDim_peelingfirstTouch_noPointer_yzDim_peeli
ng_contiguous

Yループに !$omp do / !$omp end
do nowait を適用
ZループをCMG分割、Yループを
CMG内スレッド分割

90
80

Throughput [GB/sec]

70

ker6

40

ループピーリング適用
配列にcontiguous属性を追加• Odysseyと⽐較すると、pointer属性の影響は⼩さい

30
20
10
0
ker0
2023/2/14

ker1

ker2

ker3

ker4

ker5

ker6
講習会：Wisteria実践・演習

23

性能評価：Aquarius 1 GPU

C⾔語版
ソース：wisteria_trial/Aquarius-GPU/C

1400

1200

Throughput [GB/sec]

1000

800

600

400

• 計測ミスを疑うほど速い
200• 上記 OpenACC 実装の時点でほぼ理想値。これ以上最適化の余地がない。（計測ミスが無ければ）

0
naive
2023/2/14

async

ü ミスが⾒つかったらご連絡ください -> hoshino ＠ cc.utokyo.ac.jp
講習会：Wisteria実践・演習

24

Fortran版

性能評価：Aquarius 1 GPU

ソース：wisteria_trial/Aquarius-GPU/F
1400

1200

Throughput [GB/sec]

1000

800

600

400

200

• C⾔語版程ではないがかなり速い

0naive
2023/2/14

async
講習会：Wisteria実践・演習

25

First Touch• 1プロセスで13スレッド以上(2 CMG以上)使う場合必須
ü 配列のメモリへの確保は、malloc時ではなくプログラム中最初に触ったタイミングで⾏われる。0番スレッドのみで初期化する場合、配列はCMG 0番に近いメモリ上に確保されるため、その他 CMG からアクセスすると遅い。=> First touchで回避。
ü export XOS_MMM_L_PAGING_POLICY=demand:demand:demand の設定も合わせて必須。この環境変数により、⾃スレッドに⼀番近いメモリ上に配列が確保される。
diffusion_ker00.c

diffusion_ker01.c• 並列領域（diffusion関数）で扱う配列に最初に触る箇所（init関数）を並列領域と同じ
2023/2/14 ように並列化する。
講習会：Wisteria実践・演習

26

Pointer 回避 (Fortranのみ）• 富⼠通Fortranコンパイラはかなり保守的なようで、ポインタ配列があるとほとんどの最適化を諦める。C pointerでもrestrictは付けた⽅がいい。
• 回避⽅法例
ü allocatable 配列を使う。
ü 関数呼び出しにより、⾒かけ上pointer属性でない配列を作る。（下図）diffusion_ker01.f90

diffusion_ker02.f90!!!中略!!!

!!!中略!!!

!!!中略!!!
!!!中略!!!

2023/2/14• 並列領域を関数化し、pointer属性を落とす
講習会：Wisteria実践・演習

27

ループ分割⼿法変更• 7点ステンシルの計算は、⼀つ隣のデータにアクセスするため、並列化すると冗⻑なメモ
リアクセスが発⽣する。=> 共有キャッシュの利⽤で効率化
diffusion_ker01.c

Z軸分割

diffusion_ker03.c

Y-Z軸分割!!!中略!!!

• 最も⼀般的な分割⽅法• コア間のメモリアクセスの距離が遠くなるので、キャッシュ効率は悪い
diffusion_ker02.c

Y軸分割

Y-Z軸分割(Y-Zdim)• 右図のイメージ• nowaitが必須• キャッシュの利⽤効率が上がる• CMG間のメモリアクセスの距
離を離しつつ、CMG内のキャッシュ効率が⾼まる• 4 MPI process + 12 OpenMP• CMG間のデータ共有が発⽣するため、複数CMGを
thread でも良い使う場合には遅くなる
2023/2/14
講習会：Wisteria実践・演習#pragma omp for (CMG分割)
for (z = 0; z < nz; z++){#pragma omp for nowait (Thread分割)
for(y = 0; y < ny; y++){※富⼠通コンパイラではこのようなOMP指⽰⽂の使い⽅はできません28

ループピーリングによる分岐削減• 7点ステンシルの計算では、境界部分の計算のために分岐が必要となる
ü ループピーリング（⽪むき）により最内ループから分岐を排除する。
ü A64FXは分岐に弱いようなので、効果的。
diffusion_ker03.c

diffusion_ker04.c• x = 0, 0 < x < nx-1, x = nx-1 に処理を分けることで、 0 < x < nx-1 の区間では分岐処理なく実⾏可能
2023/2/14

講習会：Wisteria実践・演習

29

contiguous属性の付与 (Fortranのみ）

diffusion_ker05.f90 のプロファイル結果• contiguous（メモリ上に連続的に確保されている）かどうかわからない配列へのアクセスでは、効率の悪いgather命令が使われてしまう。
ü contiguous属性の付与により回避可能
diffusion_ker05.f90

diffusion_ker06.f90
L1キャッシュアクセス待ちが発⽣している• 関数化された並列領域。pointer属性を落とすした上で、contiguous属性を付与。
2023/2/14

Non-contiguous gather
load instruction が⼤量に発⽣している

講習会：Wisteria実践・演習

30

A64FX必須最適化まとめ• 並列領域内のFortran Pointer徹底排除(-Knoaliasではダメ)üついでに適⽤可能な配列にはcontiguous属性を付与する
üFortranほどではないが、Cのpointerもrestrictをつけた⽅が良い• ⾃動SIMD化のための最内ループ内の整理
ü⾃作関数を展開してベタ書き（Fortran組込み関数はOK, コンパイラの機能によるインライン展開はNG）
üループ外に出せる分岐処理の全排除
üサイズ不明でフルアンローリングできない繰り返し処理（配列代⼊など）の排除• CMG間通信ペナルティ排除(1 プロセス/nodeのとき)üexport XOS_MMM_L_PAGING_POLICY=demand:demand:demandüFirst touchüスレッドの領域分割⽅針の変更、4プロセス/nodeへ変更• メモリ律速なカーネルでは可能な限りのデータ連続配置
2023/2/14
講習会：Wisteria実践・演習

31

通信性能
OSU Micro Benchmarks (Aquarius⽤)• オハイオ州⽴⼤学 D.K. Pandaのグループが開発, Version 7.0.1• インストール場所/work/share/benchmarks/Aquarius/osu-micro-benchmarks-7.0.1/work/share/benchmarks/Aquarius/osu-micro-benchmarks-7.0.1-ompi414（⾃前ビルドOpenMPI-4.1.4: /work/share/openmpi-4.1.4 使⽤)• 実⾏ジョブスクリプト/work/share/benchmarks/Aquarius/osu-micro-benchmarks-7.0.1/run/*.sh/work/share/benchmarks/Aquarius/osu-micro-benchmarks-7.0.1-ompi414/run/*.sh• 実⾏の⽅法 (osu-micro-benchmarks-7.0.1)

1. ディレクトリを作り、ジョブスクリプトをコピー$ mkdir omb-7.0.1-aquarius$ cd omb-7.0.1-aquarius$ cp /work/share/benchmarks/Aquarius/osu-micro-benchmarks7.0.1/run/*.sh .
2. ジョブ実⾏$ pjsub osu_latency.sh
2023/2/14

講習会：Wisteria実践・演習

32

Tea Leaf CUDA版• 熱伝導のベンチマークのCUDA版• mantevoプロジェクトのミニアプリの⼀つ• http://uk-mac.github.io/TeaLeaf/• 展開$ tar xvfz TeaLeaf_wa.tar.gz$ cd TeaLeaf_CUDA-0ecb1a474304c4ea916503fe6ef594f5d3f6703d/• Wisteria-A向けバイナリのコンパイル$ module purge; module load aquarius cuda ompi-cuda$ make COMPILER=GNU• ジョブ実⾏$ pjsub tea_leaf.sh
2023/2/14

講習会：Wisteria実践・演習

33

Singularity• Tensorflowは、ライブラリの依存性が強く、環境構築が困難è Singularity経由でDockerイメージを利⽤• ファイルサイズが⼤きいので、みなさんは実⾏はしないでください：$ singularity build tf-image.file docker://tensorflow/tensorflow:latest-gpu• https://hub.docker.com/r/tensorflow/tensorflow の latest-gpu タグからダウンロード• singularity exec /work/share/tensorflow-2.11.0-cuda11.2.sif python

スクリプト名tensorflow-2.11.0-cuda11.2.sif内のpythonを使って動作• ホストのOSはRedHat 8, コンテナでは Ubuntu 18.04.5• ホストのCUDAは11.2, コンテナでは 11.0のように違う環境で実⾏できる
2023/2/14

講習会：Wisteria実践・演習

34

MNIST学習の実⾏ (Keras+Tensorflow)• Tensorflow 2.9.1 (KerasはTensorflowに含まれる)$ module load singularity$ singularity exec --nv /work/share/tensorflow-2.11.0-cuda11.2.sif
python -c "import tensorflow as tf; print(tf.__version__,tf.keras.__version__)"2.11.0 2.11.0(GPUが使える場合は execの後に --nv を追加)

• 以下を実⾏ (コンパイルは不要！)$ pjsub keras-tf-mnist.bash• 実⾏が終了したら、以下を実⾏する$ cat keras-tf-mnist.log.XXXX
2023/1/17

スパコンプログラミング（1）、（Ⅰ）

35

MNIST by Keras+Tensorflow• https://www.tensorflow.org/tutorials/images/cnn?hl=ja• 結果はこんな感じ• Epoch: データセットで学習した回数• n/1875: 反復回数 (60000サンプル/32バッチ=1875）• Loss: （学習⽤画像の）正解との誤差• Accuracy: テスト画像での正解率… Successfully opened dynamic library libcudart.so.11.0
Epoch 1/5
1875/1875 [======…=======] - 9s 4ms/step - loss: 0.1511 - accuracy: 0.9539…
Epoch 5/5
1875/1875 [======…=======] - 8s 4ms/step - loss: 0.0219 - accuracy: 0.9935
313/313 - 0s - loss: 0.0316 - accuracy: 0.9914
0.9914000034332275

2023/2/14

講習会：Wisteria実践・演習

36