IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 株式会社デンソーの特許一覧

<>
  • 特開-情報処理装置および情報処理方法 図1
  • 特開-情報処理装置および情報処理方法 図2
  • 特開-情報処理装置および情報処理方法 図3
  • 特開-情報処理装置および情報処理方法 図4
  • 特開-情報処理装置および情報処理方法 図5
  • 特開-情報処理装置および情報処理方法 図6
  • 特開-情報処理装置および情報処理方法 図7
  • 特開-情報処理装置および情報処理方法 図8
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024127317
(43)【公開日】2024-09-20
(54)【発明の名称】情報処理装置および情報処理方法
(51)【国際特許分類】
   G06F 17/16 20060101AFI20240912BHJP
   G06F 9/38 20180101ALI20240912BHJP
   G06N 3/063 20230101ALI20240912BHJP
【FI】
G06F17/16 C
G06F9/38 370C
G06N3/063
【審査請求】未請求
【請求項の数】7
【出願形態】OL
(21)【出願番号】P 2023036400
(22)【出願日】2023-03-09
(71)【出願人】
【識別番号】000004260
【氏名又は名称】株式会社デンソー
(74)【代理人】
【識別番号】100113549
【弁理士】
【氏名又は名称】鈴木 守
(74)【代理人】
【識別番号】100115808
【弁理士】
【氏名又は名称】加藤 真司
(72)【発明者】
【氏名】香取 大輔
【テーマコード(参考)】
5B013
5B056
【Fターム(参考)】
5B013DD03
5B056BB31
5B056DD14
(57)【要約】      (修正有)
【課題】データの転送効率の良い情報処理装置を提供する。
【解決手段】情報処理装置1は、テンソルデータを複数のタイルに分割してニューラルネットワークによる演算処理を行う情報処理装置であって、テンソルデータを記憶した主記憶装置10と、前記主記憶装置に記憶されたテンソルデータをメモリ22に転送する転送処理部30と、前記メモリからテンソルデータを読み出してニューラルネットワークの演算処理を行う演算装置21とを備え、前記転送処理部は、ニューラルネットワークによる演算処理の内容に応じてあらかじめ定められたタイルのグループを単位として、前記主記憶装置からテンソルデータを読み出してバーストバッファ31に一時保存し、タイルの単位で前記バーストバッファからメモリにテンソルデータを転送する構成を有する。
【選択図】図1
【特許請求の範囲】
【請求項1】
テンソルデータを複数のタイルに分割してニューラルネットワークによる演算処理を行う情報処理装置(1)であって、
テンソルデータを記憶した主記憶装置(10)と、
前記主記憶装置に記憶されたテンソルデータをメモリ(22)に転送する転送処理部(30)と、
前記メモリからテンソルデータを読み出してニューラルネットワークの演算処理を行う演算装置(21)と、
を備え、
前記転送処理部は、ニューラルネットワークによる演算処理の内容に応じてあらかじめ定められたタイルのグループを単位として、前記主記憶装置からテンソルデータを読み出してバーストバッファ(31)に一時保存し、タイルの単位で前記バーストバッファからメモリにテンソルデータを転送する、情報処理装置。
【請求項2】
前記グループは、ニューラルネットワークの演算処理の処理方向において隣接する複数のタイルによって構成される、請求項1に記載の情報処理装置。
【請求項3】
前記グループには、前記バーストバッファのサイズ以下となる最大個数のタイルを含む請求項1に記載の情報処理装置。
【請求項4】
前記グループには、前記バーストバッファのサイズ以下となる個数であって、かつ、前記グループは、前記テンソルデータの読み出し方向におけるデータに対するメモリのアクセス回数を最小化する個数のタイルを含む、請求項1に記載した情報処理装置。
【請求項5】
前記演算装置は、演算結果のデータを前記メモリに記憶し、
前記転送処理部は、メモリに記憶された演算結果のデータをタイル単位で読み出してバーストバッファ(32)に一時保存し、前記グループの単位で前記バーストバッファから前記主記憶装置に前記演算結果のデータを転送する、請求項1に記載の情報処理装置。
【請求項6】
前記転送処理部は、第1のテンソルデータと第2のテンソルデータを1回の転送要求で転送する際には、前記第2のテンソルデータを前記バーストバッファへ書き込む際のアドレスに前記第1のテンソルデータの書き込み位置からのオフセットを与え、
当該オフセットは、前記第1のテンソルデータのグループのうち最大のデータサイズである、請求項1に記載の情報処理装置。
【請求項7】
テンソルデータを複数のタイルに分割してニューラルネットワークによる演算処理を行う情報処理方法であって、
転送処理部によって、主記憶装置に記憶されたテンソルデータをメモリに転送するステップと、
演算装置によって、前記メモリからテンソルデータを読み出してニューラルネットワークの演算処理を行うステップと、
を備え、
前記転送するステップでは、ニューラルネットワークによる演算処理の内容に応じてあらかじめ定められたタイルのグループを単位として、前記主記憶装置からテンソルデータを読み出してバーストバッファに一時保存し、タイルの単位で前記バーストバッファからメモリにテンソルデータを転送する、情報処理方法。
【発明の詳細な説明】
【技術分野】
【0001】
ニューラルネットワークの演算処理を行う情報処理装置及び情報処理方法に関する。
【背景技術】
【0002】
入力テンソルデータに対してニューラルネットワークの演算処理を行う際に、入力テンソルデータを一度に全部処理せずタイル分割して処理を行うニューラルネットワークアクセラレータが知られている。このようなニューラルネットワークアクセラレータではテンソルデータへの部分的なアクセスが発生するため、フォーマットによってはメモリアクセスが細分化されすぎてしまいアクセス性能の低下を引き起こすという問題がある。
これを改善するための既存手法として以下が挙げられる。
・ローカルな大容量SRAMストレージ(Global Buffer・Global memory)を経由する方法(非特許文献1)
・入出力に対して動的に構成を変更可能なキャッシュ経由でアクセスする方法(非特許文献2)
【先行技術文献】
【非特許文献】
【0003】
【非特許文献1】「Google の Tensor Processing Unit (TPU) で機械学習が30倍速くなるメカニズム」Google Cloud Japan Team <https://cloud.google.com/blog/ja/products/gcp/an-in-depth-look-at-googles-first-tensor-processing-unit-tpu>
【非特許文献2】Feng Liu, et.al,「CASSANN-v2: A high-performance CNN accelerator architecture with on-chip memory self-adaptive tuning」 IEICE Electronics Express, Vol.19, No.10, 1-6
【発明の概要】
【発明が解決しようとする課題】
【0004】
しかし、上述した既存手法には次のような課題があった。
(1)ローカルSRAMにデータを配置する場合、テンソルデータ全体が入りきる大きな容量が必要で面積コストが高い。
(2)キャッシュを使う場合、ラインサイズに依存するがすぐには使わないデータも含めてまとめてフェッチしてしまったり、同じデータを再フェッチして効率が低下することがあった。
【0005】
そこで、本発明は上記背景に鑑み、データの転送効率の良い情報処理装置および情報処理方法を提供することを目的とする。
【課題を解決するための手段】
【0006】
本発明は上記課題を解決するために以下の技術的手段を採用する。特許請求の範囲及びこの項に記載した括弧内の符号は、ひとつの態様として後述する実施形態に記載の具体的手段との対応関係を示す一例であって、本発明の技術的範囲を限定するものではない。
【0007】
本発明の情報処理装置は、テンソルデータを複数のタイルに分割してニューラルネットワークによる演算処理を行う情報処理装置(1)であって、テンソルデータを記憶した主記憶装置(10)と、前記主記憶装置に記憶されたテンソルデータをメモリ(22)に転送する転送処理部(30)と、前記メモリからテンソルデータを読み出してニューラルネットワークの演算処理を行う演算装置(21)とを備え、前記転送処理部は、ニューラルネットワークによる演算処理の内容に応じてあらかじめ定められたタイルのグループを単位として、前記主記憶装置からテンソルデータを読み出してバーストバッファ(31)に一時保存し、タイルの単位で前記バーストバッファからメモリにテンソルデータを転送する構成を有する。この構成により、グループの単位で複数のタイルをまとめて転送することで、バーストアクセス単位が大きくなり、転送の効率が高くなる。
【0008】
本発明の情報処理装置において、前記グループは、ニューラルネットワークの演算処理の処理方向において隣接する複数のタイルによって構成されてもよい。このように処理方向において隣接するタイルのデータを転送することで、同じデータを再フェッチする可能性がないため、バス転送の効率が良い。
【0009】
本発明の情報処理装置において、前記グループには、前記バーストバッファのサイズ以下となる最大個数のタイルを含んでもよい。この構成により、前記バーストバッファを効率良く利用することができる。
【0010】
本発明の情報処理装置において、前記グループには、前記バーストバッファのサイズ以下となる個数であって、かつ、前記グループは、前記テンソルデータの読み出し方向におけるデータに対するメモリのアクセス回数を最小化する個数のタイルを含んでもよい。
【0011】
本発明の情報処理装置において、前記演算装置は、演算結果のデータを前記メモリに記憶し、前記転送処理部は、メモリに記憶された演算結果のデータをタイル単位で読み出してバーストバッファ(32)に一時保存し、前記グループの単位で前記バーストバッファから前記主記憶装置に前記演算結果のデータを転送してもよい。この構成により、メモリから主記憶装置へのデータ転送も効率良く行える。
【0012】
本発明の情報処理装置において、前記転送処理部は、第1のテンソルデータと第2のテンソルデータを1回の転送要求で転送する際には、前記第2のテンソルデータを前記バーストバッファへ書き込む際のアドレスに前記第1のテンソルデータの書き込み位置からのオフセットを与え、当該オフセットは、前記第1のテンソルデータのグループのうち最大のデータサイズであってもよい。このように、データを書き込む際のアドレスにオフセットを与えることにより、テンソルデータごとに使用するバッファ領域を分離させ、意図しないデータの上書きを防止できる。
【0013】
本発明の情報処理方法は、テンソルデータを複数のタイルに分割してニューラルネットワークによる演算処理を行う情報処理方法であって、転送処理部によって、主記憶装置に記憶されたテンソルデータをメモリに転送するステップと、演算装置によって、前記メモリからテンソルデータを読み出してニューラルネットワークの演算処理を行うステップとを備え、前記転送するステップでは、ニューラルネットワークによる演算処理の内容に応じてあらかじめ定められたタイルのグループを単位として、前記主記憶装置からテンソルデータを読み出してバーストバッファに一時保存し、タイルの単位で前記バーストバッファからメモリにテンソルデータを転送する。
【発明の効果】
【0014】
本発明によれば、グループの単位で複数のタイルをまとめて転送することで、バーストアクセス単位が大きくなり、転送の効率が高くなる。
【図面の簡単な説明】
【0015】
図1】実施の形態の情報処理装置の構成を示す図である。
図2】テンソルデータの一例を示す図である。
図3】テンソルデータのタイル分割の例を示す図である。
図4】ブロックの例を示す図である。
図5】グルーピングについて説明するための図である。
図6】情報処理装置の動作を示すフローチャートである。
図7】(a)第1の実施の形態におけるブロックの例を示す図である。(b)第2の実施の形態におけるブロックの例を示す図である。
図8】バーストバッファのアドレス空間を示す図である。
【発明を実施するための形態】
【0016】
以下、本実施の形態の情報処理装置および情報処理方法について図面を参照して説明する。なお、以下の説明はあくまでも好ましい態様の一例を示したものであり、特許請求の範囲に記載された発明を限定する意図ではない。
【0017】
(第1の実施の形態)
図1は、実施の形態の情報処理装置1の構成を示す図である。情報処理装置1は、入力されたテンソルデータに対し、ニューラルネットワークの演算を行い、その演算結果を出力する機能を有する。情報処理装置1は、テンソルデータをタイル分割して、タイルごとにニューラルネットワークの演算処理を行う。
【0018】
情報処理装置1は、主記憶装置10と、アクセラレータ20と、主記憶装置10とアクセラレータ20との間のデータ転送を制御するDMAコントローラ30とを備えている。主記憶装置10は、情報処理装置1の外部から入力されたテンソルデータの全体を保持すると共に、アクセラレータ20での演算結果を保持する。
【0019】
アクセラレータ20は、演算処理を行う演算装置21と、演算装置21と直接やりとりするデータを記憶するローカルメモリ22と、プログラムを解釈して情報処理装置1の各構成に指示を出す制御装置23とを有している。アクセラレータ20は、ローカルメモリ22を直接読み書きして演算を行う。ローカルメモリ22には、直近の演算に必要なタイルのデータと直近の演算結果である出力タイルデータを保持する。
【0020】
DMAコントローラ30は、主記憶装置10からアクセラレータ20に転送するデータを一時的に保持するリードバッファ31と、アクセラレータ20から主記憶装置10に転送するデータを一時的に保持するライトバッファ32を有している。リードバッファ31とライトバッファ32の大きさは同じであり、両者を区別しないときは、「バーストバッファ」という。
【0021】
DMAコントローラ30は、主記憶装置10から複数のタイルのテンソルデータをまとめて読み出し(複数のタイルをまとめたグループの単位を「ブロック」という)、読み出したテンソルデータをリードバッファ31に蓄積し、タイルの単位でローカルメモリ22にテンソルデータを転送する。アクセラレータ20から主記憶装置10に演算結果を転送する場合も同様である。DMAコントローラ30は、アクセラレータ20からタイルの単位で演算結果のデータを読み出し、読み出した演算結果のデータをライトバッファ32に蓄積し、複数のタイルをまとめたブロックの単位で主記憶装置10にテンソルデータを転送する。複数のタイルをまとめたブロックの単位で転送することにより、バーストアクセス単位が長くなるので、アクセス効率が上がる。
【0022】
次に、タイルとグループについて説明する。
図2は、情報処理装置1によって処理を行うテンソルデータの一例を示す図である。テンソルデータは、画素数が高さ16、幅42の大きさを有する画像であり、図2には示していないが、RGBのそれぞれの色について同様のデータを有している。つまり、情報処理装置1で扱うテンソルデータは、高さ、幅、色の3次元のデータである。
【0023】
図3は、テンソルデータのタイル分割の例を示す図である。タイルは、情報処理装置1がニューラルネットワークの演算処理を行う際の処理単位なので、どのようなタイルに分割されるかは、情報処理装置1が実行するニューラルネットワークの演算処理によって決まる。すなわち、予め決まっている。
【0024】
本実施の形態では、テンソルデータは、タイルt1~t30の30個のタイルに分割される。情報処理装置1は、タイルt1は左端の高さと幅が3×7の領域、タイルt2はタイルt1の右隣の3×8の領域、タイルt3はタイルt1の右隣の3×8の領域、・・・である。
【0025】
図4は、グループの例を示す図である。図4に示す例では、タイルt1~t3、タイルt4~t6、タイルt7~t9、タイルt10~t12、タイルt13~t15、タイルt16~t18、タイルt19~t21、タイルt22~t24、タイルt25~t30のそれぞれがグループを構成する。グループ化されたタイルのことを「ブロック」という。
【0026】
複数のタイルをまとめたブロックとすることでバーストアクセス単位が長くなる。例えば、ブロックB1について見てみると、タイルt1,タイルt2,タイルt3ごとにアクセスすると、バーストアクセス単位はそれぞれ、7,8,8となり、メモリアクセスが細分化する。これに対し、タイルt1~t3をまとめたブロックB1の単位でアクセスするとバーストアクセス単位BAUは23となり、23バイトに一気にアクセスできる。
【0027】
ニューラルネットワークの演算処理においては、例えば、画像の左端から右方向にカーネルを移動しながら処理を行う。本実施の形態では、ブロックはニューラルネットワークの演算処理の処理方向において隣接する複数のタイルで構成されている。この構成により、すぐに使うデータをローカルメモリ22に転送することになるので、同じデータを再フェッチする可能性がないため、バス転送の効率が良い。
【0028】
次に、1つにグループに含めるタイルの数について説明する。ブロックの大きさは、DMAコントローラ30のリードバッファ31、ライトバッファ32の大きさによって決まる。ブロックの大きさは、リードバッファ31、ライトバッファ32に入りきる大きさである。すなわち、各ブロックB1~B9には、バーストバッファ31,32のサイズ以下となる最大個数のタイルを含む。
【0029】
図5は、グルーピングについて説明するための図である。図5では、タイルt1~t30の中に含まれるデータのバイト数を示している。ここでは、バーストバッファの大きさは92バイトであるとする。タイルt1~タイルt3のデータは21+24+24=69バイトであり、タイルt1~t4だと21+24+24+24=93バイトになってバーストバッファの大きさを超えてしまうので、タイルt1~t3を1つのグループとしてブロックB1を構成する。
【0030】
次に、タイルt4~t6の大きさは54バイトであり、バーストバッファより小さいので、これをグループとしブロックB2を構成する。ここで、タイルt4~t7の大きさは82バイトであり、タイルt7まで含めてもバーストバッファより小さい。タイルt7をブロックB2には含めていないのは、タイルt7をタイルt4~t6と同じグループとしてもバーストアクセス単位が長くならないからである。
【0031】
ブロックB9に含まれるタイルt25~t30は高さが1であるため、6つのタイルt25~t30のデータは41バイトであり、1つのブロックB9にグルーピングされている。
【0032】
以上のようにグループ分けしたブロックの情報は、アクセラレータ20の命令列に埋め込まれている。上述したとおり、どのようなタイルに分割するかはニューラルネットワークの演算処理が決まった時点(プログラムをコンパイルした時点)で決まっている。アクセラレータ向け命令列を生成するNNコンパイラは入出力テンソルデータサイズや対向メモリ特性などを静的に分析し、最適なバースト長が得られるようにタイルをグルーピングする。グルーピング情報はアクセレレータの命令列に埋め込まれる。
【0033】
アクセラレータ20はテンソルデータのアクセス時に、命令列に埋め込まれた情報とアクセレレータ自身が生成したアクセス対象座標情報から計算したバッファアドレスを用いてバーストバッファ31,32を読み書きすることでバッファ容量以下の任意のブロックサイズでバッファ処理を行う。
【0034】
図6は、情報処理装置1の動作を示すフローチャートである。情報処理装置1は、ニューラルネットワークによる演算の対象となるテンソルデータの入力を受け付け、入力されたテンソルデータを主記憶装置10に記憶する(S10)。情報処理装置1は、主記憶装置10に記憶されたテンソルデータをアクセラレータ20内のローカルメモリ22に転送して、ローカルメモリ22内のデータを用いて演算処理を行う。
【0035】
テンソルデータの転送を行う際には、まず、DMAコントローラ30が主記憶装置10上の入力テンソルデータの一部をブロック単位で読み出してリードバッファ31に格納する(S11)。続いて、DMAコントローラ30は、リードバッファ31からタイル単位でデータを読み出して、アクセラレータ20のローカルメモリ22に転送する(S12)
【0036】
アクセラレータ20内の演算装置21はローカルメモリ22からタイル分の入力テンソルデータを読み出して演算を行い(S13)、その処理結果をローカルメモリ22に書き戻す。
【0037】
次に、アクセラレータ20での演算処理結果のデータを主記憶装置10に転送する。演算結果のデータの転送を行う際には、まず、DMAコントローラ30が、ローカルメモリ22上の演算結果のデータをライトバッファ32に転送する(S14)。ここで、主記憶装置10から読み出したブロックのすべてのタイルの処理が終了したか否かを判定する(S15)。全タイルの処理が終了していない場合(S15でNO)、DMAコントローラ30は、リードバッファ31から1タイル分のデータをローカルメモリ22に転送し(S12)、演算装置21にてニューラルネットワークの演算処理を行い(S13)、演算結果をローカルメモリ22からライトバッファ32に転送する処理(S14)を繰り返す。
【0038】
ブロック内の全タイルの処理が終了した場合(S15でYES)、DMAコントローラ30は、ライトバッファ32に格納された演算結果のデータをブロック単位で主記憶装置10に転送する(S16)。
【0039】
次に、情報処理装置1は、テンソルデータの全データについて処理が終了したか否かを判定する(S17)。テンソルデータの全データについて処理が終了していないと判定された場合(S17でNO)、次のブロックのデータをアクセラレータ20に転送し、演算処理を行う(S11~S16)。テンソルデータの全データについて処理が終了した場合(S17でYES)、情報処理装置1は、主記憶装置10に記憶された演算結果を外部に出力する。
【0040】
本実施の形態の情報処理装置1は、DMAコントローラ30が、ブロック単位で複数のタイルをまとめて転送するので、バーストアクセス単位が大きくなり、転送の効率が高くなる。
【0041】
(第2の実施の形態)
次に、第2の実施の形態の情報処理装置について説明する。第2の実施の形態の情報処理装置の基本的な構成は、第1の実施の形態の情報処理装置1と同じであるが、第2の実施の形態の情報処理装置は、バーストアクセス単位の読み出し/書き込みの際のメモリアクセスの回数を考慮して、ブロックを規定している点が異なる。
【0042】
図7(a)及び図7(b)は、第2の実施の形態におけるグルーピングについて説明するための図である。ここでは、メモリアクセスは1回に16バイトであると仮定する。
【0043】
図7(a)は、第1の実施の形態と同じグルーピングによりブロックを形成した例を示す図である。この場合、ブロックB1のバーストアクセス単位BAUは、7+8+8=23バイトである。そうすると、ブロックB1のバーストアクセス単位について、2回のメモリアクセスを行う必要がある。ブロックB2についても同様の理由で2回のメモリアクセスが必要であり、タイルt1~t6を合わせると4回のメモリアクセスが必要である。
【0044】
第2の実施の形態では、メモリアクセスも考慮して、図7(b)のように、バーストアクセス単位BAUのデータを1回のメモリアクセスが可能な量になるように、タイルのグルーピングを行い、ブロックを構成する。これにより、タイルt1~t6におけるメモリアクセス回数を3回にすることができる。
【0045】
(第3の実施の形態)
次に、第3の実施の形態の情報処理装置について説明する。第3の実施の形態の情報処理装置の基本的な構成は、第1の実施の形態の情報処理装置1と同じであるが、複数のテンソルデータを同時に処理する点が異なる。
【0046】
例えば、テンソルデータA,B,Cがある場合に、テンソルデータAとテンソルデータBの要素ごとの加算、テンソルデータAとテンソルデータBの結合、結合したテンソルデータとテンソルデータCの要素ごとの加算等を行う場合、情報処理装置は、テンソルデータA,B,Cを同時にローカルメモリ22に置く必要がある。第3の実施の形態の情報処理装置は、このような場合に、異なるテンソルデータA,B,Cを適切にローカルメモリ22に転送する。具体的には、DMAコントローラ30は、テンソルデータA,B,Cのブロックをリードバッファ31に書き込む際に、書き込みアドレスにオフセットを設ける。
【0047】
図8は、バーストバッファのアドレス空間を示す図である。テンソルデータAのオフセットは0であり、テンソルデータBのオフセットはFb、テンソルデータCのオフセットFcとする。具体的にオフセットFbは、テンソルデータAのブロックの最大データサイズによって決める。
【0048】
例えば、テンソルデータAが図5で示したデータであるとすると、ブロックB1~B9のデータサイズはそれぞれ、B1=69、B2=54、B3=72、B4=92、B5=72、B6=92、B7=72、B8=92、B9=41である。したがって、ブロックB4,B6,B8が最大サイズで92バイトである。この場合、テンソルデータBの書き込みのオフセットFbは92である。テンソルデータBも図5で示したデータであるとすると、テンソルデータBのブロックの最大サイズも92であるので、テンソルデータCのオフセットは、92+92=184である。
【0049】
このように複数のテンソルデータを同時に転送する際には、バーストバッファへの書き込み時のアドレスにテンソルデータごとのオフセットを与えることで、バーストバッファ内の領域を分離し、意図しない上書きを防止できる。
【0050】
(変形例)
以上、本発明の情報処理装置および情報処理方法について実施の形態を挙げて詳細に説明したが、本発明は上記した実施の形態に限定されるものではない。
【0051】
上記した実施の形態では、テンソルデータのメモリレイアウトがCHWである場合を例として説明したが、メモリレイアウトがHWCの場合にも適用することができる。この場合には、ブロックは、この場合には、W方向にブロック単位でまとめて転送することに加えてチャネル方向のトランザクションも一つのバーストトランザクションにマージすることにより高速化を行う。例えば、256chの場合に、16ch区切りでマージすれば、256/16=16倍のバースト長を実現することができる。
【符号の説明】
【0052】
1 情報処理装置、10 主記憶装置、20 アクセラレータ、21 演算装置、
22 ローカルメモリ、23 制御装置、30 DMAコントローラ、
31 リードバッファ、32 ライトバッファ。
図1
図2
図3
図4
図5
図6
図7
図8