(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2022-07-29
(45)【発行日】2022-08-08
(54)【発明の名称】ハードウェアにおける行列乗算の実行
(51)【国際特許分類】
G06F 17/16 20060101AFI20220801BHJP
G06N 3/063 20060101ALI20220801BHJP
G06G 7/60 20060101ALI20220801BHJP
G06F 7/523 20060101ALI20220801BHJP
G06F 7/483 20060101ALI20220801BHJP
【FI】
G06F17/16 M
G06N3/063
G06G7/60
G06F7/523
G06F7/483
(21)【出願番号】P 2019551610
(86)(22)【出願日】2018-05-17
(86)【国際出願番号】 US2018033271
(87)【国際公開番号】W WO2018213636
(87)【国際公開日】2018-11-22
【審査請求日】2019-12-06
(32)【優先日】2017-05-17
(33)【優先権主張国・地域又は機関】US
【前置審査】
(73)【特許権者】
【識別番号】502208397
【氏名又は名称】グーグル エルエルシー
【氏名又は名称原語表記】Google LLC
【住所又は居所原語表記】1600 Amphitheatre Parkway 94043 Mountain View, CA U.S.A.
(74)【代理人】
【識別番号】110001195
【氏名又は名称】弁理士法人深見特許事務所
(72)【発明者】
【氏名】フェルプス,アンドリュー・エバレット
(72)【発明者】
【氏名】ジョピー,ノーマン・ポール
【審査官】坂東 博司
(56)【参考文献】
【文献】特表2007-531072(JP,A)
【文献】特開昭62-080764(JP,A)
【文献】特開2005-182785(JP,A)
【文献】米国特許出願公開第2015/0170021(US,A1)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 17/16
G06N 3/063
G06G 7/60
G06F 7/523
G06F 7/483
(57)【特許請求の範囲】
【請求項1】
ハードウェア回路を用いて行列乗算を実行する方法であって、
前記ハードウェア回路の行列計算ユニットが、活性化入力値および重み入力値を取得することを備え、前記活性化入力値および前記重み入力値の各々は第1の浮動小数点形式を有し、
前記行列計算ユニットは、複数のセルが2次元の各々に沿って結合されたシストリックアレイとして形成され、前記方法はさらに、
前記
複数のセルの各々の乗算回路が、前記活性化入力値と前記重み入力値とを乗算して積値を生成することを備え、前記積値は、前記第1の浮動小数点形式よりも精度が高く、少なくとも前記第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する第2の浮動小数点形式を有し、前記方法はさらに、
当該セルが、前記第1の浮動小数点形式よりも精度が高く、少なくとも前記第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する第3の浮動小数点形式で、
当該セルに隣接するセルから部分和値を取得することと、
当該セルの合計回路が、少なくとも前記部分和値と前記積値とを結合して、前記第3の浮動小数点形式を有する更新された部分和値を
当該セルに隣接する他のセルに送ることとを備える、ハードウェア回路を用いて行列乗算を実行する方法。
【請求項2】
浮動小数点形式の精度は、前記浮動小数点形式において仮数に対して利用可能なビットのカウントに基づいて判断され、浮動小数点形式のダイナミックレンジは、前記浮動小数点形式において指数に対して利用可能なビットのカウントに基づいて判断される、請求項1に記載の方法。
【請求項3】
前記第2の浮動小数点形式は、前記第1の浮動小数点形式と同じダイナミックレンジを有し、前記第3の浮動小数点形式は、前記第1の浮動小数点形式と同じダイナミックレンジを有する、請求項1または請求項2に記載の方法。
【請求項4】
前記第3の浮動小数点形式は、前記第2の浮動小数点形式よりも高い精度を有する、請求項1から請求項3のいずれか1項に記載の方法。
【請求項5】
前記ハードウェア回路は、複数の層を有するニューラルネットワークのために計算を実行するように構成され、
前記活性化入力値および前記重み入力値は、前記複数の層のうちのある層に関連付けられる、請求項1から請求項4のいずれか1項に記載の方法。
【請求項6】
第1の行列計算セルのために前記第3の浮動小数点形式を有する生の活性化値および生の重み値を取得することと、
前記生の活性化値を前記第1の浮動小数点形式に変換して前記活性化入力値を生成することと、
前記生の重み値を前記第1の浮動小数点形式に変換して前記重み入力値を生成することとをさらに備える、請求項1から請求項5のいずれか1項に記載の方法。
【請求項7】
前記生の活性化値を高精度で処理する要求を受け取ることと、
前記活性化入力値に対して活性化高精度値を生成することとをさらに備え、前記活性化高精度値は、前記活性化入力値と前記生の活性化値との差の尺度であり、前記方法はさらに、
前記重み入力値に対して重み高精度値を生成することを備え、前記重み高精度値は、前記重み入力値と前記生の重み値との差の尺度であり、
前記活性化入力値と前記重み入力値とを乗算して前記積値を生成することは、
前記行列計算ユニットの前記乗算回路が、
前記活性化入力値と前記重み入力値との乗算、
前記活性化入力値と前記重み高精度値との乗算、
前記重み入力値と前記活性化高精度値との乗算、および
前記活性化高精度値と前記重み高精度値との乗算を実行することと、
前記乗算の積を結合して前記積値を生成することとを含む、請求項6に記載の方法。
【請求項8】
ハードウェア回路を用いて行列乗算を実行する方法であって、
前記ハードウェア回路の行列計算ユニットが、活性化入力値および重み入力値を取得することを備え、前記活性化入力値および前記重み入力値の各々は第1の浮動小数点形式を有し、前記方法はさらに、
前記行列計算ユニットの乗算回路が、前記活性化入力値と前記重み入力値とを乗算して積値を生成することを備え、前記積値は、前記第1の浮動小数点形式よりも精度が高く、少なくとも前記第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する第2の浮動小数点形式を有し、前記方法はさらに、
前記行列計算ユニットが、前記第1の浮動小数点形式よりも精度が高く、少なくとも前記第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する第3の浮動小数点形式で、部分和値を取得することと、
前記ハードウェア回路の合計回路が、少なくとも前記部分和値と前記積値とを結合して、前記第3の浮動小数点形式を有する更新された部分和値を生成することと、
前記ハードウェア回路が
ソフトウェア命令を介して生の活性化値を高精度で処理する要求を受け取ったかどうかを判断することと、
前記ハードウェア回路が前記要求を受け取った場合に前記活性化入力値に対して活性化高精度値を生成することとをさらに備え、前記活性化高精度値は、前記活性化入力値と前記生の活性化値との差の尺度であり、前記方法はさらに、
前記ハードウェア回路が前記要求を受け取った場合に前記重み入力値に対して重み高精度値を生成することを備え、前記重み高精度値は、前記重み入力値と生の重み値との差の尺度であり、
前記活性化入力値と前記重み入力値とを乗算して前記積値を生成することは、
前記ハードウェア回路が前記要求を受け取った場合に、前記行列計算ユニットの前記乗算回路が、
前記活性化入力値と前記重み入力値との乗算、
前記活性化入力値と前記重み高精度値との乗算、
前記重み入力値と前記活性化高精度値との乗算、および
前記活性化高精度値と前記重み高精度値との乗算を実行することと、
前記乗算の積を結合して前記積値を生成することとを含む、ハードウェア回路を用いて行列乗算を実行する方法。
【請求項9】
ハードウェア回路であって、
第1のグループの動作を実行するように構成された行列計算ユニットを備え、
前記行列計算ユニットは、複数のセルが2次元の各々に沿って結合されたシストリックアレイとして形成され、前記第1のグループの動作は、
活性化入力値および重み入力値を取得することを含み、前記活性化入力値および前記重み入力値は両方とも第1の浮動小数点形式を有し、前記第1のグループの動作はさらに、
前記重み入力値を重みレジスタに格納することを含み、前記重みレジスタは前記第1の浮動小数点形式を有する値を格納するよう構成され、前記第1のグループの動作はさらに、
前記
複数のセルの各々の乗算回路を用いて、前記活性化入力値と前記重み入力値とを乗算して積値を生成することを含み、前記積値は、前記第1の浮動小数点形式よりも精度が高く、少なくとも前記第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する第2の浮動小数点形式を有し、前記第1のグループの動作はさらに、
前記第1の浮動小数点形式よりも精度が高く、少なくとも前記第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する第3の浮動小数点形式で、
当該セルに隣接するセルから部分和値を取得することと、
前記部分和値を総和レジスタに格納することとを含み、前記総和レジスタは、前記第3の浮動小数点形式を有する値を格納するように構成され、前記第1のグループの動作はさらに、
当該セルの合計回路を用いて、前記部分和値と前記積値とを結合して、前記第3の浮動小数点形式を有する更新された部分和値を
当該セルに隣接する他のセルに送ることを含む、ハードウェア回路。
【請求項10】
前記第1のグループの動作はさらに、
前記活性化入力値を活性化レジスタに格納することを含み、前記活性化レジスタは、前記第1の浮動小数点形式を有する値を格納するように構成される、請求項9に記載のハードウェア回路。
【請求項11】
前記第1のグループの動作はさらに、
前記重み入力値を重みレジスタに格納することを含み、前記重みレジスタは前記第1の浮動小数点形式を有する値を格納するよう構成される、請求項9または請求項10に記載のハードウェア回路。
【請求項12】
前記第1のグループの動作はさらに、
前記部分和値を総和レジスタに格納することを含み、前記総和レジスタは、前記第3の浮動小数点形式を有する値を格納するように構成される、請求項9から請求項11のいずれか1項に記載のハードウェア回路。
【請求項13】
前記行列計算ユニットの外部に外部の合計回路をさらに備え、前記第1のグループの動作はさらに、
生の活性化値を高精度で処理する要求を受け取ることと、
前記活性化入力値に対して活性化高精度値を生成することとを含み、前記活性化高精度値は、前記活性化入力値と前記生の活性化値との差の尺度であり、前記第1のグループの動作はさらに、
前記重み入力値に対して重み高精度値を生成することを含み、前記重み高精度値は、前記重み入力値と生の重み値との差の尺度であり、
前記活性化入力値と前記重み入力値とを乗算して前記積値を生成することは、
前記行列計算ユニットの前記乗算回路が、
前記活性化入力値と前記重み入力値との乗算、
前記活性化入力値と前記重み高精度値との乗算、
前記重み入力値と前記活性化高精度値との乗算、および
前記活性化高精度値と前記重み高精度値との乗算を実行することを含み、
前記外部の合計回路は、第2のグループの動作を実行するように構成され、前記第2のグループの動作は、
前記乗算の積を結合して前記積値を生成することを含む、請求項9から請求項12のいずれか1項に記載のハードウェア回路。
【請求項14】
ハードウェア回路であって、
第1のグループの動作を実行するように構成された行列計算ユニットを備え、前記第1のグループの動作は、
活性化入力値および重み入力値を取得することを含み、前記活性化入力値および前記重み入力値は両方とも第1の浮動小数点形式を有し、前記第1のグループの動作はさらに、
前記重み入力値を重みレジスタに格納することを含み、前記重みレジスタは前記第1の浮動小数点形式を有する値を格納するよう構成され、前記第1のグループの動作はさらに、
前記ハードウェア回路の乗算回路を用いて、前記活性化入力値と前記重み入力値とを乗算して積値を生成することを含み、前記積値は、前記第1の浮動小数点形式よりも精度が高く、少なくとも前記第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する第2の浮動小数点形式を有し、前記第1のグループの動作はさらに、
前記第1の浮動小数点形式よりも精度が高く、少なくとも前記第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する第3の浮動小数点形式で、部分和値を取得することと、
前記部分和値を総和レジスタに格納することとを含み、前記総和レジスタは、前記第3の浮動小数点形式を有する値を格納するように構成され、前記第1のグループの動作はさらに、
前記行列計算ユニットの合計回路を用いて、前記部分和値と前記積値とを結合して、前記第3の浮動小数点形式を有する更新された部分和値を生成することを含み、
前記行列計算ユニットの外部に外部の合計回路をさらに備え、前記第1のグループの動作はさらに、
前記ハードウェア回路が
ソフトウェア命令を介して生の活性化値を高精度で処理する要求を受け取ったかどうかを判断することと、
前記ハードウェア回路が前記要求を受け取った場合に前記活性化入力値に対して活性化高精度値を生成することとを含み、前記活性化高精度値は、前記活性化入力値と前記生の活性化値との差の尺度であり、前記第1のグループの動作はさらに、
前記ハードウェア回路が前記要求を受け取った場合に前記重み入力値に対して重み高精度値を生成することを含み、前記重み高精度値は、前記重み入力値と生の重み値との差の尺度であり、
前記活性化入力値と前記重み入力値とを乗算して前記積値を生成することは、前記ハードウェア回路が前記要求を受け取った場合に
前記行列計算ユニットの前記乗算回路が、
前記活性化入力値と前記重み入力値との乗算、
前記活性化入力値と前記重み高精度値との乗算、
前記重み入力値と前記活性化高精度値との乗算、および
前記活性化高精度値と前記重み高精度値との乗算を実行することを含み、
前記外部の合計回路は、第2のグループの動作を実行するように構成され、前記第2のグループの動作は、
前記乗算の積を結合して前記積値を生成することを含む、ハードウェア回路。
【請求項15】
前記ハードウェア回路を含む1つ以上のコンピュータと、前記1つ以上のコンピュータによって実行されると前記1つ以上のコンピュータに請求項1から請求項8のいずれか1項に記載の方法の動作を実行させるよう動作可能な命令を記憶する1つ以上の記憶装置とを備える、システム。
【請求項16】
前記ハードウェア回路を含む1つ以上のコンピュータによって実行されると、前記1つ以上のコンピュータに請求項1から請求項8のいずれか1項に記載の方法を実行させるためのコンピュータプログラム。
【請求項17】
請求項9から請求項14のいずれか1項に記載のハードウェア回路を含む1つ以上のコンピュータと、前記1つ以上のコンピュータによって実行されると前記1つ以上のコンピュータに前記ハードウェア回路の動作を実行させるよう動作可能な命令を記憶する1つ以上の記憶装置とを備える、システム。
【請求項18】
請求項9から請求項14のいずれか1項に記載のハードウェア回路を含む1つ以上のコンピュータによって実行されると前記1つ以上のコンピュータに前記ハードウェア回路の動作を実行させる命令を含む、コンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
背景
この明細書は、ハードウェアでのニューラルネットワーク計算の実行に関する。
【背景技術】
【0002】
ニューラルネットワークは、受け取られた入力に対する出力、たとえば分類を生成するために1つ以上の層を用いる機械学習モデルである。一部のニューラルネットワークには、出力層に加えて1つ以上の隠れ層が含まれる。各隠れ層の出力は、ネットワーク内の別の層、たとえばネットワークの次の隠れ層または出力層への入力として用いられる。ネットワークの各層は、それぞれのパラメータのセットの現在の値に従って、受信した入力から出力を生成する。
【発明の概要】
【課題を解決するための手段】
【0003】
概要
一般に、この明細書はニューラルネットワーク推論を計算する専用ハードウェア回路について記載する。
【0004】
一般に、この明細書に記載される主題の1つの革新的な局面は、ハードウェア回路を用いて行列乗算を実行する方法で具現化することができ、この方法は以下のアクション、つまり、ハードウェア回路の行列計算ユニットが、入力活性化値および重み入力値を取得することを備え、入力活性化値および重み入力値は各々第1の浮動小数点形式を有し、方法はさらに、行列計算ユニットの乗算回路が、入力活性化値と重み入力値とを乗算して積値を生成することを備え、積値は、第1の浮動小数点形式よりも精度が高く、少なくとも第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する第2の浮動小数点形式を有し、方法はさらに、行列計算ユニットが、第1の浮動小数点形式よりも精度が高く、少なくとも第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する第3の浮動小数点形式で、部分和値を取得することと、ハードウェア回路の合計回路が、少なくとも部分和値と積値とを結合して、第3の浮動小数点形式を有する更新された部分和値を生成することとを備える。
【0005】
この局面の実施形態は、以下のオプションの特徴のうちの1つ以上を含むことができる。浮動小数点形式の精度は、浮動小数点形式において仮数に対して利用可能なビットのカウントに基づいて判断することができ、浮動小数点形式のダイナミックレンジは、浮動小数点形式において指数に対して利用可能なビットのカウントに基づいて判断することができる。第2の浮動小数点形式は、第1の浮動小数点形式と同じダイナミックレンジを有することができ、第3の浮動小数点形式は、第1の浮動小数点形式と同じダイナミックレンジを有することができる。第3の浮動小数点形式は第2の浮動小数点形式よりも高い精度を有することができる。
【0006】
ハードウェア回路は、複数の層を有するニューラルネットワークのために計算を実行するように構成されることができ、入力活性化値および重み入力値は、複数の層のうちのある層に関連付けられることができる。
【0007】
この方法は、以下のアクション:第1の行列計算セルのために第3の浮動小数点形式を有する生の活性化値および生の重み値を取得することと、生の活性化値を第1の浮動小数点形式に変換して入力活性化値を生成することと、生の重み値を第1の浮動小数点形式に変換して重み入力値を生成することとを備えることができる。この方法は、さらに、以下のアクション:生の活性化値を高精度で処理する要求を受け取ることと、入力値に対して活性化高精度値を生成することとを備えることができ、活性化高精度値は、活性化入力値と生の活性化値との差の尺度であり、方法はさらに、重み入力値に対して重み高精度値を生成することを備えることができ、重み高精度値は、重み入力値と生の重み値との差の尺度である。活性化入力値と重み入力値とを乗算して積値を生成することは、以下のアクション:行列計算ユニットの乗算回路が、入力値と重み入力値との乗算、入力値と重み高精度値との乗算、重み入力値と活性化高精度値との乗算、および活性化高精度値と重み高精度値との乗算を実行することと、乗算の積を結合して積値を生成することとを備えることができる。
【0008】
この局面の他の実施形態は、各々、方法のアクションを実行するように構成された、対応するコンピュータシステム、装置、および1つ以上のコンピュータ記憶装置に記録されたコンピュータプログラムを含む。1つ以上のコンピュータのシステムは、システムにインストールされ、動作でシステムに特定のアクションを実行させるソフトウェア、ファームウェア、ハードウェアまたはそれらの任意の組合せをによって、特定の動作またはアクションを実行するよう構成することができる。1つ以上のコンピュータプログラムは、データ処理装置によって実行されると、装置にアクションを実行させる命令を含むことによって、特定の動作またはアクションを実行するよう構成することができる。
【0009】
一般に、この明細書に記載される主題の別の革新的な局面は、第1のグループの動作を実行するように構成された行列計算ユニットを備えるハードウェア回路において実施され得、第1のグループの動作は、活性化入力値および重み入力値を取得することを含み、活性化入力値および重み入力値は両方とも第1の浮動小数点形式を有し、第1のグループの動作はさらに、重み入力値を重みレジスタに格納することを含み、重みレジスタは第1の浮動小数点形式を有する値を格納するよう構成され、第1のグループの動作はさらに、ハードウェア回路の乗算回路を用いて、活性化入力値と重み入力値とを乗算して積値を生成することを含み、積値は、第1の浮動小数点形式よりも精度が高く、少なくとも第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する第2の浮動小数点形式を有し、第1のグループの動作はさらに、第1の浮動小数点形式よりも精度が高く、少なくとも第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する第3の浮動小数点形式で、部分和値を取得することと、部分和値を総和レジスタに格納することとを含み、総和レジスタは、第3の浮動小数点形式を有する値を格納するように構成され、第1のグループの動作はさらに、行列計算ユニットの合計回路を用いて、部分和値と積値とを結合して、第3の浮動小数点形式を有する更新された部分和値を生成することを含む。
【0010】
この局面の実施形態は、以下のオプションの特徴のうちの1つ以上を含むことができる。第1のグループの動作は、活性化入力値を活性化レジスタに格納することを含むことができ、活性化レジスタは、第1の浮動小数点形式を有する値を格納するように構成される。第1のグループの動作は、重み入力値を重みレジスタに格納することを含むことができ、重みレジスタは第1の浮動小数点形式を有する値を格納するよう構成される。第1のグループの動作は、部分和値を総和レジスタに格納することを含むことができ、総和レジスタは、第3の浮動小数点形式を有する値を格納するように構成される。ハードウェア回路は、行列計算ユニットの外部に外部の合計回路を含むことができる。第1のグループの動作は、生の活性化値を高精度で処理する要求を受け取ることと、入力値に対して活性化高精度値を生成することとを含むことができ、活性化高精度値は、活性化入力値と生の活性化値との差の尺度であり、第1のグループの動作はさらに、重み入力値に対して重み高精度値を生成することを含むことができ、重み高精度値は、重み入力値と生の重み値との差の尺度である。活性化入力値と重み入力値とを乗算して積値を生成することは、以下のアクション:行列計算ユニットの乗算回路が、入力値と重み入力値との乗算、入力値と重み高精度値との乗算、重み入力値と活性化高精度値との乗算、および活性化高精度値と重み高精度値との乗算を実行することを含むことができる。外部の合計回路は、乗算の積を結合して積値を生成することを含む第2のグループの動作を実行するように構成されることができる。
【0011】
この局面の他の実施形態は、各々、第1のグループの動作および/または第2のグループの動作のアクションを実行するように構成された、対応するコンピュータシステム、装置、および1つ以上のコンピュータ記憶装置に記録されたコンピュータプログラムを含む。1つ以上のコンピュータのシステムは、システムにインストールされ、動作でシステムに特定のアクションを実行させるソフトウェア、ファームウェア、ハードウェアまたはそれらの任意の組合せをによって、特定の動作またはアクションを実行するよう構成することができる。1つ以上のコンピュータプログラムは、データ処理装置によって実行されると、装置にアクションを実行させる命令を含むことによって、特定の動作またはアクションを実行するよう構成することができる。
【0012】
この明細書において記載される主題の特定の実施形態は、以下の利点の1つ以上を実現するように実現することができる。ハードウェア回路は、オーバーフローおよび/または精度の損失を抑えて行列乗算を実行できる。ハードウェア回路は、ハードウェア回路内の入力レジスタの浮動小数点形式によって与えられる精度を超える高精度で行列乗算を実行できる。ハードウェア回路は、入力行列値を浮動小数点形式において16ビットで格納していても、低減されたオーバーフローでIEEE単精度浮動小数点形式を用いて値が格納される入力行列に対して行列乗算を実行できる。
【0013】
この明細書の主題の1つ以上の実施形態の詳細は、添付の図面および以下の詳細な説明において述べられる。主題の他の特徴、局面および利点は、詳細な説明、図面および特許請求の範囲から明らかになる。
【図面の簡単な説明】
【0014】
【
図1A】ニューラルネットワークをトレーニングするための例示的な専用ハードウェアチップのハイレベル図を示す。
【
図1B】コンピュートコアのハイレベルの例を示す。
【
図1C】例示的なニューラルネットワーク処理システムを示す。
【
図2】行列乗算ユニットを含む例示的なアーキテクチャを示す。行列乗算ユニットは、二次元シストリックアレイである。
【
図3】シストリックアレイ内のマルチセルの例示的アーキテクチャを示す。
【
図4】行列計算ユニットにおけるセルの例示的アーキテクチャを示す。
【
図5】ベクトル計算ユニットの例示的アーキテクチャを示す。
【
図7】行列計算セルの乗算回路の例示的なアーキテクチャを示す。
【
図8】行列計算ユニットを用いて行列乗算を実行するための例示的なプロセスのフロー図である。
【
図9】活性化入力値と重み入力値との乗算を実施するための例示的なプロセスのフロー図である。
【発明を実施するための形態】
【0015】
さまざまな図面の同様の参照番号および名称は、同様の要素を示す。
詳細な説明
複数の層を有するニューラルネットワークを用いて計算を実行することができる。たとえば、入力が与えられると、ニューラルネットワークはその入力に対する推論を計算することができる。ニューラルネットワークは、ニューラルネットワークの各層を通して入力を処理することによって、この推論を計算する。各層は入力を受け取り、その層に対する重みのセットに従って入力を処理して出力を生成する。
【0016】
したがって、受け取った入力から推論を計算するために、ニューラルネットワークは入力を受け取り、それを各ニューラルネットワーク層の各々を通して処理して推論を生成し、1つのニューラルネットワーク層からの出力は次のニューラルネットワーク層への入力として与えられる。ニューラルネットワーク層へのデータ入力、たとえば、ニューラルネットワークへの入力、またはシーケンス内におけるその層の下の層の、あるニューラルネットワーク層への出力は、その層への活性化入力と呼ぶことができる。
【0017】
いくつかの実装形態では、ニューラルネットワークの層はシーケンスで配置される。ある他の実装形態では、層は有向グラフとして配される。つまり、任意の特定の層が複数の入力、複数の出力、またはそれらの両方を受け取ることができる。ニューラルネットワークの層は、ある層の出力を前の層への入力として送り返すことができるように構成することもできる。
【0018】
ニューラルネットワークをトレーニングして、ニューラルネットワークにおける層の重みのトレーニングされた値を判断することもできる。一般的に、トレーニング中、入力は、ニューラルネットワークを用いて処理され、重みは、入力に対してニューラルネットワークによって生成された出力に基づいて調整される。
【0019】
この明細書では、ニューラルネットワーク計算、つまり、ニューラルネットワーク層によって実行される行列乗算演算を含む推論またはトレーニング操作を実行する専用ハードウェア回路について説明する。
【0020】
図1Aは、ニューラルネットワークをトレーニングするための例示的な専用ハードウェアチップのハイレベル図を示す。図示されているように、単一の専用ハードウェアチップには2つの独立したプロセッサ(102a、102b)が含まれる。各プロセッサ(102a、102b)には、2つの異なるコア:(1)コンピュートコア、つまり非常に長い命令語(VLIW)マシン(103a、103b)、および(2)疎計算コア、つまり埋め込み層アクセラレータ(105a、105b)が含まれる。
【0021】
各コンピュートコア(103a、103b)は、密線形代数問題に対して最適化される。各コンピュートコアは、非常に長い命令語命令の、それ自身のストリームを実行する。
【0022】
例示的な疎計算コア(105a、105b)は、非常に疎である高次元データを密な低次元データにマッピングし、残りの層が密に充填された入力データを処理するようにする。たとえば、疎計算コアは、トレーニング中のニューラルネットワークの埋め込み層の計算を実行できる。
【0023】
この疎から密へのマッピングを実行するために、疎計算コアは、埋め込みテーブルである、予め構築されたルックアップテーブルを用いる。たとえば、ユーザ入力として一連のクエリワードがある場合、各クエリワードはハッシュ識別子またはワンホットエンコードされたベクトルに変換される。識別子をテーブルインデックスとして用いて、埋め込みテーブルは対応する密なベクトルを返し、それは、次の層への入力活性化ベクトルになることができる。疎計算コアは、検索クエリワードにわたって簡約操作を実行して、1つの密な活性化ベクトルを作成することもできる。疎計算コアは、効率的な疎の、分散されたルックアップを実行し、なぜならば、埋め込みテーブルが巨大であり得、専用ハードウェアチップの1つの限られた容量の高帯域幅メモリに収まらないためである。疎計算コア機能に関する詳細は、2016年2月5日に提出された「MATRIX PROCESSING APPARATUS(行列処理装置)」と題される米国特許出願第15/016,486号に見ることができる。
【0024】
図1Bは、コンピュートコア(101)のハイレベルの例を示す。コンピュートコアは、いくつかのコンピュートユニットを並列で制御するマシン、つまりVLIWマシンであることができる。各コンピュートコア(101)には、スカラーメモリ(104)、ベクトルメモリ(108)、スカラープロセッサ(107)、ベクトルレジスタ(106)、および拡張ベクトルユニット(つまり、行列乗算ユニット(MXU)(113)と、転置ユニット(XU)(114)と、簡約および置換ユニット(RPU)(116))が含まれる。
【0025】
例示的なスカラープロセッサは、VLIW命令のフェッチ/実行ループを実行し、コンピュートコアを制御する。命令バンドルをフェッチしてデコードした後、スカラープロセッサ自体は、スカラープロセッサ(107)およびスカラーメモリ(104)の複数のマルチビットレジスタ、つまり32の32ビットレジスタを用いて、命令バンドルのスカラースロットにおいて見いだされる命令を実行するのみである。スカラー命令セットには、アドレス計算、ロード/ストア命令、分岐命令などで使用される通常の算術演算が含まれる。残りの命令スロットは、ベクトルプロセッサまたは他の拡張ベクトルユニット(113、114、116)の命令をエンコードする。デコードされたベクトル命令は、ベクトルプロセッサに転送される。
【0026】
ベクトル命令とともに、スカラープロセッサ(107)は、最大3つのスカラーレジスタの値を他のプロセッサおよびユニットに転送して、演算を実行できる。スカラープロセッサは、ベクトルプロセッサから計算結果を直接取得することもできる。ただし、一部の実装形態では、例示的なチップは、ベクトルプロセッサからスカラープロセッサへの低帯域幅通信パスを有する。
【0027】
ベクトル命令ディスパッチャは、スカラープロセッサとベクトルプロセッサとの間にある。このディスパッチャは、非スカラーVLIWスロットからデコードされた命令を受け取り、それらの命令をベクトルプロセッサにブロードキャストする。ベクトルプロセッサは、
図1Cを参照して詳細に説明される。
【0028】
例示的なスカラープロセッサ(107)は、小さい、高速な、プライベートスカラーメモリ(104)にアクセスする。このメモリは、はるかにより大きく、低速な高帯域幅メモリ(HBM)(110)によってバックアップされる。同様に、例示的なベクトルプロセッサは、小さい、高速な、プライベートベクトルメモリ(108)にアクセスする。このメモリも、HBM(110)によってバックアップされる。ワード粒度アクセスは、スカラープロセッサ(107)とスカラーメモリ(104)との間、またはベクトルプロセッサとベクトルメモリ(108)との間で起こる。ベクトルプロセッサとベクトルメモリとの間のロードおよびストアの粒度は、128個の32ビットワードのベクトルである。ダイレクトメモリアクセスは、スカラーメモリ(104)とHBM(110)との間、およびベクトルメモリ(108)とHBM(110)との間で起こる。いくつかの実装形態では、HBM(110)からプロセッサ(107)へのメモリ転送は、スカラーメモリまたはベクトルメモリを介してのみ実行できる。さらに、スカラーメモリとベクトルメモリとの間でダイレクトメモリ転送が行われない場合がある。
【0029】
命令は、拡張ベクトルユニット演算を指定する場合がある。実行された各ベクトルユニット命令に加えて、各々が1つのレジスタ値を拡張ベクトルユニットに入力オペランドとして送ることができる2次元、つまり128×8のベクトルユニットがある。各拡張ベクトルユニットは、入力オペランドを受け取り、対応する演算を実行し、結果をベクトルプロセッサ(306)に返す。拡張ベクトルユニットは、
図4を参照して以下に説明される。
【0030】
図1Cは、ニューラルネットワーク計算を実行するための例示的な専用集積回路100を示す。説明したように、チップには2つのコンピュートコア(103a、103b)と2つの疎計算コア(152a、152b)とが含まれる。
【0031】
チップは、ホストコンピュータへのホストインターフェイス(150)、下部に沿った高帯域幅メモリの4つのスタック(156a~156d)、およびインターフェイスとメモリとを接続するチップ間相互接続(148)、ならびに他のチップからのデータを含む共有領域を有する。高帯域幅メモリの2つのスタック(156a~156b、156c~156d)が各コンピュートコア(103a、103b)に関連付けられる。
【0032】
チップは、データを高帯域幅メモリ(156c~156d)に保存し、そのデータをベクトルメモリ(108)において読込および読出し、そのデータを処理する。コンピュートコア(103b)自体は、2次元に分割されたオンチップS-RAMであるベクトルメモリ(108)を含む。ベクトルメモリには、アドレスが浮動小数点数、つまり各々32ビットである128個の数値を保持するアドレス空間がある。コンピュートコア(103b)は、値を計算する計算ユニット、および計算ユニットを制御するスカラーユニットも含む。
【0033】
ベクトルプロセッサは、ベクトル処理ユニットの2次元配列、すなわち128×8から成り、これらはすべて、同じ命令を単一命令複数データ(SIMD)方式で実行する。ベクトルプロセッサには、レーンとサブレーン、つまり128本のレーンおよび8本のサブレーンがある。レーン内において、ベクトルユニットはロード命令およびストア命令を介して互いに通信する。各ベクトルユニットは、一度に1つの4バイト値にアクセスできる。同じレーンに属さないベクトルユニットは直接通信できない。これらのベクトルユニットは、以下で説明する簡約/置換ユニットを用いる必要がある。
【0034】
計算ユニットは、ベクトル処理ユニット(106)において、浮動小数点演算および整数演算の両方に用いることができるベクトルレジスタ、つまり32個のベクトルレジスタを含む。計算ユニットは、計算を実行するための2つの算術論理ユニット(ALU)(126c~126d)を含む。一方のALU(126c)は浮動小数点加算を実行し、他方のALU(126d)は浮動小数点乗算を実行する。両方のALU(126c~126d)は、シフト、マスク、比較などの他のさまざまな演算を実行できる。たとえば、コンピュートコア(103b)は、ベクトルレジスタV1と第2のベクトルレジスタV2とを加算し、結果を第3のベクトルレジスタV3に入れたい場合がある。この加算を計算するために、コンピュートコア(103b)は複数、つまり1024の演算を1クロックサイクルで実行する。これらのレジスタをオペランドとして用いて、各ベクトルユニットは、クロックサイクルごとに2つのALU命令と1つのロードおよび1つのストア命令とを同時に実行できる。ロードまたはストア命令のベースアドレスは、スカラープロセッサで計算でき、ベクトルプロセッサに転送できる。各サブレーンにおけるベクトルユニットの各々は、ストライドや特別なインデックス付きアドレスレジスタなどのさまざまな方法を用いて、それ自体のオフセットアドレスを計算できる。
【0035】
計算ユニットは、平方根や逆数などの演算を実行する拡張単項パイプライン(EUP)(116)も含む。コンピュートコア(103b)は、これらの演算を実行するのに3クロックサイクルかかり、なぜならば、一度に1つのオペランドを取り込むからである。EUP処理には1クロックサイクル以上かかるため、結果を保存する先入れ先出しのデータストレージがある。演算が終了すると、結果はFIFOに保存される。コンピュートコアは、後で別の命令を用いて、FIFOからデータを引き出し、それをベクトルレジスタに格納できる。乱数生成器(120)により、コンピュートコア(103b)はサイクルごとに乱数、つまりサイクルごとに128の乱数を生成できる。
【0036】
上に述べられるように、各プロセッサは3つの拡張ベクトルユニット、つまり、行列乗算演算を実行する行列乗算ユニット(113)と、行列、すなわち128×128の行列の転置演算を実行する転置ユニット(XU)(114)を含むクロスレーンユニット(XLU)と、(
図1Cにおいて別個のユニット、簡約ユニット115および置換ユニット116として示される)簡約および置換ユニットとを有する。
【0037】
行列乗算ユニットは、2つの行列間で行列乗算を実行する。コンピュートコアは、乗算される行列である一連の数値を読み込む必要があるため、行列乗算ユニット(113)はデータを取り込む。図示されているように、データはベクトルレジスタ(106)から来る。各ベクトルレジスタには、128×8の数値、つまり32ビットの数値が含まれる。しかしながら、データを行列乗算ユニット(113)に送って、数値をより小さなビットサイズ、つまり32ビットから16ビットに変更すると、浮動小数点変換が発生する場合がある。並直列変換器(130)は、ベクトルレジスタから数値が読み取られるときに、2次元配列つまり128×8の行列が128個の数値のセットとして読み取られ、次の8クロックサイクルの各々ごとに行列乗算ユニット(113)に送信されることを保証する。行列乗算がその計算を完了した後、結果は非直列化され(132a、132b)、これは、結果行列が、ある数のクロックサイクルの間保持されることを意味する。たとえば、128×8の配列の場合、128個の数値が8クロックサイクルの各々ごとに保持され、次いでFIFO、転置結果FIFO(TRF)134または乗算結果FIFO(MRF)136にプッシュされ、128×8の数値の2次元配列を1クロックサイクルで取得して、ベクトルレジスタ(106)に格納できる。
【0038】
あるサイクル期間、すなわち128のサイクルからなる期間にわたって、重みが、行列を乗算する数値として行列乗算ユニット(113)にシフトされる。行列および重みがロードされると、コンピュートコア(103b)は、数値のセット、つまり128×8の数値のセットを行列乗算ユニット(113)に送ることができる。セットの各ラインに行列を乗算して、クロックサイクルごとにある数の結果、つまり128の結果を生成できる。コンピュートコアが行列乗算を実行している間、コンピュートコアは、前の行列の計算プロセスが完了したときに、コンピュートコアが乗算する次の行列が利用できるように、バックグラウンドにおいて次の行列になる新たな数値のセットのシフトも行う。行列乗算ユニット(113)は、重み入力および活性化入力を処理し、出力のベクトルをベクトルレジスタ106に与えることができる。ベクトル処理ユニットは、出力のベクトルを処理し、処理された出力のベクトルをベクトルメモリに格納することができる。たとえば、ベクトル処理ユニットは、非線形関数を行列乗算ユニットの出力に適用して、活性化された値を生成できる。いくつかの実装形態では、ベクトル計算ユニット114は、正規化された値、プーリングされた値、またはその両方を生成する。処理された出力のベクトルは、たとえばニューラルネットワーク内の後続の層で用いるために、行列乗算ユニット112への活性化入力として用いることができる。
【0039】
転置ユニットは、行列を転置する。転置ユニット(114)は、数値を取り込み、それらを転置して、レーンを横切る数値が他の次元の数値と転置されるようにする。一部の実装形態では、ベクトルプロセッサは128×8のベクトルユニットを含む。したがって、128×128の行列を転置するには、完全な行列転置のために16個の個別の転置命令が必要である。転置が終了すると、転置された行列が利用可能になる。ただし、転置された行列をベクトルレジスタファイルに移動するには、明示的な命令が必要である。
【0040】
簡約/置換ユニット(またはユニット115、116)は、置換、レーン回転、回転置換、レーン簡約、置換されたレーン簡約、およびセグメント化された置換されたレーン簡約などのさまざまな操作をサポートすることで、クロスレーン通信の問題に対処する。図示されているように、これらの計算は別々であるが、コンピュートコアは一方もしくは他方または一方に連鎖された他方を用いることができる。簡約ユニット(115)は、数値からなる各ラインを簡約し、それらの数値を置換ユニット(116)に供給する。置換ユニットは、異なるレーン間でデータを変更する。転置ユニット、簡約ユニット、置換ユニット、および行列乗算ユニットは、各々、完了までに1クロックサイクル以上かかる。したがって、各ユニットにはFIFOが関連付けられ、計算結果をFIFOにプッシュし、後で別の命令を実行して、データをFIFOからベクトルレジスタにプルできる。FIFOを用いることにより、コンピュートコアは、長々とした演算の間、複数のベクトルレジスタを予約する必要がない。図示されているように、各ユニットはベクトルレジスタ(106)からデータを取得する。
【0041】
コンピュートコアは、スカラーユニットを用いて計算ユニットを制御する。スカラーユニットには2つの主要な機能があり、それは、(1)ループカウントおよびアドレス指定を実行すること、ならびに(2)DMAコントローラがバックグラウンドにおいて高帯域幅メモリ(156c~156d)とベクトルメモリ(108)との間で、および次いで例示のシステムにおける他のチップへのチップ間接続(148)にデータを移動するよう、ダイレクトメモリアドレス(DMA)要求を生成することである。スカラーユニットは、命令メモリ(104)と、命令デコードおよび発行(102)と、スカラーレジスタすなわち32ビットを含むスカラー処理ユニット(107)と、スカラーメモリ(104)と、クロックサイクルごとに2つの演算を実行する2つのALU(126a、126b)とを含む。スカラーユニットは、オペランドと即値とをベクトル演算に渡すことができる。各命令は、ベクトルレジスタ(106)で実行される命令を含む命令バンドルとして、命令デコードおよび発行(102)から送ることができる。各命令バンドルは非常に長い命令語(VLIW)であり、各命令はある数のビット幅であり、ある数の命令フィールドに分割される。
【0042】
図2は、行列乗算ユニット(MXU)201aおよび201bを含む例示的なアーキテクチャ200を示す。各MXUは2次元のシストリックアレイである。アレイは、行列乗算演算を実行するように配線される。MXUは、クロックサイクルごとに1つの乗算という一定のスループットで、128要素のベクトルをプリロードされた128×128の行列で乗算する。
【0043】
各MXUは、128の行および128の列を有する。MXUは、タイルと呼ばれる同一のブロックに分割できる。たとえば、MXUは32個のタイルに分割でき、各タイルには32行×16列が含まれる。各タイルは、さらに積和サブユニットセルに分割できる。各セルはベクトルデータ入力オペランドを取り、そのオペランドに格納された重みを乗算して結果を得、その結果を部分和に加算して新たな部分和を生成する。いくつかの実装形態では、サブユニットセルをより大きなマルチセル、つまり、2×2の積和サブユニットセルのアレイまたはセーデキム(16)セルと呼ばれる4×4の積和サブユニットセルのアレイにグループ化できる。入力データを1つの積和サブユニットセルからクロックサイクルごとに1つの速度で次のセルに移動する代わりに、データはクロックサイクルごとに1つのマルチセルでシストリックアレイを移動できる。
【0044】
一連のベクトル行列乗算を開始する前に、行列をMXUにプリロードする必要がある。この行列のためのデータは「重み」データと呼ばれる。重み行列は、ソースバスを介して、MXUに接続されたバスによってMXUに送られ、重みシフトレジスタにシフトされる。次いで、重みシフトレジスタの内容が重み行列レジスタにロードされ、行列の乗算が開始できるようになる。
【0045】
図2に示すように、各MXU、例えば113aおよび113bは、3つのバス、転置されない重み用の第1のソースバス(230a、240b)、転置された重み用の第2のソースバス(220a、220b)、およびMXUに格納されている行列で乗算されるベクトルデータ用の左辺バス(210a、210b)に接続される。MXUは、MXUのエッジに接続するワイヤによってバスに接続される。各転置ユニット(XU)、たとえば114aおよび114bも、第1のソースバスおよび第2のソースバスに接続される。
【0046】
第1および第2のソースバスは、XUまたはMXUで消費されるべくベクトル処理ユニットから送られるデータを含む多目的バスである。データ処理は、ベクトルレジスタ206、直列化処理ユニット202、および選択ユニット204を含むベクトル処理データパスで発生する。ベクトル処理ユニットがバスで重みを送る方法はいくつかある。この重みは、通常の「ハイ(H)」または「ロー(L)」で送られてもよい。レーンごとに8つの32ビットの浮動小数点数(サブレーンごとに1つ)が、bfloatの16ビットの浮動小数点数に丸められる。これらの値は4つの対にパックされ、8サイクルのコースにわたって1サイクルおきにMXUに送られる。通常の「H」と「L」との違いは、ベクトル処理ユニットが浮動小数点の32からbfloatへの変換を行う方法である。重みがパックされる場合がある、とは、レーンごとの8つの32ビット値の各々に、パックされたbfloatの対が含まれることを意味する。8つの連続したサイクルの間に各サイクルでソースバスを使用して、8つではなく16の値がMXUに送られる。奇数サイクルでは、各サブレーンの下位16ビットがMXUに送られ、偶数サイクルでは、各サブレーンの上位16ビットがMXUに送られる。重みは、追加または代替としてバイト単位で送られてもよい。各32ビットオペランドには、4つの8ビット符号付き2の補数整数のパックされたセットが含まれる。各バイトは、修正された符号絶対値に変換される。これらの値は、連続する8サイクルにわたってソースバスによってMXUに送られる。
【0047】
重みは、第1または第2のソースバスを用いて転置されないまたは転置された命令として送られ、重みシフトレジスタにシフトされてもよい。ロード操作でトリガされると、以下に説明するように、重みシフトレジスタの内容は重み行列にロードされる。重みシフトレジスタから重み行列レジスタへのロードパスは、修正された符号絶対値からbfloatへの変換がバイトモードデータで行われる場所でもある。ロード制御バスは、この変換を実行するかどうかを示す。
【0048】
実行中の命令に応じて、ソースバスからの32ビット値には、ビット[15:0]の値が(時間において)より早い値を表す16ビット浮動小数点値のパックされた対、またはビット[7:0]の値が(時間において)より早い値を表し、他の値がシーケンスで後に続く、修正された符号絶対値形式の4つの8ビットの整数のパックされたセットが含まれてもよい。MXUがバスからデータを受け取ると、データ値はMXU全体に均等に、左側に値0、右側に値127で、拡散される。
【0049】
LHSデータバスは、接続されたMXUに格納される行列で乗算されるよう、128個の16ビット浮動小数点数を特定の形式、たとえば、bfloatで運ぶ。LHSデータバスのデータは、ベクトル処理ユニットから来て、転置ユニット、例えば、114aおよび114bを通過する。LHS入力がMXUに到着すると、値はMXU全体に均等に、左側に値0、右側に値127で、拡散される。
【0050】
行列乗算の結果は、MXU全体に均等に拡散され、MXUから行列結果FIFO(MRF)、たとえば136aおよび136bに送られる。XUからの結果は、対応する転置結果FIFO(TRF)、たとえば134aおよび134bに送られる。
【0051】
図3は、行列乗算ユニット内のマルチセルの例示的なアーキテクチャを示す。上記で説明したように、行列乗算ユニットは2次元のシストリックアレイである。アレイは、マルチセルにグループ化できる複数の積和サブユニットを含む。いくつかの実装形態では、シストリックアレイの第1の次元はセルの列に対応し、シストリックアレイの第2の次元はセルの行に対応する。シストリックアレイは、列よりも行が多くてもよく、行よりも列が多くてもよく、または列と行とが同数であってもよい。この明細書では、列または垂直方向についての特定の処理について説明する。ただし、異なる設計で行または水平方向の処理を実行できる。
【0052】
図示された例では、左辺データレジスタ315a、315bは、アレイの行にベクトルデータ入力を送る。重みシフトチェーン301Aおよび301Bは、重み入力値をアレイの列に送り、重みシフトチェーン302aおよび302bは、重み入力値をアレイの行に送る。シフトチェーンは、たとえばソースバスから行列乗算ユニット内のさまざまなレジスタの各々に値を渡すことができる有線経路である。
【0053】
各重みシフトレジスタ305は、重み内容値をソースバスから重みシフトレジスタ305のチェーンに沿ってシフトするように設計される。すべてのデータがシフトインされた後、並列コピー操作により、すべてのデータが重みシフトレジスタ305から対応する重み行列レジスタ325に確実にコピーされる。データが重み行列レジスタ325にあるとき、データは任意の数の乗算サイクルで用いられる。この間、次の乗算セットに備えて、より多くの重みをバックグラウンドで重みレジスタ305にシフトしてもよい(通常はシフトされる)。
【0054】
左辺データレジスタ315a、315bは、ベクトルデータ入力を受け取ることができる。各左辺データレジスタは、1クロックサイクルについて各クロックサイクルで1つのLHSデータ項目を保持する。マルチセルによって受け取られる各ベクトルデータ入力は、左辺データレジスタ315a、315bなど、マルチセルの対応する左辺レジスタ内を自由に流れてもよい。左辺データレジスタは、ベクトルレジスタによって、またはアレイ内の所与のマルチセルの位置に応じて、そのマルチセルの左にある隣接するマルチセルによって与えられ得るベクトルデータ入力を格納する。例えば、マルチセル300が行列乗算ユニットのシストリックアレイ内の最も左の位置にある場合、ベクトルデータ入力はベクトルレジスタによって与えられる。ベクトルレジスタは、複数の異なるベクトルデータ入力をマルチセル300に与えてもよく、各受け取られたベクトルデータ入力は、次いで、左辺データレジスタ315のうちの異なる1つによって格納されてもよい。各行は、マルチセルにグループ化される行の数に関係なく、クロックサイクルごとに1つの値を受け取る。
【0055】
各左辺レジスタは、マルチセルのアレイの第1の次元に沿ってセルに結合されてもよい。左辺レジスタのセルへの接続は、
図3において点線で示される。例えば、マルチセル内の左辺データレジスタ315a(ある左辺データレジスタ)は、第1の行のセル350aおよび350cに結合される。同様に、マルチセル内の左辺データレジスタ315b(第2の左側レジスタ)は、第2の行のセル350bおよび350dに結合される。各左辺レジスタ315は、格納されたベクトルデータ入力を、左側レジスタが結合されるセル350に転送する。したがって、第1の次元に沿って(たとえば、所与の行または所与の列に沿って)延びる所与の数のセルについて、単一のセルだけでなく、マルチセル内のすべてのセルにベクトルデータ入力を渡すことができ、これにより、活性化入力がセルのアレイ全体に速く拡散し、マルチセルの動作の効率が向上する。
【0056】
複数のベクトルデータ入力を隣接する左辺レジスタに送って、複数のベクトルデータ入力をアレイの別のマルチセルで使用できるようにすることもできる。このプロセスにより、アレイの別の特定のマルチセルで使用するためにベクトル入力をシフトできる。
【0057】
マルチセル300の各セル350は、格納された重み値を含む。行列乗算プロセスを開始する前に、重みをシストリックアレイのセルにシフトしてロードする。専用チェーンおよび重みシフトレジスタが重みシフト用に設けられ、前の行列乗算処理の実行と同時に新たな重みをシフトインできる。行列入力演算処理全体のレイテンシを短縮する方法で、重み入力をマルチセルにロードできる。
【0058】
上で論じられるように、重みシフトチェーン301、302はソースバスから重み入力を受け取ることができる。シフトチェーンは、複数の対応する重み入力を、マルチセル300に関連付けられた重みレジスタ325に送ることができる。
【0059】
いくつかの実装形態では、重みシフトレジスタは、ベクトルデータ入力をアレイ全体にわたって1つの次元に沿って、たとえば右にシフトし、重み入力をアレイ全体にわたって1つまたは両方の次元、たとえば右または下にシフトする。例えば、1クロックサイクルにわたって、マルチセル300における複数の活性化入力の各ベクトルデータ入力は、同じ行における次のマルチセルにおいて対応する左辺データレジスタにシフトできる。水平データ(左辺データ)および垂直データ(部分和)は、各々、クロックサイクルごとに、クロックサイクルにつき1マルチセルずつ移動する。重みは、システムによって指示された場合にのみシフトし、実装形態および実行される命令に応じて、1、2、もしくは4行(または列)シフトしてもよい。
【0060】
マルチプレクサ330は、第1のシフトチェーン301または第2のシフトチェーン302の重みシフトレジスタ305から重みを選択し、選択された入力を重み行列レジスタ325への単一のラインに転送する。マルチプレクサ330はセル350の境界線の外側に示されるが、いくつかの実装形態では、マルチプレクサ330はセル350内に存在する。
【0061】
あるクロックサイクルで、各マルチセルは複数の所与の重み入力および複数の所与の活性化入力を処理して、複数の累積出力を生成できる。一般に、処理には、活性化入力に格納された重みを乗算する乗算演算が含まれる。累積出力は、所与の重み入力と同じ次元に沿って、下に、隣接するマルチセルに渡すこともできる。いくつかの実装形態では、1つの畳み込み計算から別の畳み込み計算に移行するために、重みが所与のクロックサイクル中に1より多いマルチセルをシフトされる。
【0062】
累積出力は、重み入力と同じ列に沿って、たとえばアレイ内の列の一番下に向かって渡すことができる。いくつかの実装形態では、部分和レジスタ310a、311Aは、部分和値を前のマルチセルから当該のマルチセルに渡す。アレイは、マルチセルの各列から累積出力を格納する部分和レジスタ310b、311bを含むことができる。マルチセルの各列について、列のサブユニットセルによって生成された積は、上のマルチセルからの入来部分和と結合され、次の部分和として送られる。特定のマルチセル、例えばシストリックアレイの一番下の列のマルチセルなどの場合、累積出力は、ベクトル計算ユニットに転送できる最終的な累積値を含んでもよい。いくつかの実装形態では、最終的な累積値はアレイの一番下のマルチセルからベクトル計算ユニットに直接転送されるが、他の実装形態では、最終的な累積値はまずメモリに保存されるか、または異なるコンポーネントによって処理されてからベクトル計算ユニットに送られる。
【0063】
いくつかの実装形態では、各クロックサイクルで、各セルは所与の重み入力と左辺データ入力とを乗算して積値を生成する。セルは、積値を別のセルから受け取られた部分和値と結合して、更新された部分和値を生成できる。セルは、部分和値を行列計算ユニット内の別のセルに送信できる。
【0064】
図4は、シストリックアレイ内のセルの例示的アーキテクチャ400を示す。
セルは、活性化入力を格納する活性化レジスタ406を含み得る。活性化レジスタは、シストリックアレイ内のセルの位置に応じて、左側の隣接セル、すなわち所与のセルの左側に位置する隣接セルから、またはユニファイドバッファから、活性化入力を受け取ることができる。セルは、重み入力を格納する重みレジスタ402を含み得る。重み入力は、シストリックアレイ内のセルの位置に応じて、上の隣接セルまたは重みフェッチャインターフェイスから転送され得る。セルは総和レジスタ404を含むこともできる。総和レジスタ404は、上の隣接セルからの累積値を格納することができる。活性化レジスタ406および重みレジスタ402は、特定の形式の浮動小数点値など、特定のサイズの値を格納するように構成されたレジスタであり得る。
【0065】
乗算回路408を用いて、重みレジスタ402からの重み入力を活性化レジスタ406からの活性化入力と乗算することができる。乗算回路408は積を合計回路410に出力することができる。いくつかの実装形態では、乗算回路408の入力値および出力値は、異なるサイズおよび/または形式のものであってもよい。
【0066】
合計回路410は、積と総和レジスタ404からの累積値とを合計して新たな累積値を生成することができる。次いで、合計回路410は、新たな累積値を、下の隣接セルに位置する別の総和レジスタに送ることができる。新たな累積値は、下の隣接セルにおける合計のためのオペランドとして用いることができる。合計回路410はまた、総和レジスタ404からの値を受け入れ、総和レジスタ404からの値を、乗算回路408からの積と合計することなく、下の隣接セルに送ることもできる。いくつかの実装形態では、合計回路410の入力値は、異なるサイズおよび/または形式のものであってもよい。いくつかの実装形態では、合計回路410のいくつかの入力値および出力値は、異なるサイズおよび/または形式のものであってもよい。
【0067】
セルは、重み入力および活性化入力を、処理のために、隣接セルにシフトすることもできる。たとえば、重み経路レジスタ412は、重み入力を下の隣接セル内の別の重みレジスタに送ることができる。活性化レジスタ406は、活性化入力を右の隣接セル内の別の活性化レジスタに送ることができる。したがって、重み入力と活性化入力との両方を、後続のクロックサイクルでアレイ内の他のセルによって再利用することができる。
【0068】
いくつかの実装形態では、セルは制御レジスタも含む。制御レジスタは、セルが重み入力または活性化入力のいずれかを隣接セルにシフトすべきかを決定する制御信号を記憶することができる。いくつかの実装形態では、重み入力または活性化入力をシフトすることは、1つ以上のクロックサイクルを要する。制御信号は、活性化入力または重み入力が乗算回路408に転送されるかどうかも決定し得るか、または乗算回路408が活性化入力および重み入力で演算を行うかどうかも決定し得る。制御信号は、たとえば配線を用いて、1つ以上の隣接セルに渡すこともできる。
【0069】
いくつかの実装形態では、重みは重み経路レジスタ412に事前にシフトされる。重み経路レジスタ412は、重み入力をたとえば上の隣接セルから受け取り、その重み入力を制御信号に基づいて重みレジスタ402に転送することができる。重みレジスタ402は、活性化入力が複数のクロックサイクルにわたってたとえば活性化レジスタ406を介してセルに転送されると、重み入力がセル内に留まり、隣接セルに転送されないように、重み入力を静的に格納することができる。したがって、重み入力は、たとえば乗算回路408を用いて、複数の活性化入力に適用することができ、それぞれの累積値を隣接セルに転送することができる。
【0070】
図5は、ベクトル計算ユニット502の例示的アーキテクチャ500を示す。ベクトル計算ユニット502は、行列計算ユニット、例えば、
図3を参照して説明した行列計算ユニット312から累積値のベクトルを受け取ることができる。
【0071】
制御信号510を転送することができ、ベクトル計算ユニット502は累積値のベクトルを処理する方法を調整することができる。すなわち、制御信号510は、左側データ値がプーリングされるかどうかを調整することができ、その場合、左側データ値はたとえばveに格納され、またはそうでなければ、制御信号510は、活性化値の取り扱いを調整することができる。制御信号510は、活性化関数またはプーリング関数、および活性化値もしくはプーリング値を処理するための他のパラメータ、たとえばストライド値を指定することもできる。
【0072】
ベクトル計算ユニット502は、値、たとえば左側データ値またはプーリングされた値を送ることができる。いくつかの実装形態では、プーリング回路508は、活性化値またはプーリングされた値を受け取り、活性化値またはプーリングされた値をユニファイドバッファに格納する。
【0073】
図6は、浮動小数点値のための例示的形式600を示す。行列計算ユニットによって処理される値の各々、例えば、行列計算ユニットのセルのレジスタによって格納される値は、特定の形式の浮動小数点値として保存することができる。
【0074】
形式600は、符号ビット601、仮数602として知られるビットのグループ、および指数603として知られる別のビットのグループによって特徴付けられる。
【0075】
符号ビット601は、形式600を用いて格納される値が正か負かを示す。仮数部602は、形式600を用いて格納される値の1つ以上の有効数字を含む。したがって、形式600の仮数602のサイズ、つまりビット数は、形式600を用いて格納される値の最大可能精度を表す。指数603は、格納される値を正規化された形式に変換するために使用されるスケーリングベースの累乗を表す。したがって、形式600の指数603のサイズは、形式600を用いて格納される値の最大可能ダイナミックレンジを表す。
【0076】
場合によっては、システムが浮動小数点数の解釈に用いる正規化された形式は1つ以上の定数値を含む。たとえば、正規化された形式は常に形式1. XXXX * 2^XXXXとすることができ、最初の値の整数部分は常に一定、たとえば1に等しい。いくつかのそのような場合、仮数602は、正規化された値の非定数ビットのみを含み、定数ビットを含まなくてもよい。これらの場合、一定であり、したがって仮数部602に現れない、正規化された形式のビットは、「隠れビット」と言われる。隠れビットを有する2進浮動小数点値を解釈するコンピュータシステムは、値の形式600の基礎となる正規化された形式に従って仮数602に隠れビットを加算する。
【0077】
コンピュータシステムが浮動小数点値として2進数を格納する方法は、システムが浮動小数点数の解釈に用いる正規化された形式と、用いられる特定の浮動小数点形式600の仮数602および指数603のサイズとに依存する。例えば、浮動小数点形式600は、符号ビット601、4ビットの仮数602、および3ビットの指数602を含むことができ、コンピュータシステムは、この形式600を有する2進数を、Xが単一の2進数つまり「0」または「1」である正規化された形式X.XXX * 2^XXXを有すると想定することにより、解釈することができる。さらに、コンピュータシステムは、正規化された形式の最初の値の小数点の前の2進値が、常に1であり仮数602に表われない隠れビットであると想定できる。従って、そのようなコンピュータシステムは、浮動小数点値が、「0」の符号ビット601(2進数が正であるため)、「001」の指数603、および1111の仮数602を有する2進数+11.111を格納および解釈することができる。
【0078】
コンピュータシステムがある形式を用いて数値を適切に格納できない場合、その数値を格納しようとすると、オーバーフローが発生し、予測不能または望ましくない動作に到る可能性がある。上記の例は、コンピュータシステムが、桁数の丸めによりオーバーフローなしにシステムで採用されている形式600の仮数602において許可されている最大精度を超える桁数の2進数を格納できることを示している。このような丸めは精度の低下につながるが、オーバーフローは発生しない。
【0079】
一方、2進数のダイナミックレンジが形式600の指数603で許可されている最大範囲を超える場合、コンピュータシステムはダイナミックレンジを丸めることができない。上記の例を続けると、コンピュータシステムは番号111111111.012を格納および解釈できず、なぜならば、その数値の正規化された形式のダイナミックレンジは10002であり、このダイナミックレンジは、例示の3ビットの指数幅を用いて、形式600の指数603において許可される値の範囲で表現できないからである。
【0080】
別の例として、システムは8ビットの指数および7ビットの仮数のbfloat形式を用いてもよい。オーバーフローの可能性を減らすために、コンピュータシステムの操作が何らかの方法で第1の形式の第1の浮動小数点値を第2の形式の第2の浮動小数点値に変換する場合、第2の形式のダイナミックレンジが第1の形式のダイナミックレンジ以上であることが重要である。これには、システムが第1の浮動小数点値を第2の浮動小数点値に変換する状況、およびシステムが第1の浮動小数点値に演算を適用して第2の浮動小数点値を生成する状況が含まれる。たとえば、コンピュータシステムが第1の形式の2つの値を乗算して第2の形式の結果値を生成する場合、オーバーフローの可能性を低減するために、第2の形式のダイナミックレンジが第1の形式のダイナミックレンジ以上であることが重要である。乗算される2つの値の形式が異なる場合、第2の形式のダイナミックレンジは、オーバーフローの可能性を減らすために、より大きなダイナミックレンジを有する形式のダイナミックレンジ以上であることが重要である。
【0081】
浮動小数点形式600の例には、IEEE単精度形式、bfloat形式、および拡張bfloat形式が含まれる。
【0082】
IEEE単精度形式は、符号ビット601、8ビットの指数603、および23ビットの仮数602を含む32ビット形式である。bfloat形式は、符号ビット601、8ビットの指数603、および7ビットの仮数602を有する16ビットの形式である。拡張bfloat形式は、符号ビット601、8ビットの指数603、および11ビットの仮数602を含む20ビット形式を含む20ビット形式である。
【0083】
重要なのは、上記の3つの形式すべてが同じ指数602サイズを有し、したがって同じダイナミックレンジを有することである。ただし、単精度形式では拡張bfloat形式よりも精度が高く、拡張bfloat形式ではbfloat形式よりも精度が高くなる。オーバーフローの可能性を低減しながら精度を高めるために、行列計算ユニットは、bfloat形式の値を保持するレジスタに活性化入力値と重み入力値とを格納し、拡張bfloat形式の値を保持するレジスタに入力値の積を保持し、IEEE単精度形式の値を保持するレジスタに積値と部分和値との和を保持する。
【0084】
図7は、行列計算セルの乗算回路の例示的なアーキテクチャ700を示す。
図7に示される行列計算セルは、2つの入力値、例えば、活性化入力値701と重み入力値702とを乗算して、結果値、例えば、積値705を生成する。
【0085】
アーキテクチャ700は、2つの入力値の仮数および符号ビットを乗算して結果値の仮数および符号ビットを生成する乗算器703と、2つの入力値の指数を加算して結果値の指数を生成する加算器804とを含む。結果値の仮数と符号ビットと指数との組み合わせにより、結果値が生成される。
【0086】
図8は、行列計算ユニットを用いて行列乗算を実行するための例示的なプロセス800のフロー図である。プロセス800は、行列計算ユニット、例えば、
図2の行列計算ユニット113によって実行することができ、行列計算ユニットのアーキテクチャに従って行列乗算を実行する。
【0087】
ある行列計算ユニットは、プロセス800を並列に複数回実行して、ベクトルと行列との積、たとえば、複数の活性化入力値を含む入力ベクトルと複数の活性化重み値を含む重み行列との積であるベクトル出力を計算できる。
【0088】
行列計算ユニットは、両方とも第1の浮動小数点形式を有する活性化入力値および重み入力値を取得する(802)。活性化入力値および重み入力値の取得については、
図9を参照して以下でより詳細に説明する。
【0089】
行列計算ユニットは、行列計算ユニットの乗算回路を用いて、活性化入力値と重み入力値とを乗算して、第2の浮動小数点形式を有する積値を生成する(804)。第2の浮動小数点形式は、第1の浮動小数点形式よりも精度が高く、少なくとも第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する。活性化入力値と重み入力値とを乗算した結果を、それらの入力値の形式よりも高い精度を有する形式で格納することにより、行列計算ユニットは、乗算の結果を格納する際に精度が失われる可能性を低減する。活性化入力値と重み入力値とを乗算した結果を、それらの入力値の形式のダイナミックレンジと少なくとも同じ大きさのダイナミックレンジを有する形式で格納することにより、行列計算ユニットは、乗算の結果を格納する際におけるオーバーフローの可能性も低減する。
【0090】
活性化入力値と重み入力値との乗算については、
図8および
図9を参照して以下でより詳細に説明する。
【0091】
いくつかの実装形態では、第1の浮動小数点形式は、符号ビット、8ビットの指数、およびオプションとして隠れビットを対応する2進数の正規化された形式で含まない7ビットの仮数を有する16ビット形式であり、第2の浮動小数点形式は、符号ビット、8ビットの指数、およびオプションとして隠れビットを対応する2進数の正規化された形式で含まない11ビットの仮数を有する20ビット形式である。
【0092】
行列計算ユニットは、部分和値を第3の浮動小数点形式で取得する(806)。行列計算ユニットは、部分和値を行列計算ユニット内のセルから取得できる。
【0093】
第3の浮動小数点形式は、第1の浮動小数点形式よりも精度が高く、少なくとも第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する。したがって、部分和値は、入力値の形式よりも高い精度と、少なくとも入力値の形式のダイナミックレンジと同等のダイナミックレンジとを可能にする形式を有する。
【0094】
いくつかの実装形態では、第3の浮動小数点形式は第2の浮動小数点形式よりも高い精度を有する。言い換えると、3つの浮動小数点形式は、それらの精度の観点から、もっとも高い精度の形式から始めて、第3の浮動小数点形式、第2の浮動小数点形式、および第1の浮動小数点形式の順序でランク付けできる。いくつかの実装形態では、第3の浮動小数点形式のダイナミックレンジは、少なくとも第2の浮動小数点形式のダイナミックレンジと同等である。
【0095】
一部の実装形態では、第3の浮動小数点形式は、IEEE標準754単精度形式、または符号ビット、8ビット指数、および隠れビットを対応する2進数の正規化された形式で含まない23ビット仮数を有するその他の32ビット形式である。
【0096】
行列計算ユニットは、行列計算ユニットの合計回路を用いて、部分和値と積値を結合して、第3の形式を有する更新された部分和値を生成する(808)。積値と部分和値とを結合した結果を部分和の値の形式と同じ形式で格納することにより、行列計算ユニットはオーバーフローまたは精度の損失の可能性を低減する。これは、積値の形式、つまり第2の形式が、更新された部分和値の形式、つまり第3の形式よりも精度が低い実装形態の場合に特に当てはまる。そのような実装形態では、行列計算ユニットは、積値の形式よりも高い精度を有する形式で組み合わせの結果を格納することにより、精度が失われる可能性を低減する。同様に、第3の形式のダイナミックレンジが第2の形式のダイナミックレンジと少なくとも同等である実装形態では、行列計算ユニットは、結合の結果を積値の形式よりも大きなダイナミックレンジを有する形式で格納することにより、オーバーフローの可能性を低減する。
【0097】
いくつかの実装形態では、行列計算ユニットは、更新された部分和を行列計算ユニットの別のコンポーネント、たとえば行列計算ユニットのセルまたは行列計算ユニットのマルチセル構造に送る。
【0098】
図9は、活性化入力値と重み入力値との乗算を実施するための例示的なプロセス900のフロー図である。便宜上、プロセス900は、1つ以上の場所にある1つ以上のコンピュータのシステムによって実行されるものとして説明される。例えば、あるニューラルネットワーク処理システム、例えば、この明細書に従って適切にプログラムされた
図1のニューラルネットワーク処理システム100は、プロセス900を実行することができる。
【0099】
ニューラルネットワークシステムは、プロセス900を並列に複数回実行して、ベクトルと行列との積、たとえば、複数の活性化入力値を含む入力ベクトルと複数の活性化重み値を含む重み行列との積の高精度部分を含むベクトル出力と低精度部分を含むベクトル出力とを計算する。
【0100】
システムは、生の活性化値および生の重み値を取得する(902)。システムは、システムのニューラルネットワーク実装エンジン、例えば、
図1のニューラルネットワーク実装エンジン150から生の値を取得してもよい。生の値は、IEEE単精度浮動小数点形式など、どのような形式でもよい。
【0101】
システムは、生の活性化値を第1の形式に変換して活性化入力値を生成し(904)、生の重み値を第1の形式に変換して重み入力値を生成する(906)。システムは、生の活性化値で表される数値を、新たな形式の新たな値として格納できる。
【0102】
システムは、生の活性化値と活性化入力値とを高められた精度で乗算する要求を受け取ったかどうかを判断する(908)。システムは、システムのエンドユーザから、および/またはシステムのニューラルネットワーク実装エンジン、たとえば
図1のニューラルネットワーク実装エンジン150によって、この高精度要求を受け取ってもよい。この要求は、システムが生の活性化値と活性化入力値とを乗算した結果を、精度の損失を抑えて格納しなければならないことを示す。
【0103】
いくつかの実装形態では、システムは、ソフトウェア命令、つまりVLIW命令バンドルを介して、高精度要求を受け取る。これらの命令バンドルは、高精度行列乗算の構成部分などのさまざまなオプションを表現するために用いられる多数の異なる可能なオペコードを有する行列乗算命令を含んでもよい。システムが高精度要求を受け取っていないと判断した場合、システムは、システムが実装されているハードウェア回路の行列計算ユニットを用いて、活性化入力値と生の活性化値とを個々の値として乗算して、第2の形式を有する積値を生成する(910)。
【0104】
そうではなく、システムが高精度要求を受け取ったと判断した場合、システムは、生の活性化値と活性化入力値との差である活性化高精度値を生成し(912)、生の重み値と重み入力値との差である重み高精度値を生成する(914)。システムは、生の活性化値から活性化入力値を減算することにより、活性化入力値と生の入力値との差を生成し、生の重み値から重み入力値を減算することにより、重み入力値と生の重み値との差を生成する。システムは、第1の値を第2の値の否定に加算することにより、行列計算ユニットの外部の合計回路を用いるなど、行列計算ユニットの外部の適切な回路を用いて2つの値の減算を実行できる。活性化高精度値および重み高精度値は、どちらも第1の浮動小数点形式の値である。
【0105】
システムは、行列計算ユニットを用いて、活性化入力値と、重み入力値と、活性化高精度値と、重み高精度値との間の乗算のセットを実行する(916)。行列計算ユニットを用いて2つの値の間の乗算を実行するために、システムは行列計算ユニットに2つの値を与えて、行列計算ユニットに2つの値の乗算を実行させる。
【0106】
一部の実装形態では、乗算のセットは、活性化入力値に重み入力値を乗算すること、活性化入力値に重み高精度値を乗算すること、重み入力値に活性化高精度値を乗算すること、および活性化高精度値に重み高精度値を乗算することを含む。
【0107】
ソフトウェア命令は、どのような可能な乗算のサブセットを含めるかを判断する。いくつかの実装形態では、乗算のセットは、活性化入力値に重み入力値を乗算すること、および活性化高精度値に重み高精度値を乗算することだけを含む。この手法を用いることにより、個々の入力値および高精度値の少なくとも一部が必要なレベルの正確さを有するとシステムが判断した場合に、必要な乗算の数を低減することができる。
【0108】
高精度値は、第1の形式を有する入力値に生の値を格納するときに丸めることで失われた生の値の低精度部分の少なくとも一部を示す。これらの高精度値を乗算において用いることにより、システムは生の値の高精度部分を含む乗算を実行できるため、より精度の高い乗算結果を生成できる。
【0109】
次に、システムは、4つの乗算の積を結合して、生の値の乗算結果の低精度部分を含む第1の形式の第1の値と、生の値の乗算結果の高精度部分を含む第1の形式の第2の値とを生成する(918)。いくつかの実装形態では、システムは、行列計算ユニットの外部にある外部の合計回路を用いて合計を実行する。
【0110】
本明細書において記載される主題および機能的動作の実施形態は、本明細書に開示される構造およびそれらの構造的等価物を含む、デジタル電子回路系において、有形で実施されるコンピュータソフトウェアもしくはファームウェアにおいて、コンピュータハードウェアにおいて、またはそれらの1つ以上の組合せにおいて実現され得る。本明細書に記載される主題の実施形態は、1つ以上のコンピュータプログラムとして、すなわち、データ処理装置による実行のために、または、データ処理装置の動作を制御するために有形の非一時的なプログラム担体上でエンコードされたコンピュータプログラム命令の1つ以上のモジュールとして実現され得る。代替的に、または加えて、プログラム命令は、データ処理装置による実行に対して好適な受信側装置への送信のために情報をエンコードするよう生成される、たとえばマシンにより生成された電気信号、光信号、または電磁気信号などの、人為的に生成された伝搬される信号上でエンコードすることができる。コンピュータ記憶媒体は、コンピュータ可読記憶装置、コンピュータ可読記憶基板、ランダムもしくはシリアルアクセスメモリデバイス、または、それらの1つ以上の組合せであり得る。
【0111】
「データ処理装置」という用語は、例としてプログラマブルプロセッサ、コンピュータ、または複数のプロセッサもしくはコンピュータを含む、データを処理するためのすべての種類の装置、デバイスおよびマシンを包含する。当該装置は、たとえばFPGA(フィールドプログラマブルゲートアレイ)またはASIC(特定用途向け集積回路)といった特定目的論理回路を含み得る。当該装置は、ハードウェアに加えて、たとえばプロセッサファームウェア、プロトコルスタック、データベース管理システム、オペレーティングシステム、または、それらの1つ以上の組合せを構成するコードといった、当該コンピュータプログラムについて実行環境を作成するコードをさらに含み得る。
【0112】
(プログラム、ソフトウェア、ソフトウェアアプリケーション、モジュール、ソフトウェアモジュール、スクリプトまたはコードとも称され、または記載され得る)コンピュータプログラムは、コンパイル型もしくはインタープリタ型言語、または宣言型もしくは手続き型言語を含む任意の形態のプログラミング言語で記述され得、スタンドアロンプログラムとして、または、モジュール、コンポーネント、サブルーチン、もしくは、コンピューティング環境で使用するのに好適な他のユニットとして任意の形態で展開され得る。コンピュータプログラムは、ファイルシステムにおけるファイルに対応し得るが、対応する必要があるわけではない。プログラムは、当該プログラムに専用である単一のファイルにおいて、または、複数の連携ファイル(coordinated files)(たとえばコードの1つ以上のモジュール、サブプログラムまたは部分を格納するファイル)において、他のプログラムまたはデータ(たとえばマークアップ言語ドキュメントに格納される1つ以上のスクリプト)を保持するファイルの一部に格納され得る。コンピュータプログラムは、1つの場所に位置するかもしくは複数の場所にわたって分散され通信ネットワークによって相互接続される1つのコンピュータまたは複数のコンピュータ上で実行されるように展開され得る。
【0113】
本明細書に記載されるプロセスおよび論理フローは、入力データ上で動作し出力を生成することにより機能を実行するよう1つ以上のプログラマブルコンピュータが1つ以上のコンピュータプログラムを実行することによって実行され得る。本プロセスおよび論理フローの実行、ならびに本装置の実施は、さらに、たとえばFPGA(フィールドプログラマブルゲートアレイ)またはASIC(特定用途向け集積回路)といった特殊目的論理回路系によってもなされ得る。
【0114】
コンピュータプログラムの実行に好適であるコンピュータは、例として、汎用マイクロプロセッサもしくは特殊目的マイクロプロセッサもしくはその両方または任意の種類の中央処理ユニットに基づき得る。一般に、中央処理ユニットは、リードオンリメモリもしくはランダムアクセスメモリまたはその両方から命令およびデータを受け取る。コンピュータの必須の要素は、命令を実行するための中央処理ユニットと、命令およびデータを格納するための1つ以上のメモリデバイスとである。一般に、コンピュータはさらに、たとえば磁気ディスク、光磁気ディスクまたは光ディスクといった、データを格納するための1つ以上の大容量記憶装置を含むか、当該1つ以上の大容量記憶装置からデータを受け取るかもしくは当該1つ以上の大容量記憶装置にデータを転送するよう動作可能に結合されるか、またはその両方を行う。しかしながら、コンピュータはそのような装置を有する必要はない。さらに、コンピュータはたとえば、携帯電話、携帯情報端末(PDA)、モバイルオーディオまたはビデオプレーヤ、ゲームコンソール、全地球測位システム(GPS)受信機、またはポータブル記憶装置(たとえばユニバーサルシリアルバス(USB)フラッシュドライブ)といった別のデバイスに埋め込まれ得る。
【0115】
コンピュータプログラム命令およびデータを格納するのに好適であるコンピュータ可読媒体は、例として、たとえばEPROM、EEPROMおよびフラッシュメモリデバイスといった半導体メモリデバイスを含むすべての形態の不揮発性メモリ、媒体およびメモリデバイス;たとえば内部ハードディスクまたはリムーバブルディスクといった磁気ディスク;光磁気ディスク;ならびにCD-ROMおよびDVD-ROMディスクを含む。プロセッサおよびメモリは、特殊目的論理回路によって補足され得るか、または特殊目的論理回路に組み込まれ得る。
【0116】
ユーザとの対話を求めて、本明細書に記載される主題の実施形態は、たとえばCRT(陰極線管)またはLCD(液晶ディスプレイ)モニタといったユーザに対して情報を表示するための表示デバイスと、たとえばマウス、トラックボールといったユーザがコンピュータに入力を送ることができるキーボードおよびポインティングデバイスとを有するコンピュータ上で実現され得る。他の種類のデバイスが、同様に、ユーザとの対話を求めて用いられ得;たとえば、ユーザに提供されるフィードバックは、たとえば視覚フィードバック、聴覚フィードバックまたは触覚フィードバックといった任意の形態の感覚フィードバックであり得;ユーザからの入力は、音響入力、音声入力、または触覚入力を含む任意の形態で受け取られ得る。加えて、コンピュータは、ユーザが使用するデバイスにドキュメントを送信しユーザが使用するデバイスからドキュメントを受信することによって、たとえば、ウェブブラウザから受信された要求に応答してユーザのクライアントデバイス上のウェブブラウザにウェブページを送信することによって、ユーザと対話し得る。
【0117】
本明細書に記載される主題の実施形態は、たとえばデータサーバとしてバックエンドコンポーネントを含む計算システムにおいて実現され得るか、たとえばアプリケーションサーバといったミドルウェアコンポーネントを含む計算システムにおいて実現され得るか、たとえば本明細書に記載される主題の実現例とユーザが対話することが可能であるグラフィカルユーザインターフェイスもしくはウェブブラウザを有するクライアントコンピュータといったフロントエンドコンポーネントを含む計算システムにおいて実現され得るか、または1つ以上のそのようなバックエンドコンポーネント、ミドルウェアコンポーネントもしくはフロントエンドコンポーネントの任意の組合せの計算システムにおいて実現され得る。システムのコンポーネントは、たとえば通信ネットワークといったデジタルデータ通信の任意の形態または媒体によって相互接続され得る。通信ネットワークの例は、ローカルエリアネットワーク(「LAN」)およびワイドエリアネットワーク(「WAN」)、たとえばインターネットを含む。
【0118】
計算システムはクライアントおよびサーバを含むことができる。クライアントとサーバとは一般に互いから遠隔にあり、典型的には通信ネットワークを通じて対話する。クライアントとサーバとの関係は、それぞれのコンピュータ上で実行されるとともに互いに対してクライアント-サーバ関係を有するコンピュータプログラムによって発生する。
【0119】
実施形態1は、ハードウェア回路を用いて行列乗算を実行する方法であって、ハードウェア回路の行列計算ユニットが、入力活性化値および重み入力値を取得することを備え、入力活性化値および重み入力値は各々第1の浮動小数点形式を有し、方法はさらに、行列計算ユニットの乗算回路が、入力活性化値と重み入力値とを乗算して積値を生成することを備え、積値は、第1の浮動小数点形式よりも精度が高く、少なくとも第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する第2の浮動小数点形式を有し、方法はさらに、行列計算ユニットが、第1の浮動小数点形式よりも精度が高く、少なくとも第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する第3の浮動小数点形式で、部分和値を取得することと、ハードウェア回路の合計回路が、少なくとも部分和値と積値とを結合して、第3の浮動小数点形式を有する更新された部分和値を生成することとを備える。
【0120】
実施形態2は、実施形態1の方法であって、浮動小数点形式の精度は、浮動小数点形式において仮数に対して利用可能なビットのカウントに基づいて判断され、浮動小数点形式のダイナミックレンジは、浮動小数点形式において指数に対して利用可能なビットのカウントに基づいて判断される。
【0121】
実施形態3は、実施形態1または実施形態2の方法であって、第2の浮動小数点形式は、第1の浮動小数点形式と同じダイナミックレンジを有し、第3の浮動小数点形式は、第1の浮動小数点形式と同じダイナミックレンジを有する。
【0122】
実施形態4は、実施形態1から実施形態3のいずれか1つの方法であって、第3の浮動小数点形式は、第2の浮動小数点形式よりも高い精度を有する。
【0123】
実施形態5は、実施形態1から実施形態4のいずれか1つの方法であって、ハードウェア回路は、複数の層を有するニューラルネットワークのために計算を実行するように構成され、入力活性化値および重み入力値は、複数の層のうちのある層に関連付けられる。
【0124】
実施形態6は、実施形態1から実施形態5のいずれか1つの方法であって、第1の行列計算セルのために第3の浮動小数点形式を有する生の活性化値および生の重み値を取得することと、生の活性化値を第1の浮動小数点形式に変換して入力活性化値を生成することと、生の重み値を第1の浮動小数点形式に変換して重み入力値を生成することとをさらに備える。
【0125】
実施形態7は、実施形態1から実施形態6のいずれか1つの方法であって、生の活性化値を高精度で処理する要求を受け取ることと、入力値に対して活性化高精度値を生成することとをさらに備え、活性化高精度値は、活性化入力値と生の活性化値との差の尺度であり、方法はさらに、重み入力値に対して重み高精度値を生成することを備え、重み高精度値は、重み入力値と生の重み値との差の尺度であり、活性化入力値と重み入力値とを乗算して積値を生成することは、行列計算ユニットの乗算回路が、入力値と重み入力値との乗算、入力値と重み高精度値との乗算、重み入力値と活性化高精度値との乗算、および活性化高精度値と重み高精度値との乗算を実行することと、乗算の積を結合して積値を生成することとを含む。
【0126】
実施形態8は、ハードウェア回路であって、第1のグループの動作を実行するように構成された行列計算ユニットを備え、第1のグループの動作は、活性化入力値および重み入力値を取得することを含み、活性化入力値および重み入力値は両方とも第1の浮動小数点形式を有し、第1のグループの動作はさらに、重み入力値を重みレジスタに格納することを含み、重みレジスタは第1の浮動小数点形式を有する値を格納するよう構成され、第1のグループの動作はさらに、ハードウェア回路の乗算回路を用いて、活性化入力値と重み入力値とを乗算して積値を生成することを含み、積値は、第1の浮動小数点形式よりも精度が高く、少なくとも第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する第2の浮動小数点形式を有し、第1のグループの動作はさらに、第1の浮動小数点形式よりも精度が高く、少なくとも第1の浮動小数点形式のダイナミックレンジと同じ大きさのダイナミックレンジを有する第3の浮動小数点形式で、部分和値を取得することと、部分和値を総和レジスタに格納することとを含み、総和レジスタは、第3の浮動小数点形式を有する値を格納するように構成され、第1のグループの動作はさらに、行列計算ユニットの合計回路を用いて、部分和値と積値とを結合して、第3の浮動小数点形式を有する更新された部分和値を生成することを含む。
【0127】
実施形態9は、実施形態8のハードウェア回路であって、第1のグループの動作はさらに、活性化入力値を活性化レジスタに格納することを含み、活性化レジスタは、第1の浮動小数点形式を有する値を格納するように構成される。
【0128】
実施形態10は、実施形態8または実施形態9のハードウェア回路であって、第1のグループの動作はさらに、重み入力値を重みレジスタに格納することを含み、重みレジスタは第1の浮動小数点形式を有する値を格納するよう構成される。
【0129】
実施形態11は、実施形態8から実施形態10のいずれか1つのハードウェア回路であって、第1のグループの動作はさらに、部分和値を総和レジスタに格納することを含み、総和レジスタは、第3の浮動小数点形式を有する値を格納するように構成される。
【0130】
実施形態12は、実施形態8から実施形態11のいずれか1つのハードウェア回路であって、行列演算ユニットの外部に外部の合計回路をさらに備え、第1のグループの動作はさらに、生の活性化値を高精度で処理する要求を受け取ることと、入力値に対して活性化高精度値を生成することとを含み、活性化高精度値は、活性化入力値と生の活性化値との差の尺度であり、第1のグループの動作はさらに、重み入力値に対して重み高精度値を生成することを含み、重み高精度値は、重み入力値と生の重み値との差の尺度であり、活性化入力値と重み入力値とを乗算して積値を生成することは、行列計算ユニットの乗算回路が、入力値と重み入力値との乗算、入力値と重み高精度値との乗算、重み入力値と活性化高精度値との乗算、および活性化高精度値と重み高精度値との乗算を実行することを含み、外部の合計回路は、第2のグループの動作を実行するように構成され、第2のグループの動作は、乗算の積を結合して積値を生成することを含む。
【0131】
実施形態13は、1つ以上のコンピュータと、1つ以上のコンピュータによって実行されると1つ以上のコンピュータに実施形態1から実施形態7のいずれか1つのそれぞれの方法の動作を実行させるよう動作可能な命令を記憶する1つ以上の記憶装置とを備えるシステムである。
【0132】
実施形態14は、1つ以上のコンピュータによって実行されると1つ以上のコンピュータに実施形態1から実施形態7のいずれか1つのそれぞれの方法の動作を実行させる命令でエンコードされたコンピュータ記憶媒体である。
【0133】
実施形態15は、1つ以上のコンピュータと、1つ以上のコンピュータによって実行されると1つ以上のコンピュータに実施形態8から実施形態12のいずれか1つのそれぞれのハードウェア回路の動作を実行させるよう動作可能な命令を記憶する1つ以上の記憶装置とを備えるシステムである。
【0134】
実施形態16は、1つ以上のコンピュータによって実行されると1つ以上のコンピュータに実施形態8から実施形態12のいずれか1つのそれぞれのハードウェア回路の動作を実行させる命令でエンコードされたコンピュータ記憶媒体である。
【0135】
本明細書は多くの特定の実現例の詳細を含んでいるが、これらは如何なる発明の範囲または請求され得るものの範囲に対する限定としても解釈されるべきではなく、特定の発明の特定の実施形態に特有の特徴であり得る記載として解釈されるべきである。別個の実施形態の文脈で本明細書において記載されるある特徴は、単一の実施形態において組合せでも実現され得る。反対に、単一の実施形態の文脈において記載されるさまざまな特徴は、複数の実施形態において別々に、または任意の好適な部分的組合わせでも実現され得る。さらに、特徴は、ある組合せにおいて作用すると上で記載され、最初はそのように請求されていさえする場合もあるが、請求される組合せからの1つ以上の特徴はいくつかの場合には当該組合せから削除され得、請求される組合せは、部分的組合わせまたは部分的組合わせの変形例に向けられ得る。
【0136】
同様に、動作が図においては特定の順に示されているが、そのような動作は、望ましい結果を達成するために、示された当該特定の順もしくは連続した順で実行される必要があると理解されるべきではなく、または、すべての示された動作が実行される必要があると理解されるべきではない。ある状況においては、マルチタスキングおよび並列処理が有利であり得る。さらに、上述の実施形態におけるさまざまなシステムモジュールおよびコンポーネントの分離は、すべての実施形態においてそのような分離を必要とすると理解されるべきではなく、記載されるプログラムコンポーネントおよびシステムは一般に単一のソフトウェア製品に統合され得るかまたは複数のソフトウェア製品にパッケージ化され得ることが理解されるべきである。
【0137】
主題の特定の実施形態が記載された。他の実施形態は以下の請求の範囲内にある。たとえば、請求項において記載されるアクションは、異なる順で実行され得、それでも望ましい結果を達成し得る。一例として、添付の図において示されるプロセスは、望ましい結果を達成するために、示された特定の順または連続する順であることを必ずしも必要としない。ある実現例においては、マルチタスキングおよび並列処理が有利であり得る。