@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそ、すべては、SystemC v0.9公開から始まった
Graphcoreが POPLIBS をオープンソース化したというのが昨日のブログ。
今日のブログでは、IPU でも ホストのメモリを使うというお話。
Graphcoreの IPU は内部SRAMをたっぷり持っているので、外部メモリ(DRAM)を接続するインターフェースを持っていません。ということは大きなモデルになってくると、そのモデルのパラメータがIPUの内部SRAMに乗りきらなくなるということ。そこで、今日のブログの内容になるのですが、ホストのメモリを使うというもの。
詳細は、下記のブログに書いてありまっす。この記事が出るまで、ホストのメモリはイメージデータやパラメータをIPUの内部に送り込む時だけ使うのだと思っていました。
このブログでは、IPUは
- In-Processor Memory
- Streaming Memory
という2つのメモリにアクセスできると。In-Processor Memoryが今まで出てきた内部SRAMで、実際には各プロセッサ(PU)のローカルなSRAMになります。一方、Streaming Memoryはホストのメモリで各IPUに対して16GB割り当てている。DELLサーバーには8枚のIPUボード(16個のIPU)なので、256GB(Blogでは260GBとなっています)を使うと。
この Streaming Memory はユーザーが POPLAR API を使って、次のようにして使うようです(引用します)
// Add a remote buffer in streaming memory
auto r = graph.addRemoteBuffer("MyRemoteBuffer", FLOAT, 128, 10);// Add a 2D graph variable in in-processor memory
auto v = graph.addVariable(FLOAT, {8, 16});
...
...
// Copy the variable into the remote buffer
prog.add(Copy(v, r));
...
addRemoteBuffer という API を使って、Streaming Memoryを割り当てるだけで移行は特に意識することなく使えるようです。
POPARTでは、
Devicex::createRemoteBufferという関数
と
Devicex::getOrCreateHostReduceRemoteBufferという関数
の中で使われいます。
また、TensorFlowの中では、
と
の中で呼ばれています。