(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-09-26
(45)【発行日】2024-10-04
(54)【発明の名称】ニューラルネットワークプロセッサにおけるバッチ処理
(51)【国際特許分類】
G06N 3/063 20230101AFI20240927BHJP
【FI】
G06N3/063
【外国語出願】
(21)【出願番号】P 2023085256
(22)【出願日】2023-05-24
(62)【分割の表示】P 2022025744の分割
【原出願日】2016-05-03
【審査請求日】2023-05-31
(32)【優先日】2015-05-21
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2015-09-03
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】502208397
【氏名又は名称】グーグル エルエルシー
【氏名又は名称原語表記】Google LLC
【住所又は居所原語表記】1600 Amphitheatre Parkway 94043 Mountain View, CA U.S.A.
(74)【代理人】
【識別番号】110001195
【氏名又は名称】弁理士法人深見特許事務所
(72)【発明者】
【氏名】ヤング,レジナルド ・クリフォード
【審査官】北川 純次
(56)【参考文献】
【文献】特開2004-157756(JP,A)
【文献】特開平06-203005(JP,A)
【文献】米国特許出願公開第2014/0142929(US,A1)
(58)【調査した分野】(Int.Cl.,DB名)
G06N 3/02- 3/10
G06N 20/00-20/20
(57)【特許請求の範囲】
【請求項1】
複数のニューラルネットワーク層を有するニューラルネットワークのためにニューラルネットワーク計算を実行するための方法であって、
処理対象の複数の層入力を取得するステップと、
ニューラルネットワークハードウェア回路のハードウェア行列計算ユニットがニューラルネットワーク計算のための重み入力を再使用する回数を表す重み再使用値を特定するステップと、
第1のニューラルネットワーク層のための、前記複数の層入力のうちの層入力を含むいくつかのバッチを、前記ハードウェア行列計算ユニットによって処理するステップとを備え、
各前記いくつかのバッチ
のバッチサイズは、前記重み再使用値に対応
し、
前記バッチサイズは、前記ハードウェア行列計算ユニットによって並列処理される層入力の数を表す、方法。
【請求項2】
前記重み再使用値は、少なくとも、重み入力を格納するメモリのクロックレートに基づく、請求項1に記載の方法。
【請求項3】
前記重み再使用値は、少なくとも、前記ハードウェア行列計算ユニット内のハードウェア演算ユニットの数に基づく、請求項1に記載の方法。
【請求項4】
前記複数のニューラルネットワーク層における前記第1のニューラルネットワーク層に続く層のバッチサイズに基づいて前記
各いくつかのバッチ
の前記バッチサイズを決定するステップをさらに備える、請求項1~3のいずれかに記載の方法。
【請求項5】
少なくとも、
前記重み再使用値を前記複数の層入力
の数で除算
して得られた値に基づいて、
前記各
いくつかのバッチについて
前記バッチサイズを決定するステップをさらに備える、請求項1~4のいずれかに記載の方法。
【請求項6】
前記いくつかのバッチを処理するステップは、前記ニューラルネットワークハードウェア回路の前記ハードウェア行列計算ユニットを使用して各層入力について累積値を計算するステップを含む、請求項1~5のいずれかに記載の方法。
【請求項7】
1つまたは複数の層出力に基づいて1つまたは複数の推測値を決定するステップをさらに備える、請求項6に記載の方法。
【請求項8】
前記複数のニューラルネットワーク層について、前記複数のニューラルネットワーク層にわたるバッチサイズの最小公倍数を決定するステップと、
前記最小公倍数以上の最小数の層入力を含む前記バッチサイズを決定するステップとを
さらに備える、請求項1~7のいずれかに記載の方法。
【請求項9】
各層入力は、個別の画像リソースの特徴に対応する、請求項1~8のいずれかに記載の方法。
【請求項10】
前記複数のニューラルネットワーク層は、有向グラフ構造で配置される、請求項1~9のいずれかに記載の方法。
【請求項11】
複数のニューラルネットワーク層を有するニューラルネットワークのためにニューラルネットワーク計算を実行するためのシステムであって、
1つまたは複数のプロセッサと、
コンピュータ読取可能媒体とを備え、前記コンピュータ読取可能媒体は、前記1つまたは複数のプロセッサに結合されており、命令を格納しており、前記命令は、前記1つまたは複数のプロセッサによって実行されると、前記1つまたは複数のプロセッサに動作を実行させ、前記動作は、
処理対象の複数の層入力を取得するステップと、
ニューラルネットワークハードウェア回路のハードウェア行列計算ユニットがニューラルネットワーク計算のための重み入力を再使用する回数を表す重み再使用値を特定するステップと、
第1のニューラルネットワーク層のための、前記複数の層入力のうちの層入力を含むいくつかのバッチを、前記ハードウェア行列計算ユニットによって処理するステップとを備え、
各前記いくつかのバッチ
のバッチサイズは、前記重み再使用値に対応
し、
前記バッチサイズは、前記ハードウェア行列計算ユニットによって並列処理される層入力の数を表す、システム。
【請求項12】
前記重み再使用値は、少なくとも、重み入力を格納するメモリのクロックレートに基づく、請求項11に記載のシステム。
【請求項13】
前記重み再使用値は、少なくとも、前記ハードウェア行列計算ユニット内のハードウェア演算ユニットの数に基づく、請求項11に記載のシステム。
【請求項14】
前記動作は、
前記複数のニューラルネットワーク層における前記第1のニューラルネットワーク層に続く層のバッチサイズに基づいて前記
各いくつかのバッチ
のバッチサイズを決定するステップをさらに備える、請求項11~13のいずれかに記載のシステム。
【請求項15】
前記各
いくつかのバッチについての
バッチサイズは、少なくとも、
前記重み再使用値を前記複数の層入力の
数で除算
して得られた値に基づいて決定される、請求項11~14のいずれかに記載のシステム。
【請求項16】
前記いくつかのバッチを処理するステップは、前記ニューラルネットワークハードウェア回路の前記ハードウェア行列計算ユニットを使用して各層入力について累積値を計算するステップを含む、請求項11~15のいずれかに記載のシステム。
【請求項17】
1つまたは複数の層出力に基づいて1つまたは複数の推測値を決定するステップをさらに備える、請求項16に記載のシステム。
【請求項18】
前記
動作は、
前記複数のニューラルネットワーク層について、前記複数のニューラルネットワーク層にわたるバッチサイズの最小公倍数を決定するステップと、
前記最小公倍数以上の最小数の層入力を含む前記バッチサイズを決定するステップとを
さらに備える、請求項11~17のいずれかに記載のシステム。
【請求項19】
請求項1から10のいずれか1項に記載の方法をプロセッサに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
背景
本明細書は、ハードウェアにおいてニューラルネットワーク推測値を計算することに関する。
【背景技術】
【0002】
ニューラルネットワークは、ニューロンの1つ以上の層を利用して、受け取った入力について出力、たとえば分類を生成する機械学習モデルである。いくつかのニューラルネットワークは、出力層に加えて1つ以上の隠れ層を含む。各隠れ層の出力は、ネットワーク内の次の層、すなわちネットワークの次の隠れ層または出力層、への入力として使用される。ネットワークの各層は、パラメータのそれぞれのセットの現在の値に従って、受け取った入力から出力を生成する。
【0003】
従来より、いくつかのニューラルネットワークシステムは、連続的に推測値を計算する。すなわち、複数の入力について推測値を計算するとき、ニューラルネットワークシステムは、ニューラルネットワークの各層を介して各入力を処理して、次の入力を処理する前に当該入力について出力を生成することができる。
【発明の概要】
【発明が解決しようとする課題】
【0004】
概要
全体として、本明細書では、ニューラルネットワーク推測値を計算する特定目的ハードウェア回路について説明する。
【課題を解決するための手段】
【0005】
全体として、本明細書に記載されている主題の1つの革新的な局面は、複数の入力の各々についてそれぞれのニューラルネットワーク出力を生成する動作を含む方法で実施することができ、上記生成することは、複数のニューラルネットワーク層の各々を介して各入力を処理して、上記入力について上記それぞれのニューラルネットワーク出力を生成することを備え、上記ニューラルネットワーク層は、ある順序で配置され、各ニューラルネットワーク層は、それぞれのバッチサイズを有し、上記方法は、上記ニューラルネットワーク層の各々について、上記ニューラルネットワーク層で処理される複数の入力を受け取るステップと、上記複数の入力から入力の1つ以上のバッチを形成するステップとを備え、各バッチは、上記ニューラルネットワーク層の上記それぞれのバッチサイズまでのいくつかの入力を有し、上記方法はさらに、上記ニューラルネットワーク層の各々について、処理のために上記入力の1つ以上のバッチのうちのいくつかを選択するステップを備え、上記1つ以上のバッチのうちのいくつかにおける上記入力の個数は、上記順序内の後続の層のそれぞれの関連付けられたバッチサイズよりも多いか、または当該バッチサイズに等しく、上記方法はさらに、上記ニューラルネットワーク層の各々について、上記入力の1つ以上のバッチのうちのいくつかを処理して、上記それぞれのニューラルネットワーク層出力を生成するステップを備える。
【0006】
実現例は、以下の特徴のうちの1つ以上を含み得る。上記それぞれのバッチサイズは、少なくとも重み再使用値に基づき、上記重み再使用値は、行列計算ユニットで重み入力を使用して出力値の計算時間の間に上記重み入力を再使用する必要がある回数が、メモリからの上記重み入力のロード時間よりも長いことを表わす。上記重み再使用値は、少なくとも、上記重み入力を格納する上記メモリのクロックレートに基づく。各バッチサイズは、
少なくとも、上記それぞれの層の重み入力が再使用される回数で除算される上記重み再使用値に基づく。上記複数のニューラルネットワーク層は、行列処理ユニットで処理され、上記入力の1つ以上のバッチのうちのいくつかを処理するステップは、上記行列計算ユニットを使用して各入力について累積値を計算するステップを備える。上記重み再使用値は、上記行列計算ユニット内の演算ユニットの数に基づく。各入力は、個別の画像リソースに対応する。上記後続の層での処理のために上記1つ以上の層出力からバッチを形成するステップをさらに備える。各出力について対応する推測値を生成するステップをさらに備える。
【0007】
本明細書に記載されている主題の特定の実施形態は、以下の利点のうちの1つ以上を達成するように実現することができる。特定目的ハードウェア回路は、複数の独立した入力上で所与の層について重み入力を再使用することによって、複数の層を有するニューラルネットワークについて計算を効率的に実行することができる。特に、重み入力は、重み入力を複数回再使用する計算時間が、メモリから新たな重み入力にアクセスするフェッチ時間よりも大きいような回数再使用され、それによって、回路内のスループットを最大化して回路の失速を回避する。当該回路は、たとえ重み入力が各層において異なる回数再使用されたとしても、計算を効率的に実行することができる。
【0008】
本明細書の主題の1つ以上の実施形態の詳細が添付の図面および以下の説明に記載されている。主題の他の特徴、局面および利点は、説明、図面および特許請求の範囲から明らかになるであろう。
【図面の簡単な説明】
【0009】
【
図1】ニューラルネットワークの所与の層について計算を実行するための例示的な方法のフロー図である。
【
図2】例示的なニューラルネットワーク処理システムを示す。
【
図3】行列計算ユニットを含む例示的なアーキテクチャを示す。
【
図4】シストリックアレイ内のセルの例示的なアーキテクチャを示す。
【
図5】複数の層についてニューラルネットワーク計算を実行するための例示的な方法のフロー図である。
【
図6】複数の層と各層のバッチサイズとを有する例示的なニューラルネットワークを示す。
【発明を実施するための形態】
【0010】
さまざまな図における同様の参照番号および名称は、同様の要素を示す。
詳細な説明
複数の層を有するニューラルネットワークは、推測値の計算に使用することができる。たとえば、入力を前提として、ニューラルネットワークは当該入力について推測値を計算することができる。ニューラルネットワークは、ニューラルネットワークの各層を介して入力を処理することによってこの推測値を計算する。特に、ニューラルネットワークの層は、各々が重みのそれぞれのセットを有する状態で、ある順序で配置され得る。各層は、入力を受け取って、当該層の重みのセットに従って入力を処理して、出力を生成する。当該出力は、次のニューラルネットワーク層において入力として使用することができる。
【0011】
したがって、受け取った入力から推測値を計算するために、ニューラルネットワークは、当該入力を受け取って、当該順序でニューラルネットワーク層の各々を介してそれを処理して、推測値を生成し、1つのニューラルネットワーク層からの出力は、次のニューラルネットワーク層への入力として提供される。ニューラルネットワーク層へのデータ入力、たとえばニューラルネットワークへの入力または当該順序内の当該層の下方にある層の、ニューラルネットワーク層への出力、は、当該層への起動入力と称することができる。
【0012】
いくつかの実現例では、ニューラルネットワークの層は、有向グラフ構造で配置される。すなわち、任意の特定の層が複数の入力、複数の出力、またはそれら両方を受け取ることができる。また、ニューラルネットワークの層は、層の出力を前の層への入力として送り返すことができるように配置することもできる。
【0013】
図1は、特定目的ハードウェア回路を使用してニューラルネットワークの所与の層について計算を実行するための例示的なプロセス100のフロー図である。便宜上、方法100は、方法100を実行する1つ以上の回路を有するシステムに関連して説明する。方法100は、受け取った入力から推測値を計算するためにニューラルネットワークの各層について実行され得る。
【0014】
当該システムは、所与の層についての重み入力の複数のセットを受け取り(ステップ102)、所与の層についての起動入力の複数のセットを受け取る(ステップ104)。重み入力の複数のセットおよび起動入力の複数のセットは、それぞれ特定目的ハードウェア回路のダイナミックメモリおよび統合バッファから受け取られることができる。いくつかの実現例では、重み入力の複数のセットも起動入力の複数のセットも統合バッファから受け取られてもよい。
【0015】
当該システムは、特定目的ハードウェア回路の行列乗算ユニットを使用して重み入力および起動入力から累積値を生成する(ステップ106)。いくつかの実現例では、累積値は、重み入力の複数のセットと起動入力の複数のセットとのドット積である。すなわち、重みの1つのセットについて、当該システムは、各重み入力と各起動入力とを掛け合わせ、その積を合計して、累積値を形成することができる。次いで、当該システムは、重みの他のセットと起動入力の他の複数のセットとのドット積を計算することができる。
【0016】
当該システムは、特定目的ハードウェア回路のベクトル計算ユニットを使用して累積値から層出力を生成することができる(ステップ108)。いくつかの実現例では、ベクトル計算ユニットは、起動関数を累積値に適用する。層の出力は、ニューラルネットワーク内の後続の層への入力として使用できるように統合バッファに格納されてもよく、または推測値を求めることに使用されてもよい。当該システムは、受け取った入力をニューラルネットワークの各層を介して処理して受け取った入力について推測値を生成すると、ニューラルネットワークを処理することを終了する。
【0017】
図2は、ニューラルネットワーク計算を実行するための例示的な特定目的集積回路200を示す。システム200は、ホストインターフェイス202を含む。ホストインターフェイス202は、ニューラルネットワーク計算のための構成情報を含む命令を受け取ることができる。構成情報は、何個の層を処理すべきであるか、層の各層についての重み入力の対応する複数のセット、起動入力の最初のセット、すなわち推測値を計算するためのニューラルネットワークへの入力、各層の対応する入力および出力サイズ、ニューラルネットワーク計算のためのストライド値、および処理すべき層のタイプ、たとえば畳み込み層または完全に接続された層、のうちの少なくとも1つ以上を含み得る。
【0018】
ホストインターフェイス202は、シーケンサ206に命令を送ることができ、シーケンサ206は、当該命令を、ニューラルネットワーク計算を実行するように回路を制御する低レベル制御信号に変換する。いくつかの実現例では、当該制御信号は、回路内のデータフロー、たとえば重み入力の複数のセットおよび起動入力の複数のセットがどのように回路内を流れるか、を調整する。シーケンサ206は、統合バッファ208、行列計算ユニット212およびベクトル計算ユニット214に当該制御信号を送ることができる。いくつかの実現例では、シーケンサ206は、ダイレクトメモリアクセスエンジン204お
よびダイナミックメモリ210にも制御信号を送る。いくつかの実現例では、シーケンサ206は、クロック信号を生成するプロセッサである。シーケンサ206は、当該クロック信号のタイミングを使用して、回路200の各コンポーネントに当該制御信号を適切なときに送ることができる。いくつかの他の実現例では、ホストインターフェイス202は、外部プロセッサからクロック信号を渡す。
【0019】
ホストインターフェイス202は、ダイレクトメモリアクセスエンジン204に重み入力の複数のセットおよび起動入力の最初のセットを送ることができる。ダイレクトメモリアクセスエンジン204は、起動入力の複数のセットを統合バッファ208に格納することができる。いくつかの実現例では、ダイレクトメモリアクセスは、メモリユニットであり得るダイナミックメモリ210に重みの複数のセットを格納する。いくつかの実現例では、ダイナミックメモリは、回路から離れて位置している。
【0020】
統合バッファ208は、メモリバッファである。統合バッファ208を使用して、ダイレクトメモリアクセスエンジン204からの起動入力のセットおよびベクトル計算ユニット214の出力を格納することができる。ダイレクトメモリアクセスエンジン204は、ベクトル計算ユニット214の出力を統合バッファ208から読み出すこともできる。
【0021】
ダイナミックメモリ210および統合バッファ208は、行列計算ユニット212に重み入力の複数のセットおよび起動入力の複数のセットをそれぞれ送ることができる。いくつかの実現例では、行列計算ユニット212は、二次元シストリックアレイである。行列計算ユニット212は、一次元シストリックアレイであってもよく、または数学的演算、たとえば乗算および加算を実行することができる他の回路であってもよい。いくつかの実現例では、行列計算ユニット212は、汎用行列プロセッサである。
【0022】
行列計算ユニット212は、重み入力および起動入力を処理して、ベクトル計算ユニット214に出力のベクトルを提供することができる。いくつかの実現例では、行列計算ユニットは、統合バッファ208に出力のベクトルを送り、統合バッファ208は、ベクトル計算ユニット214に出力のベクトルを送る。ベクトル計算ユニットは、出力のベクトルを処理して、処理された出力のベクトルを統合バッファ208に格納することができる。たとえば、ベクトル計算ユニット214は、非線形関数を行列計算ユニットの出力、たとえば累積値のベクトルに適用して、起動値を生成することができる。いくつかの実現例では、ベクトル計算ユニット214は、正規化値、プール値、またはそれら両方を生成する。処理された出力のベクトルは、たとえばニューラルネットワーク内の後続の層で使用できるように、行列計算ユニット212への起動入力として使用することができる。行列計算ユニット212については、
図3および
図4を参照して以下でさらに詳細に説明する。
【0023】
図3は、行列計算ユニットを含む例示的なアーキテクチャ300を示す。行列計算ユニットは、二次元シストリックアレイ306である。アレイ306は、複数のセル304を含む。いくつかの実現例では、シストリックアレイ306の第1の次元320はセルの列に対応し、シストリックアレイ306の第2の次元322はセルの行に対応する。シストリックアレイは、列よりも多くの行を有していてもよく、行よりも多くの列を有していてもよく、または列と行とが同数であってもよい。
【0024】
示されている例では、値ローダ302がアレイ306の行に起動入力を送り、重みフェッチャインターフェイス308がアレイ306の列に重み入力を送る。しかし、いくつかの他の実現例では、起動入力がアレイ306の列に送信され、重み入力がアレイ306の行に送信される。
【0025】
値ローダ302は、統合バッファ、たとえば
図2の統合バッファ208から起動入力を受け取ることができる。各値ローダは、対応する起動入力をアレイ306の個別の最も左側のセルに送ることができる。最も左側のセルは、アレイ306の最も左側の列に沿ったセルであり得る。たとえば、値ローダ312は、セル314に起動入力を送ることができる。値ローダは、隣接する値ローダにも起動入力を送ることができ、起動入力は、アレイ306の別の最も左側のセルで使用することができる。これにより、アレイ306の別の特定のセルで使用できるように起動入力をシフトすることができる。
【0026】
重みフェッチャインターフェイス308は、メモリユニット、たとえば
図2のダイナミックメモリ210から重み入力を受け取ることができる。重みフェッチャインターフェイス308は、対応する重み入力をアレイ306の個別の最上部のセルに送ることができる。最上部のセルは、アレイ306の最上部の行に沿ったセルであり得る。たとえば、重みフェッチャインターフェイス308は、セル314および316に重み入力を送ることができる。
【0027】
いくつかの実現例では、ホストインターフェイス、たとえば
図2のホストインターフェイス202は、アレイ306全体にわたって1つの次元に沿って、たとえば右側まで起動入力をシフトし、アレイ306全体にわたって別の次元に沿って、たとえば下部まで重み入力をシフトする。たとえば、1つのクロックサイクルで、セル314における起動入力は、セル314の右側のセル316における起動レジスタにシフトすることができる。同様に、セル316における重み入力は、セル314の下方のセル318における重みレジスタにシフトすることができる。
【0028】
各クロックサイクルで、各セルは、所与の重み入力および所与の起動入力を処理して、累積出力を生成することができる。累積出力は、所与の重み入力と同一の次元に沿って隣接するセルにも渡されることができる。個々のセルについては、
図4を参照して以下でさらに説明する。
【0029】
累積出力は、重み入力と同一の列に沿って、たとえばアレイ306内の列の下部の方に渡されることができる。いくつかの実現例では、アレイ306は、列よりも多くの重み入力を有する層または行よりも多くの起動入力を有する層で算出を実行するときに各列から各累積出力を格納して累積するアキュムレータユニット310を各列の下部に含み得る。いくつかの実現例では、各アキュムレータユニットは、複数の並列累積値を格納する。これについては、
図6を参照して以下でさらに説明する。アキュムレータユニット310は、各累積出力を累積して、最終的な累積値を生成することができる。最終的な累積値は、ベクトル計算ユニットに送信されることができる。いくつかの他の実現例では、アキュムレータユニット310は、列よりも少ない重み入力を有する層または行よりも少ない起動入力を有する層を処理するときにいかなる累積も実行することなく累積値をベクトル計算ユニットに渡す。
【0030】
図4は、シストリックアレイ、たとえば
図3のシストリックアレイ306内のセルの例示的なアーキテクチャ400を示す。
【0031】
セルは、起動入力を格納する起動レジスタ406を含み得る。起動レジスタは、シストリックアレイ内のセルの位置に応じて、左側の隣接するセル、すなわち所与のセルの左側に位置する隣接するセルから、または統合バッファから起動入力を受け取ることができる。セルは、重み入力を格納する重みレジスタ402を含み得る。重み入力は、シストリックアレイ内のセルの位置に応じて、上側の隣接するセルから、または重みフェッチャインターフェイスから送信されることができる。セルは、合計レジスタ404も含み得る。合計レジスタ404は、上側の隣接するセルからの累積値を格納することができる。乗算回
路408は、重みレジスタ402からの重み入力と起動レジスタ406からの起動入力とを掛け合わせることに使用することができる。乗算回路408は、その積を総和回路410に出力することができる。
【0032】
総和回路は、その積と合計レジスタ404からの累積値とを総計して、新たな累積値を生成することができる。次いで、総和回路410は、下側の隣接するセルに位置する別の合計レジスタに当該新たな累積値を送ることができる。当該新たな累積値は、下側の隣接するセルでの総計のためのオペランドとして使用することができる。
【0033】
また、セルは、処理のために重み入力および起動入力を隣接するセルにシフトさせることもできる。たとえば、重みレジスタ402は、下側の隣接するセルにおける別の重みレジスタに重み入力を送ることができる。起動レジスタ406は、右側の隣接するセルにおける別の起動レジスタに起動入力を送ることができる。したがって、重み入力も起動入力も、後続のクロックサイクルでアレイ内の他のセルによって再使用することができる。
【0034】
いくつかの実現例では、セルは制御レジスタも含む。制御レジスタは、セルが隣接するセルに重み入力をシフトすべきであるか起動入力をシフトすべきであるかを判断する制御信号を格納することができる。いくつかの実現例では、重み入力または起動入力のシフトは、1つ以上のクロックサイクルを要する。制御信号は、起動入力を乗算回路408に送信するか重み入力を乗算回路408に送信するかを判断することもでき、または、乗算回路408が起動入力および重み入力上で動作するか否かを判断することもできる。制御信号も、たとえばワイヤを使用して1つ以上の隣接するセルに渡されることができる。
【0035】
いくつかの実現例では、重みは、重みパスレジスタ412に事前にシフトされる。重みパスレジスタ412は、たとえば上側の隣接するセルから重み入力を受け取って、制御信号に基づいて重み入力を重みレジスタ402に送信することができる。重みレジスタ402は、たとえば起動レジスタ406を介して複数のクロックサイクルで起動入力がセルに送信されるときに重み入力がセル内にとどまって隣接するセルに送信されないように、重み入力を静的に格納することができる。したがって、重み入力は、たとえば乗算回路408を使用して複数の起動入力に適用可能であり、それぞれの累積値は、隣接するセルに送信されることができる。
【0036】
いくつかの実現例では、1つのニューラルネットワーク入力がニューラルネットワークの各層を介して処理されて、当該ニューラルネットワーク入力についてニューラルネットワーク出力が生成される。しかし、いくつかの実現例では、回路は、ニューラルネットワークの層を介して複数のニューラルネットワーク入力を速やかに処理して、当該入力についてニューラルネットワーク出力を生成し、それによって回路の利用率を上げる。
【0037】
ニューラルネットワークの特定の層への入力は、起動入力のセットと称することができる。したがって、ニューラルネットワーク入力は、第1の層への起動入力のセットであり得る。第1の層は、第2の層によって処理される出力を生成することができ、当該出力は、第2の層への起動入力のセットと称することができる。
【0038】
いくつかの実現例では、回路は、ニューラルネットワークの第1の層から最後の層に起動入力を送ることによって起動入力の1つのセットを処理して推測値を生成する代わりに、第1の層において起動入力の複数のセットを処理し、たとえば
図3に上記されるように起動入力の各セットについて累積値を生成し、次いで第2の層において起動入力の複数のセットを処理する、などを行うことができる。所与の層における起動入力の複数のセットは、入力の1つ以上のバッチを構成することができる。いくつかの実現例では、所与の層のバッチは、回路が後続の層のバッチを処理する前に処理される。回路は、各入力につい
て累積値を生成することによってバッチを処理することができ、当該累積値は、バッチ内の起動入力の独立したセットであり得る。
【0039】
いくつかの実現例では、所与のニューラルネットワーク層について計算を実行しながらスループットを最大化するために、回路は、当該所与のニューラルネットワーク層についての重み入力がシストリックアレイにロードされている間に複数の独立した起動入力を処理するようにされることができる。すなわち、重み入力は、複数の起動入力で再使用することができる。特に、回路は、たとえば
図2の行列計算ユニット212を使用して、重み入力およびさまざまな起動入力を使用して累積値を計算することによって、重み入力を再使用する。例示として、起動入力は、複数の異なる画像リソースまたは複数の音声サンプルからのものであってもよい。これについては、
図6を参照して以下でさらに説明する。
【0040】
回路は、処理速度と、回路がメモリにアクセスできる速度とを有する。一般に、処理速度はメモリアクセス速度よりも速い。重みを再使用し、それによって回路の処理速度を利用することによって、回路は、その後の計算で使用される重み入力にメモリからアクセスしながら並行してシストリックアレイのセルを利用することができる。
【0041】
回路は、ニューラルネットワークの各層について、回路の重み再使用値から重みを何回再使用するかを判断することができる。これは、ハードウェアのためにコンパイルを行っている回路上のソフトウェアによって判断されてもよく、またはハードウェアによって判断されてもよい。いくつかの実現例では、重み再使用値とは、異なる起動入力で何度も重み入力を再使用する計算時間が、メモリから新たな重み入力にアクセスするフェッチ時間以上になる前に回路が重み入力を再使用することができる回数である。したがって、重み再使用値は、利用率を最大化してメモリアクセス待機時間を最小化するために回路が重み入力を何回再使用すべきであるかを示すことができる。
【0042】
重み再使用値は、重み入力を格納しているメモリ、たとえば
図2のダイナミックメモリ210のクロックレート、回路内、たとえば
図2の行列計算ユニット212内の演算ユニットの数、ならびに、メモリ、たとえば
図2の統合バッファ208およびダイナミックメモリ210におけるチャネルの数のうちの1つ以上に基づき得る。重み再使用値を使用して、ニューラルネットワークの各層のそれぞれのバッチサイズを求めることができる。バッチサイズは、有効バッチサイズ、すなわち最も効率的な重み再使用量を生成する態様で層が動作することを可能にするバッチサイズ、と称することができる。バッチサイズは、回路内のシストリックアレイが最大化されるように層で処理される入力の数である。いくつかの実現例では、所与の層のバッチサイズは、当該層において重み入力が再使用される回数で除算される重み再使用値の上限である。重み入力が再使用される回数は、累積算出を実行するときに回路のシストリックアレイのセルに格納される起動入力の数に直接対応し得る。その理由は、新たな起動入力の複数のセットがロードされている間は、重み入力がセル内にとどまっている、すなわち「一時停止される」可能性があるからである。重み入力が所定の位置でフリーズしている状態で新たな起動入力の複数のセットがロードされると、回路は、再び重み入力を再使用して、当該新たな起動入力の複数のセットを用いて畳み込みを算出することができる。一例については、
図6を参照して以下でさらに説明する。
【0043】
図5は、複数の層についてニューラルネットワーク計算を実行するための例示的な方法のフロー
図500である。当該方法は、特定目的ハードウェア回路によって、たとえば
図2のホスト202を使用して、または1つ以上のプロセッサ、ファームウェア、オフチッププロセスによって、または回路を制御するように構成された何らかの他のソフトウェアプロセスによって実行することができる。
【0044】
回路は、各ニューラルネットワーク層での処理中に、層による処理のために層入力のセットを受け取ることができる(ステップ502)。層入力のセットは、メモリ、たとえば
図2の統合バッファ208からのものであってもよく、または前の層からのものであってもよく、すなわち、入力のセットは、ネットワーク内の前の層から生成された出力であり、当該出力を入力のセットとして使用することは、
図2を参照して上記したホスト202によって管理することができる。各入力は、起動入力のセットであり得て、独立したニューラルネットワーク入力から生成することができる。
【0045】
当該システムは、所与のニューラルネットワーク層について、入力のセットから入力の1つ以上のバッチを形成することができる(ステップ504)。上記のように、各ニューラルネットワーク層は、関連付けられたバッチサイズを有する。当該層における各々の形成されたバッチは、層のバッチサイズを超えないいくつかの入力を含む。各ニューラルネットワーク層のバッチサイズは、ニューラルネットワークの構成として求めることができる。いくつかの実現例では、各ニューラルネットワーク層のバッチサイズは、回路上での実行のためにニューラルネットワークモデルをコンパイルするときに計算される。層で処理が開始する前に所与の層のバッチサイズを計算できるので、バッチ内のいくつかの入力は、所与の層のバッチサイズに基づいて形成することができる。
【0046】
一例として、ニューラルネットワークが24個の画像を処理する必要があり、ニューラルネットワークの第1の層が8というバッチサイズを有している場合、回路は、各々が8個の画像からなる3個のバッチを形成する、すなわち24個の画像を、各々が8個の入力からなる3個のバッチに分割することができる。各バッチについて、回路は、当該層の重み入力の特定のセットを再使用することによってバッチ内の8個の個別の画像を処理することができる。次いで、回路は、(1)後続の層において1つ以上のバッチを処理するか、または(2)重み入力の特定のセットを使用して当該層において8個の個別の画像リソースの別のバッチを処理するかのいずれかを行うことができる。回路は、ニューラルネットワーク内の他の層のバッチサイズに基づいて(1)に進むか(2)に進むかを判断し、これについては、ステップ506においておよび
図6を参照して以下でさらに説明する。
【0047】
回路は、所与のニューラルネットワーク層について、処理のために入力の1つ以上のバッチのうちのいくつかを選択することができる(ステップ506)。いくつかの実現例では、当該数は、1つ以上のバッチのうちのいくつかにおける入力の個数が、後続の層の対応するバッチサイズ以上であるように選択される。たとえば、現在の層が、各々が5個の入力を有する3個のバッチを処理しなければならず、後続の層が10というバッチサイズを有している場合、回路は、処理のために3個のうちの2個のバッチを選択することができる。2個の選択されたバッチは、後続の層の対応するバッチサイズ、すなわち10に等しい合計10個の入力、すなわち2×5を有する。いくつかの実現例では、残りの第3のバッチは、回路内のシストリックアレイをその後通過する際に処理されるであろう。さらに別の例について、
図6を参照して以下でさらに説明する。
【0048】
回路は、たとえばシストリックアレイを使用して、選択されたいくつかの入力のバッチを処理して、選択されたバッチにおける各入力についてそれぞれの層出力を生成することができる(ステップ508)。回路は、各入力について累積値を計算するときに重み入力を再使用することによって、各々の選択された入力のバッチを処理することができる。上記のように、重み入力は、複数の独立した入力に適用される。なぜなら、新たな起動入力の複数のセットがロードされている間は、重み入力はセル内にとどまっている、すなわち「一時停止される」可能性があるからである。
【0049】
例示として、バッチは、2個の入力、すなわち起動入力のセットA1および起動入力のセットA2、を有し得る。回路は、重み入力のセットW2をメモリからフェッチする前に
セットA1およびA2の両方に重み入力のセットW1を適用することによってセットW1を再使用することができ、セットW2は、後続の層の重みのセットであり、または層が回路のシストリックアレイによって処理される重みをさらに多く有している場合には、当該層の重みの次のサブセットである。別の例では、処理すべき各々が5個の入力からなる8個のバッチ、すなわち合計40個の入力があり、回路が処理のために4個のバッチを選択した場合、回路は、当該4個のバッチ内の入力、すなわち合計20個の入力を処理して、それぞれの層出力、すなわち合計20個の層出力を生成することができる。これについては、
図6を参照して以下でさらに説明する。
【0050】
選択されたいくつかのバッチを処理した後、回路は、当該層において第2のいくつかのバッチを処理するか、または後続の層において入力の1つ以上のバッチを処理することに進むかのいずれかを行うことができる。これについては、
図6を参照して以下でさらに説明する。
【0051】
この方法は、ニューラルネットワークを処理する回路で実現されるように説明してきたが、この方法は、プロセッサ、たとえば中央処理装置(Central Processing Unit:CP
U)またはグラフィクス処理ユニット(Graphics Processing Unit:GPU)で実現されてもよい。たとえば、プロセッサは、メモリ、たとえばダイナミックランダムアクセスメモリ(DRAM)から重みを検索取得しながら何回か重み値を再使用することができる。
【0052】
図6は、複数の層と各層のバッチサイズとを有する例示的なニューラルネットワーク600を示す。上記のように、所与の層のバッチサイズは、当該層において重み入力が再使用される回数で除算される重み再使用値の上限である。天井関数は、ある数字を処理し、当該数字以上の最小の整数を返すことができる。重み入力が再使用される回数は、回路のシストリックアレイのセルに格納される起動入力の数に直接対応し得る。たとえば、回路の重み再使用値は1500であってもよい。層1 602は、170×170の入力を処理する。170×170の起動入力の各々は、シストリックアレイのセルに格納することができる。したがって、層1 602のバッチサイズは、CEIL(1500/(170*170))=1である。層2 604のバッチサイズは、CEIL(1500/(28*28))=2である。同一の算出を使用して、層3~5 606~610は8というバッチサイズを有し、層6 612は32というバッチサイズを有する。いくつかの実現例では、バッチサイズは、2の最も近いべき乗に丸められる。
【0053】
例示として、層1は1個の入力というバッチサイズを有し、層2は2個の入力というバッチサイズを有する。回路は、層1での処理のために、たとえば10個の入力、たとえば合計10個の個別の画像を受け取ることができる。
【0054】
回路は、層1における10個のうちの2個のバッチ、すなわち合計2個の入力を処理すべきであると判断することができる。いくつかの実現例では、回路は、層2におけるバッチサイズを層1のバッチサイズで除算すること、すなわち2/1=2によってこの数を求める。単一入力の2個のバッチを処理することによって、回路は、層2のバッチサイズ、すなわち2に等しい2個の入力を処理する。回路は、たとえば各画像から1つである累積値の2個のベクトルを計算することによって、2個のバッチを処理して2個の入力から2個の層出力を生成することができる。各々の層出力は、後続の層に入力するための入力であり得る。回路は、層2での処理のために、2個の入力からなるバッチ、たとえば累積値の2個のベクトルを形成することができる。バッチは、統合バッファに格納することができる。
【0055】
回路は、層2における4個のバッチを処理すべきであると判断することができる。サイズ2の4個のバッチを処理することによって、回路は、層3のバッチサイズ、すなわち8
に等しい8個の入力を処理する。回路は、4個のバッチを処理して、8個の入力から8個の層出力を生成することができる。次いで、回路は、層3での処理のために、8個の入力からなるバッチを形成することができる。
【0056】
回路は、ニューラルネットワークの全ての層において入力が処理されるまで続けることができる。たとえば、層3~5が8というバッチサイズを有しているので、回路は、層3~5の各々における8個の入力からなる1つのバッチを処理すべきであると判断することができる。同様に、回路は、層5における各々が8個の入力を有する4個のバッチを処理すべきであると判断し、それによって32個の入力からなるバッチを形成することができ、当該32個の入力からなるバッチは、層6において処理することができる。各入力について、層6は、推測値に使用できる1つ以上の層出力を生成することができる。
【0057】
いくつかの実現例では、回路は、たとえば演算回路を使用して、ニューラルネットワーク内の全ての層にわたるバッチサイズの最小公倍数を算出する。次いで、回路は、後続の層を処理する前に、各層において最小公倍数以上の最小数の入力を処理することができる。言い換えれば、回路は、(1)後続の層においてバッチを処理するか、(2)最小公倍数に基づいて現在の層において別のバッチを処理するかを判断することができる。たとえば、層1~6 602~612のバッチサイズの最小公倍数は32である。層1において1つのバッチを処理した後、回路は、層1が32という最小公倍数未満の1個の出力のみを生成したと判断することができる。したがって、回路は、層1において別のバッチを処理すると判断することができ、この時点で合計2個の出力が生成されている。回路は、層1において32個、すなわち最小公倍数の出力が生成されるまで出力を生成し続けることができる。次いで、回路は、後続の層においてバッチを処理することに進むことができる。いくつかの実現例では、各々の層出力は、統合バッファ、たとえば
図2の統合バッファ208に格納される。
【0058】
例示として、回路は、層1において合計32個の入力になる32個のバッチを処理のために選択することができる。次いで、回路は、層2において合計32個の入力になる16個のバッチを選択し、次いで層3において合計32個の入力になる4個のバッチを処理のために選択し、次いで層4において合計32個の入力になる4個のバッチを処理のために選択し、次いで層5において合計32個の入力になる4個のバッチを処理のために選択し、次いで最後に層6において合計32個の入力になる1個のバッチを処理のために選択することができる。
【0059】
いくつかの実現例では、特定の層において、回路は、システムパラメータ、たとえばユーザによって提供されるパラメータに基づいて、最小公倍数よりも大きないくつかの入力を処理する。いくつかの実現例では、回路は、後続の層のバッチサイズによって割り切れるいくつかの入力を処理する。いくつかの他の実現例では、回路は、多数の入力を処理するように命令を受け取って、回路は、後続の数で出力を生成することに進む前に、特定の層で生成される出力の数を最大化するように入力のバッチを処理する。回路は、生成される出力の数が後続の層のバッチサイズによって割り切れるように、特定の層で生成される出力の数を制限することができる。
【0060】
本明細書に記載されている主題および機能動作の実施形態は、デジタル電子回路で実現されてもよく、有形に実施されたコンピュータソフトウェアもしくはファームウェアで実現されてもよく、本明細書に開示されている構造およびそれらの構造的等価物を含むコンピュータハードウェアで実現されてもよく、またはそれらのうちの1つ以上の組み合わせで実現されてもよい。本明細書に記載されている主題の実施形態は、1つ以上のコンピュータプログラムとして実現されてもよく、すなわちデータ処理装置による実行またはデータ処理装置の動作の制御のために有形の非一時的なプログラムキャリアに符号化されたコ
ンピュータプログラム命令の1つ以上のモジュールとして実現されてもよい。代替的にまたは加えて、プログラム命令は、人工的に生成された伝搬信号、たとえば機械によって生成された電気信号、光信号または電磁信号、に符号化されてもよく、当該信号は、情報を符号化して好適な受信機装置に送信してデータ処理装置によって実行するように生成される。コンピュータ記憶媒体は、機械読取可能な記憶装置であってもよく、機械読取可能な記憶基板であってもよく、ランダムもしくはシリアルアクセスメモリデバイスであってもよく、またはそれらのうちの1つ以上の組み合わせであってもよい。
【0061】
「データ処理装置」という用語は、一例としてプログラム可能なプロセッサ、コンピュータ、または複数のプロセッサもしくはコンピュータを含む、データを処理するための全ての種類の装置、デバイスおよび機械を包含する。当該装置は、特定目的論理回路、たとえばFPGA(フィールドプログラマブルゲートアレイ)またはASIC(特定用途向け集積回路)を含み得る。当該装置は、ハードウェアに加えて、対象のコンピュータプログラムのための実行環境を作成するコード、たとえばプロセッサファームウェア、プロトコルスタック、データベース管理システム、オペレーティングシステム、またはそれらのうちの1つ以上の組み合わせを構成するコード、も含み得る。
【0062】
(プログラム、ソフトウェア、ソフトウェアアプリケーション、モジュール、ソフトウェアモジュール、スクリプト、またはコードと称してもよく、またはそのようなものとして記載されてもよい)コンピュータプログラムは、コンパイラ型もしくはインタープリタ型言語、または宣言型もしくは手続き型言語を含むいずれかの形態のプログラミング言語で書かれてもよく、スタンドアロンのプログラム、または計算環境での使用に適したモジュール、コンポーネント、サブルーチンもしくは他のユニットを含むいずれかの形態でデプロイすることができる。コンピュータプログラムは、ファイルシステムにおけるファイルに対応し得るが、そうでなくてもよい。プログラムは、他のプログラムもしくはデータ、たとえばマークアップ言語ドキュメントに格納された1つ以上のスクリプト、を保持するファイルの一部に格納されてもよく、対象のプログラムに専用の単一のファイルに格納されてもよく、または複数の協調的ファイル、たとえば1つ以上のモジュール、サブプログラムもしくはコードの一部を格納するファイル、に格納されてもよい。コンピュータプログラムは、1つのコンピュータで実行されるようにデプロイされてもよく、または、一箇所に位置するかもしくは複数の箇所に分散されて通信ネットワークによって相互接続された複数のコンピュータで実行されるようにデプロイされてもよい。
【0063】
本明細書に記載されているプロセスおよび論理フローは、1つ以上のプログラム可能なコンピュータによって実行されてもよく、当該1つ以上のプログラム可能なコンピュータは、入力データ上で動作して出力を生成することによって機能を実行するように1つ以上のコンピュータプログラムを実行する。また、当該プロセスおよび論理フローは、特定目的論理回路、たとえばFPGA(フィールドプログラマブルゲートアレイ)またはASIC(特定用途向け集積回路)によって実行されてもよく、装置は、特定目的論理回路、たとえばFPGAまたはASICとして実現されてもよい。
【0064】
コンピュータプログラムの実行に適したコンピュータは、一例として、汎用マイクロプロセッサもしくは特定目的マイクロプロセッサ、またはそれら両方、またはその他の種類の中央処理装置に基づいていてもよい。一般に、中央処理装置は、リードオンリメモリまたはランダムアクセスメモリまたはそれら両方から命令およびデータを受け取る。コンピュータの必須の要素は、命令を実施または実行するための中央処理装置と、命令およびデータを格納するための1つ以上のメモリデバイスとである。一般に、コンピュータは、データを格納するための1つ以上の大容量記憶装置、たとえば磁気ディスク、光磁気ディスクもしくは光ディスクも含み、または、当該1つ以上の大容量記憶装置からデータを受信したり、当該1つ以上の大容量記憶装置にデータを送信したり、もしくは当該1つ以上の
大容量記憶装置との間でデータを送受信したりするように動作可能に結合される。しかし、コンピュータはこのような装置を有していなくてもよい。さらに、コンピュータは、別のデバイス、たとえばいくつか例を挙げると携帯電話、パーソナルデジタルアシスタント(personal digital assistant:PDA)、モバイルオーディオプレーヤもしくはビデオプレーヤ、ゲーム機、グローバルポジショニングシステム(Global Positioning System
:GPS)受信機で実施されてもよく、または携帯型記憶装置、たとえばユニバーサルシリアルバス(universal serial bus:USB)フラッシュドライブで実施されてもよい。
【0065】
コンピュータプログラム命令およびデータの格納に適したコンピュータ読取可能な媒体は、全ての形態の不揮発性メモリ、媒体およびメモリデバイスを含み、一例として、半導体メモリデバイス、たとえばEPROM、EEPROMおよびフラッシュメモリデバイス;磁気ディスク、たとえば内部ハードディスクまたはリムーバブルディスク;光磁気ディスク;ならびにCD ROMおよびDVD-ROMディスクを含む。プロセッサおよびメモリは、特定目的論理回路によって補完されてもよく、または特定目的論理回路に組み込まれてもよい。
【0066】
ユーザとの対話を要求するために、本明細書に記載されている主題の実施形態は、ユーザに情報を表示するためのディスプレイデバイス、たとえばCRT(陰極線管)またはLCD(液晶ディスプレイ)モニタと、ユーザが入力をコンピュータに送ることができるキーボードおよびポインティングデバイス、たとえばマウスまたはトラックボールとを有するコンピュータで実現されてもよい。ユーザとの対話を要求するために他の種類のデバイスも使用してもよい。たとえば、ユーザに提供されるフィードバックは、いずれかの形態の感覚フィードバック、たとえば視覚フィードバック、聴覚フィードバックまたは触覚フィードバックであってもよく、ユーザからの入力は、音響入力、音声入力または触覚入力を含むいずれかの形態で受け取られてもよい。また、コンピュータは、ユーザが使用するデバイスにドキュメントを送ったり当該デバイスからドキュメントを受け取ったりすることによってユーザと対話してもよく、たとえばウェブブラウザから受け取った要求に応答してユーザのクライアントデバイスのウェブブラウザにウェブページを送ることによってユーザと対話してもよい。
【0067】
本明細書に記載されている主題の実施形態は、バックエンドコンポーネント、たとえばデータサーバを含む計算システムで実現されてもよく、またはミドルウェアコンポーネント、たとえばアプリケーションサーバを含む計算システムで実現されてもよく、またはフロントエンドコンポーネント、たとえばユーザが本明細書に記載されている主題の実現例と対話できるグラフィカルユーザインターフェイスもしくはウェブブラウザを有するクライアントコンピュータを含む計算システムで実現されてもよく、または1つ以上のこのようなバックエンドコンポーネント、ミドルウェアコンポーネントもしくはフロントエンドコンポーネントのいずれかの組み合わせを含む計算システムで実現されてもよい。当該システムのコンポーネント同士は、デジタルデータ通信のいずれかの形態または媒体、たとえば通信ネットワークによって相互接続されてもよい。通信ネットワークの例としては、ローカルエリアネットワーク(local area network:LAN)および広域ネットワーク(wide area network:WAN)、たとえばインターネットが挙げられる。
【0068】
計算システムは、クライアントとサーバとを含んでいてもよい。クライアントおよびサーバは、一般に互いに離れており、通常は通信ネットワークを介して対話する。クライアントとサーバとの関係は、それぞれのコンピュータ上で動作して互いに対してクライアント-サーバ関係を有するコンピュータプログラムによって生じる。
【0069】
本明細書は、多くの具体的な実現例の詳細を含んでいるが、これらは、発明の範囲またはクレームされ得るものの範囲を限定するものとして解釈されるべきではなく、特定の発
明の特定の実施形態に特有であろう特徴を説明するものとして解釈されるべきである。別々の実施形態の文脈で本明細書に記載されている特定の特徴は、組み合わせて単一の実施形態で実現されてもよい。逆に、単一の実施形態の文脈で記載されているさまざまな特徴は、複数の実施形態で別々に、またはいずれかの好適な部分的組み合わせで実現されてもよい。さらに、特徴は特定の組み合わせで動作するものとして上記され、当初はそのようなものとしてクレームされさえし得るが、クレームされている組み合わせからの1つ以上の特徴は、場合によっては当該組み合わせから削除されてもよく、クレームされている組み合わせは、部分的組み合わせまたは部分的組み合わせの変形例に向けられてもよい。
【0070】
同様に、動作は特定の順序で図面に示されているが、これは、望ましい結果を達成するために、示されている特定の順序またはシーケンシャルな順序でこのような動作を実行しなければならないものとして理解されるべきではなく、または全ての示されている動作を実行しなければならないものとして理解されるべきではない。特定の状況では、マルチタスクおよび並列処理が有利であるかもしれない。さらに、上記の実施形態におけるさまざまなシステムモジュールおよびコンポーネントの分離は、全ての実施形態でこのような分離が必要であるものとして理解されるべきではなく、記載されているプログラムコンポーネントおよびシステムは一般に単一のソフトウェア製品に実装されるかまたは複数のソフトウェア製品にパッケージングされ得るということが理解されるべきである。
【0071】
主題の特定の実施形態について説明してきた。他の実施形態も以下の特許請求の範囲の範囲内である。たとえば、特許請求の範囲に記載されている動作は、異なる順序で実行されてもよく、依然として望ましい結果を達成することができる。一例として、添付の図面に示されているプロセスは、望ましい結果を達成するために、示されている特定の順序またはシーケンシャルな順序を必ずしも必要としない。特定の実現例では、マルチタスクおよび並列処理が有利であるかもしれない。