(58)【調査した分野】(Int.Cl.,DB名)
前記第1の頂点の集合は顧客を表し、前記第2の頂点の集合は商品を表し、前記生成された推奨は顧客に対する商品の推奨である、請求項8に記載のコンピュータ可読記憶媒体。
【発明を実施するための形態】
【0019】
本発明の実施形態では、探査のために頂点をプロセッサに動的に割り当てることにより、グラフ探査のためのプロセッサの非効率的な使用という問題を解決する。頂点をプロセッサに静的に割り当てるグラフ演算システムでは、グラフの探査中に、特定の頂点専用のいくつかのプロセッサが、アイドル状態のままになっているため、プロセッサリソースを十分に活用できていない。このグラフ演算システムは、プロセッサを頂点に静的に割り当てるのではなく、本明細書に開示された技術を用いて、頂点をプロセッサに動的に割り当てることができ、これにより、プロセッサリソースを最大限に利用することが可能となる。
【0020】
本開示では、2部グラフ、準2部グラフ、および一般グラフを検索し探索するときに、プロセッサのリソースを完全に利用する技術について議論する。準2部グラフとは、1つの区画内に存在する辺を有する2部グラフのことである。このシステムは、グラフ探査ステップごとに最先端の頂点を各プロセッサに動的に割り当てる。最先端の頂点とは、プロセッサが、探査ステップのために処理しなければならない頂点のことである(例えば、商品の推奨を必要とする顧客を表す頂点)。例えば、「U」内の頂点の集合、および「V」内の頂点の集合を有する2部グラフに関して、システムが、「U」内の頂点(例えば、顧客の頂点)から「V」内の頂点(例えば、商品の頂点)への探査を行うとき(「U」→「V」と表される)、このシステムは、最先端の集合「U」内の頂点を全てのプロセッサに動的に割り当てることが可能である。これにより、このシステムの処理能力をフル活用することができる。同様に、このシステムは、「V」内の頂点から「U」内の頂点への探査を行うとき(「V」→「U」と表される)、このシステムは、最先端の「V」内の頂点を全てのプロセッサに動的に割り当てる。なお、このシステムは、プロセッサの間で、均一または非均一に頂点を分割することができる。
【0021】
これとは対照的に、頂点をプロセッサに割り当てる標準の静的なアプローチでは、例えば、10個中7個のプロセッサを割り当てて「U」→「V」の探査を管理し、10個中3個のプロセッサを割り当てて「V」→「U」の探査を管理している。標準の静的なアプローチのもとでは、このシステムは「U」→「V」の探査を行うときに、10個中3個のプロセッサを使用していない。さらに、このシステムは「V」→「U」の探査を行うときに、10個中7個のプロセッサを使用していない。この静的なアプローチでは、プロセッサのリソースの使用を最大にできず、頂点をプロセッサに動的に割り当てることにより、このアプローチを回避することができる。
【0022】
以下のセクションでは、グラフ演算システムのアーキテクチャについて説明する。この説明では、最良のケースの並列の効率性について分析し、ビットマスクのコンセプトを紹介し、かつ動的な頂点−プロセッサのマッピング方式について議論する。「U」→「V」の探査のために、頂点をプロセッサに動的に割り当てる処理、「V」→「U」の探査のために、頂点をプロセッサに動的に割り当てる処理、一般グラフにおける源点から終点の探査のために、頂点をプロセッサに動的に割り当てる処理などのいくつかの処理の例もこの議論には含まれる。最終的に、下記のセクションでは、商品に関する推奨を生成するための例示的な処理、および探査のために頂点をプロセッサに動的に割り当てる装置およびシステムを開示する。
【0023】
図1Bには、一実施形態に従った、グラフ探査技術を用いた、グラフ演算システム100の例示的なアーキテクチャのブロック図が示されている。グラフ演算システム100は、グラフの頂点を分割し、複数のプロセッサを用いて、それらの頂点を処理することができる。グラフ演算システム100は、グラフを検索し探査して、協調フィルタリングなどの種々のアプリケーションを容易にすることができる。標準的なシステムでは、システム100は、所定の静的な割り当てに従って、頂点をプロセッサに割り当てることにより、グラフの頂点の探査を行う。しかし、本明細書に開示された技術を用いることにより、このシステム100は、頂点を動的に分割し、分割された頂点をプロセッサに動的に割り当てる。これにより、プロセッサのリソース使用を改善する。
【0024】
グラフ演算システム100は、サーバ106に接続した記憶装置104にインストールされたグラフ管理モジュール102を含むことができる。なお、本発明の種々の実装形態では、いくつものサーバおよび記憶装置を含むことができる。種々の実装形態では、グラフ管理モジュール102は、本明細書に記載される技術を実行するために、グラフ分析エンジン、またはその他のグラフ演算システム100の構成要素を含むことができる。システム100は、頂点と辺を記述したデータを受信し、そのデータを記憶装置104内に格納することがきる。システム100は、グラフ管理モジュール102に関するコード、ならびに頂点および辺108に関するデータを記憶装置104から読み出すことができる。システム100は、頂点を動的に分割し、それらの頂点をプロセッサ110A〜110Hなどのプロセッサに動的に割り当てる。そして、これらのプロセッサは、割り当てられた頂点上で動作する。
【0025】
図2には、最良のケースの並列効率性を「U」と「V」のサイズの割合の関数として示すグラフが示されている。
図2には、以下の3つのケースに関する、「U」と「V」のサイズの割合の関数としての、理論上の最良のケースの並列効率性(プロセッサの数で割った、速度の増加分として計測された)が示されている。
1.「U」→「V」の効率性:「U」内の頂点から「V」内の頂点への単一の探査ステップに関する並列の効率性。
2.「V」→「U」の効率性:「V」内の頂点から「U」内の頂点への単一の探査ステップに関する並列の効率性。
3.平均の効率性:それぞれ同じ重みを付けられた、上記の1および2の平均の効率性。
【0026】
上記に見られるように、|V|に対する|U|の割合が高くなると、「U」→「V」の方向における探査ステップに関する最良のケースの並列効率性は向上するが、同時に、「V」→「U」の方向における探査に関する効率性は低下する。探査の2つの方向が同じように重要な場合、|U|と|V|の間の割合には関係なく最良のケースのシナリオでも、全体として並列効率性はたった50%である。但し、並列法の種々のステージにおけるオーバヘッドがあるため、実際の効率性はこれより低い可能性だけはあり得る。
【0027】
探査の一方の方向が、他方の方向よりもより重要なアプリケーションでは、50%の平均の効率性は、ゆるい上限になるだけである。上記に説明した「customer−bought−product」の例では、クラシックアプリケーションは、次の協調フィルタに基づいて、推奨を生成するためのものである。
ステップ1:顧客の頂点からスタートし、その顧客により購入された商品の集合を見つけ出す。
ステップ2:これらの商品のうちの少なくとも1つを購入した他の顧客を見つけ出す。
ステップ3:これらの顧客に購入された最も人気のある商品を見つけ出す。
【0028】
なお、ステップごとに必要な演算の量は著しく異なる可能性がある。ステップ1では、単一の頂点からのグラフ探査だけが必要であり、この探査は比較的コストがかからない。ステップ2では、一般に、複数の商品の頂点からの探査を必要とし、それに加えて、顧客が過去に1つ超の商品を購入しており、さらに、単一の顧客が少数の商品を購入する可能性がある一方で、(特に人気の)単一の商品が数千人、もしかすると数百万の顧客に購入されるかもしれない。すなわち、ステップ2は複数の頂点の処理を必要とするだけでなく、それぞれの頂点で非常に大量の演算を実行する必要がある。したがって、ステップ1よりも数桁多い数の辺を探索することはステップ2にとってはよくあることであり、これにより、「V」(商品)から「U」(顧客)の探査方向が、その反対方向よりもコンピュータ的に集約的になる。一般には、商品の種類よりも多くの顧客が存在するので、「|U|≧|V|」と想定する方がその逆より安全である。
【0029】
図2によると、「|U|=|V|」、例えば、バランスのとれた2部グラフの場合、ステップ2に関する最良のケースの並列効率性は理論上50%である。しかし「|U|=10|V|」、例えば、商品の種類の10倍よりも多くの顧客が存在する場合、ステップ2では、理論上せいぜい9.1%の並列の効率性しか実現することができない。さらに、商品の100倍または1,000倍のより多い顧客が存在する場合、さらに並列の効率性は、それぞれ1%および0.1%に落ち込むであろう。ビジネスでは、数百万人(以上)の顧客を相手に数千(以下)の商品の種類を扱うことは、珍しくないため、実際には、0.1%以下の並列効率性が発生する。
【0030】
頂点をプロセッサに割り当てるとき、並列検索アプリケーションにより、「U」と「V」が区別されることがないという前提に基づいて、今までの分析がなされてきた。グラフは2部グラフで、行われる探査は「U」→「V」(または「V」→「U」)であることを示すデータをアプリケーションが前もって受信している場合、このアプリケーションは「U」の頂点(または「V」頂点)をプロセッサに割り当てるだけでよく、問題は解決される。しかし、これは全体的な解決策とは言えない、というのも、(a)グラフが2部グラフかどうかをテストすることは、コンピュータ的にコストがかかる可能性があり、(b)非2部グラフでは、依然として同じ問題を表面化させる同様の構造を有する可能性があるからである。
【0031】
図3には、例示的な準2部グラフのブロック図が示されている。
図3の矢印302により表される辺を無視した場合、このグラフは2部グラフになる。同じ並列の問題が準2部グラフでも発生することが分かる。
【0032】
グラフが2部グラフであり、アプリケーションがこの情報を受信したとしても、アプリケーションがこれらの頂点の部分集合の処理を行うことだけが必要であれば、「U」または「V」内の全ての頂点をプロセッサに割り当てることは、まだ準最適な段階であると言えよう。協調フィルタの例のステップ1では、アプリケーションは「U」内の単一の頂点を処理することだけが必要であり、これは、その顧客が推奨を受信し、残りの999,999人の顧客は処理を必要としないことを表している。顧客が全ての商品の部分集合を購入するだけの場合、ステップ2でも同様の問題が起こり得る。「U」または「V」のどちらかの全ての頂点を列挙することなしに、検索の最前線上の頂点(例えば、処理される必要のある商品)を効率的に見つけ出すことが課題となり得る。
【0033】
図4には、検索の最先端401を要約した例示的なビットマスク400のブロック図が示されている。
図4には、8ビットのビットマスクを用いて0番から31番の番号を付けられたIDを有する32個の頂点を含むグラフに関する、現在の検索の最先端の要約が表す例が示されている。検索の最先端401に関して、網掛けされたブロックは検索の最先端上の頂点を表し、空のブロックは非最先端の頂点を表す。例えば、ブロック402、404、および406は、検索の最先端上の頂点を表し、ブロック408、410、および412は、非最先端の頂点を表す。
【0034】
図示する例では、「ID∈[4k、4k+3]」を有するいずれかの頂点が、検索の最先端上に存在する場合、およびその場合に限って、システム100は、ビットマスクの「k」番目のビット(例えば、このブロックは空ではない)を設定する。これらのビットが0番から7番の番号を付けられた8個のプロセッサに対応する場合、それぞれのビットは、連続したIDを有する4つの頂点の処理を担当し、ビットマスク400内の「k」番目のビットが設定されていなければ、「k」番目のプロセッサに関する、処理を行うための頂点は存在しない。例えば、ビット414、416、418、および420により示されるように、プロセッサ0、2、3、6はそれぞれ、最先端の頂点を含む頂点の部分範囲を処理する。しかし、プロセッサ1、4、5、および7に関しては、処理する最先端の頂点は存在しない。これは、検索の最終結果に影響を及ぼすことなく、いくつかのアイドル頂点を素早くスキップする標準的技術であるが、2部グラフに適用されると、システム100が頂点からプロセッサへの静的マッピングを適用した場合、この技術における上記に記載した全ての短所が露呈してしまう。
【0035】
2部グラフだけでなく、非2部グラフも処理するよう設計された汎用のグラフ分析エンジン内で2部グラフを利用する、特別な論理回路を供給することが課題と言えよう。並列効率性のために、頂点の空間の特定の領域を安全に無視することができるよう、あるアプローチでは、ビットマップマスクを用いて、例えば、現在の探査ステップで処理される必要がある頂点などの最先端の頂点の存在(または不在)の概略を描き出している。
【0036】
図5には、例示的な2部グラフの検索の最先端500、およびそれに対応する静的なビットマスク501のブロック図が示されている。
図5に関して、対応するグラフは、2部グラフであり、頂点#0〜#23∈「U」(例えば、ブランクのブロック)、および頂点#24〜#31∈「V」(例えば、網掛けされたブロック)を有する。頂点#0〜#23を表すブランクのブロックの例には、ブロック502、504、および506が含まれる。頂点#24〜#31を表す網掛けされたブロックの例には、ブロック508、510、および512が含まれる。
【0037】
全ての8個の頂点∈「V」が最先端上に存在する「V」→「U」の探査ステップでは、システム100は、8個のうち最後の2個のプロセッサしか使用することができない、というのも、その他の最初の6個のプロセッサは、全ての「V」→「U」の探査ステップにおいて、アイドル頂点であることが保証されている24個の頂点∈Uの処理専用として静的に割り振られているからである。したがって、最良のケースでの並列効率性は、たった「2/8=25%」である。この例では、「|U|/|V|=24/8=3」のため、
図2によると、同じ25%の並列効率性を、
図2に示された「V」→「U」の効率性曲線上で見つけることができる。これは驚くべき結果ではない、というもの、静的な頂点−プロセッサのマッピングは、2部グラフ上の並列検索に関連する、全ての上述の問題を受け継いでいるに違いないからである。
【0038】
単一方向の探査ステップにおいて全てのプロセッサの利用を容易にするために、本開示では、グラフ探査の方向に基づいて、頂点とプロセッサの間の相性をその場で調整する動的な頂点−プロセッサのマッピング方式を下記に説明する。「P」を並列検索に関して使用可能なプロセッサの数とする。説明を容易にするために、各頂点が整数IDを有するものとする。「u
min」および「u
max」を頂点∈「U」に関する、最小整数IDおよび最大整数IDとし、「v
min」および「v
max」を頂点∈「V」に関する、最小整数IDおよび最大整数IDとする。互いに素な頂点IDの範囲を有する、2つの区画「U」および「V」を含む2部グラフに関して、次の2つの不等式の関係のうちの一方を保持していなければならない。
・「u
min≦u
max<v
min≦v
max」または
・「v
min≦v
max<u
min≦u
max」
【0039】
2部グラフにおいて、「U」→「V」の探査、および「V」→「U」の探査の2種類の基本探査ステップだけが存在する。前者の場合、全ての源点は「∈U」であり、全ての終点は「∈V」、一方「V」→「U」の探査ではその反対である。以下に、これらの2つケースについて別々に議論する。
【0040】
「U」→「V」の探査のケース
「U
min」を以下のように(P+1)個の要素の整数アレイとすると:
・U
min[0]=u
min
・U
min[p]<U
min[p+1]、(なお、「p」=0,1,…,(P−1))
・U
min[P]=u
max+1
「U
min」を用いて、下記の不等式が成り立つように、全体の頂点の集合∈「U」を「P」個の互いに素な部分集合に分割することができる。
Up={u|「u∈U」∧U
min[p]≦ID(u)<U
min[p+1]}(なお、「p」=0,1,…,(P−1))
【0041】
ID(u)は、「u
min」と「u
max」の間の頂点「u」のIDを返す関数である。なお、「U
p」は、「U」→「V」の探査ステップで、システム100がおそらくプロセッサ「p」に割り当てることができる、最も大きな頂点の部分集合∈「U」である。「U
*p」をプロセッサ「p」に関する「U」→「V」の最先端の頂点の集合とすると、
U
*p={u|u∈U
p∧frontier(u)=true}となる。
なお、関数「frontier(u)」は、頂点「u」が「U」→「V」の検索の最先端上に存在する場合、およびその場合に限って「true」を返すブール関数である。「M
U」を「M
U[p]」のような、「P」ビットのビットマスクとすると、「p」番目のビットの値は、
【数4】
となる。
【0042】
「M
U[p]=0」の場合、明らかにプロセッサ「p」には、「U」→「V」の探査ステップで処理する最先端の頂点がなく、したがって、システム100は、そのプロセッサ「p」を安全にスキップすることができる。その一方で、「M
U[p]=1」の場合、プロセッサ「p」が処理するための少なくとも1つの最先端の頂点「u∈U」が存在するが、「|U
*p|≦|U
*p|」のため、最悪の場合でも「|U
*p|」個の頂点と同じ数だけ存在することを意味する。
【0043】
「V」→「U」の探査のケース
「V
min」を下記のような(P+1)個の要素の整数アレイとする。
・V
min[0]=v
min
・V
min[p]<V
min[p+1],(なお、「p」=0,1,…,(P−1))
・V
min[P]=v
max+1
【0044】
下記のように、全体の頂点の集合∈「V」を「P」個の互いに素な部分集合に分割する。
Vp={v|v∈V∧V
min[p]≦ID(v)<V
min[p+1]}(なお、「p」=0,1,…,(P−1))
「ID(v)」は、「v
min」と「v
max」の間の頂点「v」のIDを返す関数である。「V
p」は、「V」→「U」の探査ステップにおいて、システム100がおそらくプロセッサ「p」に割り当てることができるであろう、最も大きな頂点の部分集合∈「V」である。「V
*p」をプロセッサ「p」に関する「V」→「U」最先端の頂点の集合とすると、
V
*p={v|「v∈V」p∧frontier(v)=true}となる。
頂点「v」が「V」→「U」検索の最先端上に存在する場合、およびその場合に限って、関数「frontier(v)」は「true」を返す。
【0045】
下記のように「M
V」を「P」ビットのビットマスクとすると:
「p」番目のビットの値である「M
V[p]」が、
【数5】
であり、
【数6】
である。
【0046】
「M
V[p]=0」は、そのプロセッサ「p」には演算する最先端の頂点がないことを示す。「M
V[p]=1」は、プロセッサ「p」が処理するための少なくとも1つの最先端の頂点v∈V」が存在することを示唆する(「|V
*p|≦|V
p|」のため最悪の場合でも「|V
p|」の頂点と同じ数、存在し得る)。
【0047】
ビットマスク「M
U」および「M
V」を用いて、動的なビットマスクMを
・「U」→「V」の探査において「M」=「M
U」
・「V」→「U」の探査において「M」=「M
V」
として正式に定義することができる。
【0048】
効率的な実装形態のために、システム100は、ビットマスク「M
U」および「M
V」を、「P」ビットを有する同じビットマップアレイ内に以下の条件で格納することができる。(a)反対方向の探査が同時に実行されない。(b)同じ方向の複数の探査があれば、互いに互換性がある(例えば、並列検索において同じビットマスク「M
U」または「M
V」を用いることができる)。
【0049】
同様に「U
*p」および「V
*p」を用いることにより、プロセッサ「p」に関する仕事量の頂点の集合である「W
*p」を次の通り規定することができる。
・「U」→「V」の探査では「W
*p=U
*p」
・「V」→「U」の探査では、W
*p=V
*p」
【0050】
このマッピングはグラフ探査の方向で変化するため、上記の頂点−プロセッサのマッピング方式は動的である。
【0051】
整数アレイの「Umin」および「Vmin」
整数アレイの「U
min」および「V
min」を設ける目的は、頂点IDの範囲[u
min,u
max]および[v
min,v
max]をP個の互いに素な部分範囲に分割することである。例えば、範囲[u
min,u
max]を分割する1つの方法として、P個のほぼ同じサイズの部分範囲に分割し、最初の(P−1)個の部分範囲を全く同じサイズ
【数7】
に分割し、最後の区画に残りの頂点∈Uを含ませる。
つまり、
【数8】
とする。
【0052】
上記の分割スキームを均一頂点分布法と呼ぶ。但し、
【数9】
は最初の(P−1)個の部分範囲の頂点サイズが最悪のケースにだけ当てはまり、検索の最先端上の頂点の実際の数は、ある探査ステップと別の探査ステップとで変わり得る。他にも「v
min」と「v
max」の間の範囲を分割する方法が存在し、これらの範囲には非均一な最悪のケースの頂点サイズを有する区画が含まれる。例えば、1つの可能性として、実際の最先端サイズを全ての部分範囲に渡ってほぼ同じにして、負荷分散を改善するために非均一なサイズを許容する例が挙げられる。頂点から部分範囲へのマッピングが決定性ならば(例えば、単一の最先端の頂点が1つの部分範囲にきっちりとマッピングされる。)、その他の変形例も可能である。
【0053】
動的な頂点−プロセッサのマッピングの例
以下の
図6および
図7の2つの例では、どのように動的マッピング方式が並列の効率性を向上させるかについて説明している。一方の例は「U」→「V」の探査のケースであり、他方の例は「V」→「U」の探査のケースである。
【0054】
図6には、一実施形態に従った、例示的な「U」→「V」の検索の最先端600、およびそれに対応する動的なビットマスク601が示されている。
図6には、
図5と同じ2部グラフが示されているが、この2部グラフでは、最初の6個だけではなく、全てのプロセッサを稼働状態に維持する、動的な頂点−プロセッサのマッピングが行われている。網掛けされているブロックは、最先端の頂点∈「U」に対応するブロックである。最先端の頂点∈「U」に対応するブロックの例には、ブロック602、604、および606が含まれる。全ての「U」→「V」の探査ステップでは、頂点∈「V」は、間違いなくアイドル頂点なので、頂点∈「V」に対応するブロックは全て、空ブロックとして示されている(ブロックが探査の非対象であることを示すために)。頂点∈「V」に対応するブロックの例として、ブロック608、610、および612が含まれる。
【0055】
24個の最先端の頂点、および「P=8」が存在するため、「u
min=0」、「u
max=23」、および
【数10】
である。均一頂点分布法スキームもとでは、「U
min={0,3,6,…,24}」かつ「U
*p=U
p={u|3p≦ID(u)<3p+3}(なお、p=0,1,…,7)」である。すなわち、システム100は、各プロセッサ「p」を[3p,3p+3)の範囲におけるIDを有する3つの頂点に割り当てる。これが、プロセッサの利用率が100%の最適な頂点−プロセッサの割り当て方式である。比較に関しては、静的なマッピング方式では、75%のプロセッサ利用率を達成している。
【0056】
なお、頂点∈「U」が頂点∈「V」と混ざり合わないように、異なる頂点の種類に関する頂点識別子(ID)の範囲は互いに素とする。効率性を高くするために、同じ種類の頂点が連続したIDを持つものとするが、このことは厳しく要求されているわけではない。
【0057】
図7には、一実施形態に従った、例示的な「V」→「U」の検索の最先端702、およびそれに対応する動的なビットマスク704が示されている。「V」→「U」の探査に関して、
図7には、
図5と同じ2部グラフが示されているが、この2部グラフでは、
図5に示される通り、最後の2個のプロセッサだけではなく、全ての8個のプロセッサを稼働状態に維持する、動的な頂点−プロセッサのマッピングが行われる。最先端の頂点∈「V」に対応するブロックは網掛けされて示され、これらのブロックには、例えば、ブロック706および708が含まれる。全ての「V」→「U」の探査ステップでは、頂点∈集合「U」は、間違いなくアイドル状態であるため、
図7では、頂点∈「U」に対応するブロックが空ブロックとして示され、これらのブロックには、例えば、ブロック710、712、714、および716が含まれる。8個の最先端の頂点、および「P=8」が存在するため、プロセッサごとの頂点の数を、次の通り演算することができる。「v
min=24」、「v
max=31」,および
【数11】
均一な頂点分布スキームのもとでは、「V
min={24,25,26,…,32}」かつ「V
*p=V
p={v|ID(v)=24+p}(p=0,1,…,7)」である。すなわち、システム100は、各プロセッサ「p」を(24+p)個のIDを有する単一の頂点に割り当てる。これがプロセッサの利用率が100%の最適な頂点−プロセッサの割り当て方式である。例えば、システム100は、最先端の頂点706および708を、それぞれプロセッサ718および720に割り当てる。ちなみに、静的マッピング方式では、たった25%のプロセッサ利用率しか達成しない。
【0058】
一般グラフ上の動的マッピング
本明細書で開示される動的マッピング方式は、2部グラフに限定されない。以下に、準2部グラフを含む一般グラフ上の並列検索の速度を上げることが可能な、効率的な一般化について説明する。2部グラフ内の頂点と区別するために、一般グラフ内の頂点、およびその頂点の集合は、符号「n」および「N」で示す。「N
src」を源点、例えば、一般グラフ内の全ての頂点∈Nの中で少なくとも1つの後方頂点を有する源点の集合とする。「n
min−src」および「n
max−src」は、それぞれ「N
src」の最小整数識別子および最大整数識別子である。「N
min−src」を下記のような(P+1)個の要素の整数アレイとする。
・N
min−src[0]=n
min−src
・N
min−src[p]<N
min−src[p+1],(なお、「p」=0,1,…,(P−1))
・N
min−src[P]=n
max−src+1
【0059】
「N
min−src」を用いて、システム100は、全体の源点の集合「N
src」を、下記のように、P個の互いに素な部分集合に分割することができる。
Sp={n|n∈N
src∧N
min−src[p]≦ID(n)<N
min−src[p+1]},(なお、「p」=0,1,…,(P−1))
【0060】
「S
*p」をプロセッサ「p」に関する最先端の頂点の集合とすると:
S*p={n|n∈S
p∧frontier(n)=true}となる。
【0061】
「p」番目のビットの値であるM
S[p]が下記の値となるように「M
S」を「P」ビットのビットマスクにすると、
【数12】
であり、
【数13】
である。
【0062】
「M
S[p]=0」とは、プロセッサ「p」には、演算すべき最先端の頂点がないことを意味する。「M
S[p]=1」は最悪のケースでも「|S
p|」の頂点と同じ数の頂点があり得るが、プロセッサ「p」が処理する少なくとも1つの最先端の頂点が存在することを示唆している。
【0063】
なぜ上記の式が一般化なのかを確認するために、「M
s」と、2部グラフに関して規定された動的ビットマスク「M」との関係を検査することができる。上記に記載した通り、「U」→「V」の探査では「M=M
U」であり、「V」→「U」の探査では「M=M
V」である。「U」→「V」の探査に関して、源点の集合は「U」であり、「∀p」、「U
p=S
p」および「U
*p=S
*p」である。したがって、「U」→「V」の探査では、「M
U=M
S」となる。「V」→「U」の探査に関して、源点の集合は「V」であり、「∀p」、「V
p=S
p」および「V
*p=S
*p」である。したがって、「V」→「U」の探査では、「M
V=M
S」となる。両方の場合において、「M=M
S」であり、したがって、これら二つは、2部グラフにおいて等価である。全ての探査ステップにおける源点の集合が、いつでもよく定義されているため、「M
S」は一般グラフに適用可能であるが、「M」(「M
U」または「M
V」)は適用可能ではない、というのも、このMは、2部グラフ内でのみ見つけ出すことができる「U」頂点および「V」頂点の概念に基づくためである。
【0064】
図8には、一実施形態に従った、「U」→「V」の探査に関して、頂点をプロセッサに動的に割り当てるための例示的な処理のフローチャートが示されている。動作中、システム100はグラフの辺と頂点を規定する入力情報を受信する(動作802)。システム100は、ユーザ入力を通して、または前もって格納されたグラフデータとして、あるいはその他のあらゆる方法を通して、グラフデータを受信することができる。次に、システム100は、プロセッサの数を決定する(動作804)。例えば、システム100は、50個のプロセッサに関して「P=50」と決定することができる。但し、システム100が頂点をプロセッサに割り当てるとき、システム100は、毎回、ステップ802およびステップ804を実行する必要はない。実装形態によっては、グラフごとに一度、およびグラフの変更に関する付加的なデータを続いて受信したときに、システム100が、ステップ802およびステップ804を実行することができる。
【0065】
システム100が「U」→「V」の探査ステップを実行するとき、システム100は、頂点「U」の集合内の頂点を動的に決定して各プロセッサに割り当てる。最初に、システム100は、頂点「U」の集合を「p」個の互いに素な部分集合「U
p」に分割し、これらの各部分集合「U
p」は、各プロセッサ「p」と関連する(動作806)。次に、システム100は、プロセッサ「p」に関する最先端の頂点の集合である「U
*p」を決定する(動作808)。次いで、システム100は、
【数14】
の場合にはp番目のビットの値である「M
U[p]」が「1」となるよう、「p」ビットのビットマスクである「M
U」を決定し、
【数15】
の場合にはp番目のビットの値が「0」となるように、「p」ビットのビットマスクである「M
U」を決定する(動作810)。次いで、システム100は、「M
U[p]」=「1」の場合の処理のために、最先端の頂点である「U
*p」をプロセッサ「p」に割り当てる(動作812)。なお、「M
U[p]=0」の場合、これはプロセッサ「p」が処理する最先端の頂点が存在しないことを意味し、実施形態によっては、システム100が、他のプロセッサから、いくつかの処理を取り出し、プロセッサ「p」に割り当てることができる。
【0066】
図9には、一実施形態に従った、「V」→「U」の探査に関して、頂点をプロセッサに動的に割り当てるための例示的な処理を示すフローチャートが示されている。動作中、システム100は、グラフの辺および頂点を規定する入力情報を受信する(動作902)。システム100は、ユーザ入力を通して、または事前に格納されたグラフデータとして、あるいはその他のあらゆる方法を通して、グラフデータを取得することができる。次に、システム100は、プロセッサの数を決定する(動作904)。例えば、システム100は、50個のプロセッサに関して「P=50」と決定することができる。但し、システム100が頂点をプロセッサに割り当てるとき、システム100は、毎回、ステップ902およびステップ904を実行する必要はない。実装形態によっては、グラフごとに一度、およびグラフの変更に関する付加的なデータを受信したときに、システム100が、ステップ902およびステップ904を実行することができる。
【0067】
システム100が「V」→「U」の探査ステップを実行するとき、システム100は、各プロセッサに割り当てる頂点「V」の集合内の頂点を動的に決定して各プロセッサに割り当てる。最初に、システム100は、頂点「V」の集合を「p」個の互いに素な部分集合「V
p」に分割し、これらの各部分集合「V
p」は、各プロセッサ「p」と関連する(動作906)。次に、システム100は、プロセッサ「p」に関する最先端の頂点の集合である「V
*p」を決定する(動作908)。次いで、システム100は、
【数16】
の場合にはp番目のビットの値であるM
V[p]が「1」となるよう、「p」ビットのビットマスクである「M
V」を決定し、
【数17】
の場合にはp番目のビットの値が「0」となるように、「p」ビットのビットマスクである「M
V」を決定する(動作910)。次いで、システム100は、「M
V[p]=1」の場合の処理のために、最先端の頂点「V
*p」をプロセッサ「p」に割り当てる(動作912)。なお、「M
V[p]=0」の場合、これはプロセッサ「p」が処理する最先端の頂点が存在しないことを意味し、実施形態によっては、システム100は、他のプロセッサから、いくつかの処理を取り出し、プロセッサ「p」に割り当てることができる。
【0068】
図10には、一実施形態に従った、一般グラフにおける源点から終点への探査に関して、頂点をプロセッサに動的に割り当てる例示的な処理のフローチャートが示されている。動作中、システム100は、グラフの辺と頂点を規定する入力情報を受信する(動作1002)。システム100は、ユーザ入力を通して、または事前に格納されたグラフデータとして、あるいはその他のあらゆる方法を通して、グラフデータを受信することができる。次に、システム100はプロセッサの数を決定する(動作1004)。例えば、システム100は、50個のプロセッサに関して「P=50」と決定することができる。但し、システム100が頂点をプロセッサに割り当てるとき、システム100は、毎回、ステップ1002およびステップ1004を実行する必要はない。実装形態によっては、グラフごとに一度、およびグラフの変更に関するデータを続いて受信したときに、システム100は、ステップ1002およびステップ1004を実行することができる。
【0069】
システム100が源点から終点への探査ステップを実行するとき、システム100は、各プロセッサに割り当てる、源点「N
src」の集合内の頂点を動的に決定して各プロセッサに割り当てる。最初に、システム100は、源点「N
src」の集合を、「P」個の互いに素な部分集合「S
p」に分割し、各部分集合「S
p」は各プロセッサ「p」と関連する(動作1006)。次に、システム100は、プロセッサ「p」に関する最先端の頂点の集合「S
*p」を決定する(動作1008)。次いで、システム100は、
【数18】
の場合には「M
S[p]」(p番目のビットの値)が「1」となるよう、「p」ビットのビットマスクである「M
S」を決定し、
【数19】
の場合にはp番目のビットの値が「0」となるように、「p」ビットのビットマスクである「M
S」を決定する(動作1010)。次いで、システム100は、「M
S[p]」=「1」の場合の処理のために、最先端の頂点「S
*p」をプロセッサ「p」に割り当てる(動作1012)。なお、「M
s[p]=0」の場合、これはプロセッサ「p」が処理する最先端の頂点が存在しないことを意味し、実施形態によっては、システム100が、他のプロセッサから、いくつかの処理を取り出し、プロセッサ「p」に割り当てることができる。
【0070】
図11には、一実施形態に従った、グラフ探査に関して開示されたプロセッサの使用技術を用いた、商品に関する推奨を生成するための例示的な処理のフローチャートが示されている。この処理により、システム100は、プロセッサリソースを効率的に用いて、同じ商品を同様に購入した他の人達が、購入したその他の商品を、商品を購入したユーザに推奨することができる。
【0071】
動作中、システム100は、最初に、顧客−商品のグラフの頂点と辺を示すグラフデータを受信する(動作1102)。頂点は顧客と商品を表し、辺は購買行動を表す。そのようなグラフは、顧客が頂点の一つの集合として表され、商品が頂点の別の集合として表された、2部グラフでよい。次に、システム100は、顧客を表す頂点をプロセッサの集合に割り当てることができる(動作1104)。システム100は、
図8に示された方法のいくつかのステップを実行して、顧客の頂点をプロセッサに動的に割り当てることができる(例えば、動作804から動作812)。システム100は、顧客を表す頂点の集合から購入された商品を表す頂点の集合へのグラフの探査を行う(動作1106)。次いで、システム100は、購入された商品を表す頂点をプロセッサの集合に割り当てる(動作1108)。システム100は、
図9に示された方法のいくつかのステップを実行して、商品の頂点をプロセッサに動的に割り当てることができる(例えば、動作904から動作912)。
【0072】
ある実施形態では、システム100は、頂点を全ての使用可能なプロセッサに動的に割り当てる。したがって、プロセッサのある集合は、ある時は顧客を表す頂点を処理することができ、また別の時は商品を表す頂点を処理することができる。同じプロセッサの集合が、顧客の頂点と商品の頂点の両方を処理することが可能である。但し、一般に、動的マッピングを行う状況では、探査されるグラフは、探査方向には関係なく、同じものとする。2つのグラフが同じであるかどうかをテストする課題については、2013年9月27日出願の、発明者Rong Zhou および Daniel Daviesによる「System and Method for a High−Performance Graph Analytics Engine」と題する、米国特許出願第14/039,941号明細書(弁理士整理番号第PARC−20130118−UP−NP号明細書)で議論されており、この開示内容は参照することにより、本明細書に完全に組み込まれるものとする。
【0073】
次に、システム100は、購入された商品を表す頂点の集合から、その商品を同様に購入した顧客を表す頂点の集合へのグラフを探査する(動作1110)。次いで、システム100は、その商品を同様に購入した顧客を表す頂点をプロセッサの集合に割り当てる(動作1112)。システム100は、
図8に示された方法のいくつかのステップ(例えば、動作804から動作812)を実行して、顧客の頂点をプロセッサに動的に割り当てることができる。但し、このステップでの、顧客の頂点のプロセッサへの割り当ては、以前、動作1104で行われた、顧客の頂点のプロセッサへの割り当てとは異なる可能性がある。システム100は、その商品を同様に購入した顧客を表す頂点の集合から、推奨することができる商品を表す頂点の集合へのグラフの探査を行う(動作1114)。次いで、システム100は、このグラフの探査および推奨可能な商品に基づいて、商品に関する推奨を生成する(動作1116)。システム100は、標準的な方法を用いて、推奨可能な商品のセレクションを推奨するために選択することができる。例えば、所定の評価の閾値を超えた推奨可能な1つ以上の商品、または最も高い評価を得た推奨可能な1つ以上の商品を選択する。
【0074】
図3に示される準2部グラフを用いて、非2部グラフに関する、開示された技術の一般性を説明することができる。
図1Aおよび
図3の両方において、左側の上段から下段に、かつ右側の上段から下段に頂点「ID」が番号を付けられている、すなわち左側の上段(下段)の頂点が「0」(4)の「ID」を有し、右側の上段(下段)の頂点が「5」(8)の「ID」を有するものと仮定すると、下記には、最小源点「ID」および最大源点「ID」の統計値が示されている。
・左から右の探査(矢印の方向に沿った)
o「n
min−src=0」かつ「n
max−src=4」(
図1A)
o「n
min−src=0」かつ「n
max−src=4」(
図3)
・右から左の探査(方向の矢印に逆らった)
o「n
min−src=5」かつ「n
max−src=8」(
図1A)
o「n
min−src=4」かつ「n
max−src=8」(
図3)
【0075】
図1Aが2部グラフで、
図3だけが準2グラフであったとしても、これらの2つのグラフは同様の構造を共有し、それに伴い、同様の統計値を共有する。これらのグラフは、「n
min−src」の統計値において、右から左の探査(例えば、
図1Aの「V」→「U」)に関して1つ(5対4)異なるだけであるため、本明細書に開示された技術を用いることにより、これらの2つのグラフの並列検索の効率性を比較できるはずである。左から右の探査に関して、2つのグラフは全く同じ統計値を有する。したがって、同じ頂点−プロセッサのマッピングとなり、これにより、並列の効率性における、これらのグラフの違いが、あったとしても、より小さくなる。開示された技術は、きっちりとした2部グラフである必要がないため、コンピュータ的にコストがかかる、グラフの2部グラフ性に関する確認の必要はない。
【0076】
但し、中には動的マッピングの技術が、一般グラフで単独では、著しく速度を増加させない場合もある。例えば、
図3に頂点「0」(上段の左)から頂点「1」(上段から2番目の左)の辺が存在する場合、「n
min−src」の統計値は、右から左の探査に関して「1」となり、これにより並列の効率性は低下する可能性がある。統計値「n
min−src」および「n
max−src」がグラフの2部に背く辺により著しい影響を受けないよう頂点の「ID」を並び変えることができる場合、一般グラフ上での動的なマッピングの効率性を向上させることが可能である。いつもの通り、2部グラフ上では動的なマッピングの並列の効率性は、頂点がどのように番号を付けられているかにかかわらず保証される。動的なマッピングのオーバヘッドはごくわずかものであるため、動的なマッピングが特定の一般グラフ上であまり効果的でないときであっても、この動的なマッピングを実行することにつては、通常、損害はない。
【0077】
ここまで本開示では、効率的なグラフ探査のためにシステム内で実施可能な、動的な頂点−プロセッサのマッピング方式について説明してきた。しかし、動的なマッピング方式を汎用のグラフ分析エンジンと統合する際に未だに課題が存在し得る。つなぎ目のない統合を容易にするための基本ステップについて以下に説明する。
【0078】
システム100は、グラフに各探査方向で、それらのグラフ統計値「n
min−src」および「n
max−src」の注釈を付ける。システム100は、グラフ読取り関数を用いてこれを実現し、このグラフ読取り関数は、グラフが最初に読み込まれるとき、非分離頂点に関する最小「ID」および最大「ID」を記録する。システム100が、グラフを動的に修正することができる場合、グラフが変化するときにそれに応じて、システム100は、それらの統計値を更新する必要がある。これらの統計値の記録は簡単であるため、これによりほとんどエンジンにはオーバヘッドが加わらない。
【0079】
頂点−プロセッサのマッピング関数は、頂点「ID」の全範囲(例えば、[0,n
max]または[n
min,n
max])の代わりに、範囲[n
min−src,n
max−src]を分割し、この後、この部分範囲内の頂点をプロセッサまたは並列検索に関するスレッドに割り当てる。
【0080】
それらの最先端の頂点を効率的に見つけ出すために(例えば、全ての頂点を明示的に列挙することなしに)、グラフ分析エンジンはビットマスク(例えば、M
Sと同様の)を用いることができ、このビットマスクが部分範囲ごとにフラグを維持する。システム100は、部分範囲のフラグを設定して、その部分範囲が次の探査ステップ(すなわち、最も近い将来)に関する1つ以上の最先端の頂点を含むようにする(現在の探査ステップに関して規定される「M
S」とは異なり)。システム100は、現在の探査ステップにおいて、これらの「subrange−has−frontier−vertex」フラグを更新するが、このことは、次の探査ステップのための演算を節約することを意図し、これにより、これらのフラグが設定されていない部分範囲を安全にスキップすることができる。
【0081】
汎用のグラフ分析エンジンでは、探査ベースの演算はその他の非探査ベースの演算と共存する必要があり得る。したがって、このようなデータ構造が探査ベースの演算と非探査ベースの演算の間で共有される場合は特に、そのエンジンが、種々のビットマスク(例えば、M
S)およびフラグ(例えば、「subrange−has−frontier−vertex」フラグ)を適切に用いているか(例えば、初期化されたか、アクセスされたか、および破壊されたか)を確認しなければならない。例えば、現在の「subrange−has−frontier−vertex」フラグを潜在的に無効とし得る非探査ステップにより、2つの探査ステップが分離された場合、そのエンジンが安全な場所でエラーを起こし、演算の正確さのためにそのようなフラグを無視するものとする。
【0082】
動的なマッピングは、2部グラフおよび特定の準2部グラフ上で100%に近い並列効率性を実現することができるが、対照的に、静的なマッピングでは効率性が低い。探査方向および2つの区画サイズの割合によって、静的なマッピングは2部グラフ上の並列検索に関する動的なマッピングよりも随意的に悪くなる可能性がある。開示されている技術の実際の利益を評価するために、発明者らは、小売業の実在のデータセットを用いて次の実験を行った。
【0083】
この実験では、次の形態の顧客の購買データに基づくグラフが用いられた。<顧客_id><商品_id>、なお、<顧客_id>を有する顧客が、<商品_id>を有する商品を購入する。上記に記載した通り、「customer−bought−product」グラフは、顧客の頂点と商品の頂点の間にのみ辺が存在することができる2部グラフである。このベンチマークのクエリは、上記に記載したのと同じ協調フィルタである(便宜上、下記に再度記述する)。
1.顧客の頂点からスタートし、その顧客により購入された商品の集合を見つけ出す。
2.これらの商品のうちの少なくとも1つを購入した他の顧客を見つけ出す。
3.これらの顧客により購入された最も人気のある商品を見つけ出す。
発明者らは、以下の理由から、上記の協調フィルタのクエリを選んで開示されている技術の並列効率性の基準を定めた。第1に、このクエリは「U」→「V」の探査(ステップ1での顧客→商品)、および「V」→「U」の探査(ステップ2での商品→顧客)の両方を必要とする。第2に、このクエリは、様々な商品が購入された回数の記録を担うカウンタを初期化するなど、いくつかの非グラフベースの演算を含む。
【0084】
さらに、この実装形態では、一般の商品の購入行動(例えば、閲覧された共通の商品)に加えて複数のフィルタ基準が使用可能なため、ステップ1の「シード」顧客になんらかの形で関連する顧客の集合を精製するため、ビットマップなどの付加的なデータ構造を用いる。多くの実在の分析問題がグラフベースの演算および非グラフベースの演算の両方を必要とするため、例えば、このエンジンの非グラフの様態を行う演算が、実験のアプリケーションの現実感を増す。実測秒の間、非グラフ演算がグラフベースの演算を支配することを避けるため、この実験では、システム100が、結果を出力し、その結果をディスクに格納されたファイルに書き込む必要はなかった。しかし、発明者らはファイルに書き込まれる結果は、静的なマッピングおよび動な的マッピングの両方に関して全く同じであったろうということを検証した。
【0085】
実験で使用されたグラフ「customer−bought−product」は、一方の探査方向で約24,400,000本の辺を有する。したがって、格納されている辺の総数は、両方向の探査に関して、約24,400,000本×2=48,800,000本の辺となる。在庫管理ユニット(SKU)のレベルで、400,000個を超える一意の商品に対して、約3,000,000人の一意の顧客が存在する。したがって、|U|と|V|の割合は約「7」または約「8」である。システム100は、ステップ1で使用されたクエリとは、異なる「シード」として、100人の顧客の集合をランダムに選び、平均実測秒を記録し、その平均実測秒を頂点からプロセッサへのマッピングの異なるアプローチ間で比較する。ベースラインとして、この実験には静的なマッピング実装形態も含まれ、この静的なマッピング実装形態は頂点の集合を互いに素な部分範囲に静的に分割し、並列検索を行うために、異なる部分範囲を異なるプロセッサに割り当てる。ベースラインの実装形態内の全てのスレッドが集団で頂点の全範囲を処理し、一方、新しい動的なマッピングのアプローチはその源点だけを処理する。実験では、4個のコアおよび8GBのRAMを有するIntel Xeon E3−1225 3.1GHzのプロセッサを搭載したテスト機を使用した。この実験では、ベースラインに関して、利用可能な最良の構成が用いられ、本開示により新しい並列の技術が可能となった。
【0086】
100人のランダムなシード顧客を処理する平均実測時間は、静的なマッピングに関して36ミリ秒であり、動的なマッピングに関して14ミリ秒であり、これはベースラインよりも約2.6倍速い。上記に記載した通り、ベンチマークにおけるメモリの初期化および顧客のフィルタリングを含む複数の演算ステップは、ベースラインと新しい技術の両方で共通である。したがって、動的なマッピングの相対的な速度の利点は、純粋なグラフの探査に関して、ここで報告したものよりも著しく大きなものになる可能性がある。さらに、このテスト機は、コアを4個しか備えておらず、最大並列の速度アップは4倍までに制限される。しかし、より多くのコアを用いることにより、動的なマッピング法について、さらに大きな速度の上昇が期待できる。
【0087】
図12には、一実施形態に従った、探査に関して最先端の頂点をプロセッサに動的に割り当てることを容易にする、例示的な装置1200が示されている。装置1200は、複数のモジュールを含むことができ、これらのモジュールは、有線または無線の通信チャネルを介して互いに通信可能である。装置1200は、1つ以上の集積回路を用いて実現可能であり、
図12に示されるモジュールよりも少ない数、あるいは多い数のモジュールを含むことが可能である。さらに、装置1200をコンピュータシステム内に組み込むことができる、あるいはその他のコンピュータシステムおよび/または装置と通信可能な別の装置として実現することもできる。具体的には、装置1200は、グラフデータ受信モジュール1202、頂点分割モジュール1204、最先端頂点決定モジュール1206、およびビットマスク決定モジュール1208を含むことができる。
【0088】
いくつかの実施形態では、グラフデータ受信モジュール1202は、グラフの頂点と辺を記述したデータを受信することができる。頂点分割モジュール1204は、本明細書に記載される技術を用いて、プロセッサ間の頂点を分割することができる。最先端頂点決定モジュール1206は、検索の最先端の一部である頂点を決定する。ビットマスク決定モジュール1208は、ビットマスクを決定する。なお、
図1に示されるグラフ管理モジュール102は、
図12に示した種々のモジュールの全ての機能を提供することができる。
【0089】
図13には、一実施形態に従った、探査に関して頂点をプロセッサに動的に割り当てることを容易にする、例示的なコンピュータシステム1300が示されている。ある実施形態では、コンピュータシステム1300は、プロセッサ1302、メモリ1304、および 記憶装置1306を含む。記憶装置1306には、アプリケーション1310および1312などの複数のアプリケーション、およびオペレーティングシステム1316が格納される。記憶装置1306には、またグラフ演算システム100も格納され、このグラフ演算システム100が、グラフデータ受信モジュール1202、頂点分割モジュール1204、最先端頂点決定モジュール1206、およびビットマスク決定モジュール1208を含むことができる。記憶装置1306にはまた、グラフデータ1330も格納され得る。動作中、グラフ演算システム100などの1つ以上のアプリケーションが、記憶装置1306からメモリ1304に読み込まれ、プロセッサ1302により実行される。プログラムを実行する間、プロセッサ1302は上述の関数を実行する。コンピュータおよび通信システム1300は、随意的なディスプレイ1317、キーボード1318、およびポインティングデバイス1320と接続可能である。