blob: 6a14e7cad46e48f23e4314d80b92ba0a75261725 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta content="IE=edge" http-equiv="X-UA-Compatible"/>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<title>KVStore API — mxnet documentation</title>
<link crossorigin="anonymous" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" rel="stylesheet"/>
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet"/>
<link href="../../_static/basic.css" rel="stylesheet" type="text/css"/>
<link href="../../_static/pygments.css" rel="stylesheet" type="text/css"/>
<link href="../../_static/mxnet.css" rel="stylesheet" type="text/css">
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../../',
VERSION: '',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: ''
};
</script>
<script src="https://code.jquery.com/jquery-1.11.1.min.js" type="text/javascript"></script>
<script src="../../_static/underscore.js" type="text/javascript"></script>
<script src="../../_static/searchtools_custom.js" type="text/javascript"></script>
<script src="../../_static/doctools.js" type="text/javascript"></script>
<script src="../../_static/selectlang.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"></script>
<script type="text/javascript"> jQuery(function() { Search.loadIndex("/searchindex.js"); Search.init();}); </script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new
Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-96378503-1', 'auto');
ga('send', 'pageview');
</script>
<!-- -->
<!-- <script type="text/javascript" src="../../_static/jquery.js"></script> -->
<!-- -->
<!-- <script type="text/javascript" src="../../_static/underscore.js"></script> -->
<!-- -->
<!-- <script type="text/javascript" src="../../_static/doctools.js"></script> -->
<!-- -->
<!-- <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> -->
<!-- -->
<link href="index.html" rel="up" title="MXNet - Scala API"/>
<link href="../perl/index.html" rel="next" title="MXNet - Perl API">
<link href="ndarray.html" rel="prev" title="NDArray API">
<link href="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-icon.png" rel="icon" type="image/png"/>
</link></link></link></head>
<body background="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-background-compressed.jpeg" role="document">
<div class="content-block"><div class="navbar navbar-fixed-top">
<div class="container" id="navContainer">
<div class="innder" id="header-inner">
<h1 id="logo-wrap">
<a href="../../" id="logo"><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet_logo.png"/></a>
</h1>
<nav class="nav-bar" id="main-nav">
<a class="main-nav-link" href="../../install/index.html">Install</a>
<a class="main-nav-link" href="../../tutorials/index.html">Tutorials</a>
<span id="dropdown-menu-position-anchor">
<a aria-expanded="true" aria-haspopup="true" class="main-nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">Gluon <span class="caret"></span></a>
<ul class="dropdown-menu navbar-menu" id="package-dropdown-menu">
<li><a class="main-nav-link" href="../../gluon/index.html">About</a></li>
<li><a class="main-nav-link" href="http://gluon.mxnet.io">Tutorials</a></li>
</ul>
</span>
<span id="dropdown-menu-position-anchor">
<a aria-expanded="true" aria-haspopup="true" class="main-nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">API <span class="caret"></span></a>
<ul class="dropdown-menu navbar-menu" id="package-dropdown-menu">
<li><a class="main-nav-link" href="../../api/python/index.html">Python</a></li>
<li><a class="main-nav-link" href="../../api/scala/index.html">Scala</a></li>
<li><a class="main-nav-link" href="../../api/r/index.html">R</a></li>
<li><a class="main-nav-link" href="../../api/julia/index.html">Julia</a></li>
<li><a class="main-nav-link" href="../../api/c++/index.html">C++</a></li>
<li><a class="main-nav-link" href="../../api/perl/index.html">Perl</a></li>
</ul>
</span>
<span id="dropdown-menu-position-anchor-docs">
<a aria-expanded="true" aria-haspopup="true" class="main-nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">Docs <span class="caret"></span></a>
<ul class="dropdown-menu navbar-menu" id="package-dropdown-menu-docs">
<li><a class="main-nav-link" href="../../faq/index.html">FAQ</a></li>
<li><a class="main-nav-link" href="../../architecture/index.html">Architecture</a></li>
<li><a class="main-nav-link" href="https://github.com/apache/incubator-mxnet/tree/1.0.0/example">Examples</a></li>
<li><a class="main-nav-link" href="../../model_zoo/index.html">Model Zoo</a></li>
</ul>
</span>
<a class="main-nav-link" href="https://github.com/dmlc/mxnet">Github</a>
<span id="dropdown-menu-position-anchor-community">
<a aria-expanded="true" aria-haspopup="true" class="main-nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">Community <span class="caret"></span></a>
<ul class="dropdown-menu navbar-menu" id="package-dropdown-menu-community">
<li><a class="main-nav-link" href="../../community/index.html">Community</a></li>
<li><a class="main-nav-link" href="../../community/contribute.html">Contribute</a></li>
<li><a class="main-nav-link" href="../../community/powered_by.html">Powered By</a></li>
</ul>
</span>
<a class="main-nav-link" href="http://discuss.mxnet.io">Discuss</a>
<span id="dropdown-menu-position-anchor-version" style="position: relative"><a href="#" class="main-nav-link dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="true">Versions(1.0.0)<span class="caret"></span></a><ul id="package-dropdown-menu" class="dropdown-menu"><li><a class="main-nav-link" href=https://mxnet.incubator.apache.org/>1.1.0</a></li><li><a class="main-nav-link" href=https://mxnet.incubator.apache.org/versions/1.0.0/index.html>1.0.0</a></li><li><a class="main-nav-link" href=https://mxnet.incubator.apache.org/versions/0.12.1/index.html>0.12.1</a></li><li><a class="main-nav-link" href=https://mxnet.incubator.apache.org/versions/0.12.0/index.html>0.12.0</a></li><li><a class="main-nav-link" href=https://mxnet.incubator.apache.org/versions/0.11.0/index.html>0.11.0</a></li><li><a class="main-nav-link" href=https://mxnet.incubator.apache.org/versions/master/index.html>master</a></li></ul></span></nav>
<script> function getRootPath(){ return "../../" } </script>
<div class="burgerIcon dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button"></a>
<ul class="dropdown-menu" id="burgerMenu">
<li><a href="../../install/index.html">Install</a></li>
<li><a class="main-nav-link" href="../../tutorials/index.html">Tutorials</a></li>
<li class="dropdown-submenu">
<a href="#" tabindex="-1">Community</a>
<ul class="dropdown-menu">
<li><a href="../../community/index.html" tabindex="-1">Community</a></li>
<li><a href="../../community/contribute.html" tabindex="-1">Contribute</a></li>
<li><a href="../../community/powered_by.html" tabindex="-1">Powered By</a></li>
</ul>
</li>
<li class="dropdown-submenu">
<a href="#" tabindex="-1">API</a>
<ul class="dropdown-menu">
<li><a href="../../api/python/index.html" tabindex="-1">Python</a>
</li>
<li><a href="../../api/scala/index.html" tabindex="-1">Scala</a>
</li>
<li><a href="../../api/r/index.html" tabindex="-1">R</a>
</li>
<li><a href="../../api/julia/index.html" tabindex="-1">Julia</a>
</li>
<li><a href="../../api/c++/index.html" tabindex="-1">C++</a>
</li>
<li><a href="../../api/perl/index.html" tabindex="-1">Perl</a>
</li>
</ul>
</li>
<li class="dropdown-submenu">
<a href="#" tabindex="-1">Docs</a>
<ul class="dropdown-menu">
<li><a href="../../tutorials/index.html" tabindex="-1">Tutorials</a></li>
<li><a href="../../faq/index.html" tabindex="-1">FAQ</a></li>
<li><a href="../../architecture/index.html" tabindex="-1">Architecture</a></li>
<li><a href="https://github.com/apache/incubator-mxnet/tree/1.0.0/example" tabindex="-1">Examples</a></li>
<li><a href="../../model_zoo/index.html" tabindex="-1">Model Zoo</a></li>
</ul>
</li>
<li><a href="../../architecture/index.html">Architecture</a></li>
<li><a class="main-nav-link" href="https://github.com/dmlc/mxnet">Github</a></li>
<li id="dropdown-menu-position-anchor-version-mobile" class="dropdown-submenu" style="position: relative"><a href="#" tabindex="-1">Versions(1.0.0)</a><ul class="dropdown-menu"><li><a tabindex="-1" href=https://mxnet.incubator.apache.org/>1.1.0</a></li><li><a tabindex="-1" href=https://mxnet.incubator.apache.org/versions/1.0.0/index.html>1.0.0</a></li><li><a tabindex="-1" href=https://mxnet.incubator.apache.org/versions/0.12.1/index.html>0.12.1</a></li><li><a tabindex="-1" href=https://mxnet.incubator.apache.org/versions/0.12.0/index.html>0.12.0</a></li><li><a tabindex="-1" href=https://mxnet.incubator.apache.org/versions/0.11.0/index.html>0.11.0</a></li><li><a tabindex="-1" href=https://mxnet.incubator.apache.org/versions/master/index.html>master</a></li></ul></li></ul>
</div>
<div class="plusIcon dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button"><span aria-hidden="true" class="glyphicon glyphicon-plus"></span></a>
<ul class="dropdown-menu dropdown-menu-right" id="plusMenu"></ul>
</div>
<div id="search-input-wrap">
<form action="../../search.html" autocomplete="off" class="" method="get" role="search">
<div class="form-group inner-addon left-addon">
<i class="glyphicon glyphicon-search"></i>
<input class="form-control" name="q" placeholder="Search" type="text"/>
</div>
<input name="check_keywords" type="hidden" value="yes"/>
<input name="area" type="hidden" value="default">
</input></form>
<div id="search-preview"></div>
</div>
<div id="searchIcon">
<span aria-hidden="true" class="glyphicon glyphicon-search"></span>
</div>
<!-- <div id="lang-select-wrap"> -->
<!-- <label id="lang-select-label"> -->
<!-- <\!-- <i class="fa fa-globe"></i> -\-> -->
<!-- <span></span> -->
<!-- </label> -->
<!-- <select id="lang-select"> -->
<!-- <option value="en">Eng</option> -->
<!-- <option value="zh">中文</option> -->
<!-- </select> -->
<!-- </div> -->
<!-- <a id="mobile-nav-toggle">
<span class="mobile-nav-toggle-bar"></span>
<span class="mobile-nav-toggle-bar"></span>
<span class="mobile-nav-toggle-bar"></span>
</a> -->
</div>
</div>
</div>
<script type="text/javascript">
$('body').css('background', 'white');
</script>
<div class="container">
<div class="row">
<div aria-label="main navigation" class="sphinxsidebar leftsidebar" role="navigation">
<div class="sphinxsidebarwrapper">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../python/index.html">Python Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../r/index.html">R Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../julia/index.html">Julia Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../c++/index.html">C++ Documents</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Scala Documents</a><ul class="current">
<li class="toctree-l2 current"><a class="reference internal" href="index.html#scala-api-reference">Scala API Reference</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="module.html">Module API is a flexible high-level interface for training neural networks.</a></li>
<li class="toctree-l3"><a class="reference internal" href="model.html">Model API is an alternate simple high-level interface for training neural networks.</a></li>
<li class="toctree-l3"><a class="reference internal" href="symbol.html">Symbolic API performs operations on NDArrays to assemble neural networks from layers.</a></li>
<li class="toctree-l3"><a class="reference internal" href="io.html">IO Data Loading API performs parsing and data loading.</a></li>
<li class="toctree-l3"><a class="reference internal" href="ndarray.html">NDArray API performs vector/matrix/tensor operations.</a></li>
<li class="toctree-l3 current"><a class="current reference internal" href="">KVStore API performs multi-GPU and multi-host distributed training.</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#basic-push-and-pull">Basic Push and Pull</a></li>
<li class="toctree-l4"><a class="reference internal" href="#list-key-value-pairs">List Key-Value Pairs</a></li>
<li class="toctree-l4"><a class="reference internal" href="#next-steps">Next Steps</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="index.html#resources">Resources</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../perl/index.html">Perl Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../faq/index.html">HowTo Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../architecture/index.html">System Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../tutorials/index.html">Tutorials</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../community/index.html">Community</a></li>
</ul>
</div>
</div>
<div class="content">
<div class="page-tracker"></div>
<div class="section" id="kvstore-api">
<span id="kvstore-api"></span><h1>KVStore API<a class="headerlink" href="#kvstore-api" title="Permalink to this headline"></a></h1>
<p>Topics:</p>
<ul class="simple">
<li><a class="reference external" href="#basic-push-and-pull">Basic Push and Pull</a></li>
<li><a class="reference external" href="#list-key-value-pairs">List Key-Value Pairs</a></li>
<li><a class="reference external" href="https://mxnet.incubator.apache.org/api/scala/docs/index.html#ml.dmlc.mxnet.KVStore">API Reference</a></li>
</ul>
<div class="section" id="basic-push-and-pull">
<span id="basic-push-and-pull"></span><h2>Basic Push and Pull<a class="headerlink" href="#basic-push-and-pull" title="Permalink to this headline"></a></h2>
<p>Provides basic operation over multiple devices (GPUs) on a single device.</p>
<div class="section" id="initialization">
<span id="initialization"></span><h3>Initialization<a class="headerlink" href="#initialization" title="Permalink to this headline"></a></h3>
<p>Let’s consider a simple example. It initializes
a (<code class="docutils literal"><span class="pre">int</span></code>, <code class="docutils literal"><span class="pre">NDArray</span></code>) pair into the store, and then pulls the value out.</p>
<div class="highlight-scala"><div class="highlight"><pre><span></span> <span class="n">scala</span><span class="o">></span> <span class="k">val</span> <span class="n">kv</span> <span class="k">=</span> <span class="nc">KVStore</span><span class="o">.</span><span class="n">create</span><span class="o">(</span><span class="s">"local"</span><span class="o">)</span> <span class="c1">// create a local kv store.</span>
<span class="n">scala</span><span class="o">></span> <span class="k">val</span> <span class="n">shape</span> <span class="k">=</span> <span class="nc">Shape</span><span class="o">(</span><span class="mi">2</span><span class="o">,</span><span class="mi">3</span><span class="o">)</span>
<span class="n">scala</span><span class="o">></span> <span class="n">kv</span><span class="o">.</span><span class="n">init</span><span class="o">(</span><span class="mi">3</span><span class="o">,</span> <span class="nc">NDArray</span><span class="o">.</span><span class="n">ones</span><span class="o">(</span><span class="n">shape</span><span class="o">)*</span><span class="mi">2</span><span class="o">)</span>
<span class="n">scala</span><span class="o">></span> <span class="k">val</span> <span class="n">a</span> <span class="k">=</span> <span class="nc">NDArray</span><span class="o">.</span><span class="n">zeros</span><span class="o">(</span><span class="n">shape</span><span class="o">)</span>
<span class="n">scala</span><span class="o">></span> <span class="n">kv</span><span class="o">.</span><span class="n">pull</span><span class="o">(</span><span class="mi">3</span><span class="o">,</span> <span class="n">out</span> <span class="k">=</span> <span class="n">a</span><span class="o">)</span>
<span class="n">scala</span><span class="o">></span> <span class="n">a</span><span class="o">.</span><span class="n">toArray</span>
<span class="nc">Array</span><span class="o">[</span><span class="kt">Float</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Array</span><span class="o">(</span><span class="mf">2.0</span><span class="o">,</span> <span class="mf">2.0</span><span class="o">,</span> <span class="mf">2.0</span><span class="o">,</span> <span class="mf">2.0</span><span class="o">,</span> <span class="mf">2.0</span><span class="o">,</span> <span class="mf">2.0</span><span class="o">)</span>
</pre></div>
</div>
</div>
<div class="section" id="push-aggregation-and-updater">
<span id="push-aggregation-and-updater"></span><h3>Push, Aggregation, and Updater<a class="headerlink" href="#push-aggregation-and-updater" title="Permalink to this headline"></a></h3>
<p>For any key that’s been initialized, you can push a new value with the same shape to the key, as follows:</p>
<div class="highlight-scala"><div class="highlight"><pre><span></span> <span class="n">scala</span><span class="o">></span> <span class="n">kv</span><span class="o">.</span><span class="n">push</span><span class="o">(</span><span class="mi">3</span><span class="o">,</span> <span class="nc">NDArray</span><span class="o">.</span><span class="n">ones</span><span class="o">(</span><span class="n">shape</span><span class="o">)*</span><span class="mi">8</span><span class="o">)</span>
<span class="n">scala</span><span class="o">></span> <span class="n">kv</span><span class="o">.</span><span class="n">pull</span><span class="o">(</span><span class="mi">3</span><span class="o">,</span> <span class="n">out</span> <span class="k">=</span> <span class="n">a</span><span class="o">)</span> <span class="c1">// pull out the value</span>
<span class="n">scala</span><span class="o">></span> <span class="n">a</span><span class="o">.</span><span class="n">toArray</span>
<span class="nc">Array</span><span class="o">[</span><span class="kt">Float</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Array</span><span class="o">(</span><span class="mf">8.0</span><span class="o">,</span> <span class="mf">8.0</span><span class="o">,</span> <span class="mf">8.0</span><span class="o">,</span> <span class="mf">8.0</span><span class="o">,</span> <span class="mf">8.0</span><span class="o">,</span> <span class="mf">8.0</span><span class="o">)</span>
</pre></div>
</div>
<p>The data that you want to push can be stored on any device. Furthermore, you can push multiple
values into the same key, where KVStore first sums all of these
values, and then pushes the aggregated value, as follows:</p>
<div class="highlight-scala"><div class="highlight"><pre><span></span> <span class="n">scala</span><span class="o">></span> <span class="k">val</span> <span class="n">gpus</span> <span class="k">=</span> <span class="nc">Array</span><span class="o">(</span><span class="nc">Context</span><span class="o">.</span><span class="n">gpu</span><span class="o">(</span><span class="mi">0</span><span class="o">),</span> <span class="nc">Context</span><span class="o">.</span><span class="n">gpu</span><span class="o">(</span><span class="mi">1</span><span class="o">),</span> <span class="nc">Context</span><span class="o">.</span><span class="n">gpu</span><span class="o">(</span><span class="mi">2</span><span class="o">),</span> <span class="nc">Context</span><span class="o">.</span><span class="n">gpu</span><span class="o">(</span><span class="mi">3</span><span class="o">))</span>
<span class="n">scala</span><span class="o">></span> <span class="k">val</span> <span class="n">b</span> <span class="k">=</span> <span class="nc">Array</span><span class="o">(</span><span class="nc">NDArray</span><span class="o">.</span><span class="n">ones</span><span class="o">(</span><span class="n">shape</span><span class="o">,</span> <span class="n">gpus</span><span class="o">(</span><span class="mi">0</span><span class="o">)),</span> <span class="nc">NDArray</span><span class="o">.</span><span class="n">ones</span><span class="o">(</span><span class="n">shape</span><span class="o">,</span> <span class="n">gpus</span><span class="o">(</span><span class="mi">1</span><span class="o">)),</span> <span class="o">\</span>
<span class="n">scala</span><span class="o">></span> <span class="nc">NDArray</span><span class="o">.</span><span class="n">ones</span><span class="o">(</span><span class="n">shape</span><span class="o">,</span> <span class="n">gpus</span><span class="o">(</span><span class="mi">2</span><span class="o">)),</span> <span class="nc">NDArray</span><span class="o">.</span><span class="n">ones</span><span class="o">(</span><span class="n">shape</span><span class="o">,</span> <span class="n">gpus</span><span class="o">(</span><span class="mi">3</span><span class="o">)))</span>
<span class="n">scala</span><span class="o">></span> <span class="n">kv</span><span class="o">.</span><span class="n">push</span><span class="o">(</span><span class="mi">3</span><span class="o">,</span> <span class="n">b</span><span class="o">)</span>
<span class="n">scala</span><span class="o">></span> <span class="n">kv</span><span class="o">.</span><span class="n">pull</span><span class="o">(</span><span class="mi">3</span><span class="o">,</span> <span class="n">out</span> <span class="k">=</span> <span class="n">a</span><span class="o">)</span>
<span class="n">scala</span><span class="o">></span> <span class="n">a</span><span class="o">.</span><span class="n">toArray</span>
<span class="nc">Array</span><span class="o">[</span><span class="kt">Float</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Array</span><span class="o">(</span><span class="mf">4.0</span><span class="o">,</span> <span class="mf">4.0</span><span class="o">,</span> <span class="mf">4.0</span><span class="o">,</span> <span class="mf">4.0</span><span class="o">,</span> <span class="mf">4.0</span><span class="o">,</span> <span class="mf">4.0</span><span class="o">)</span>
</pre></div>
</div>
<p>For each push command, KVStore applies the pushed value to the value stored by an
<code class="docutils literal"><span class="pre">updater</span></code>. The default updater is <code class="docutils literal"><span class="pre">ASSIGN</span></code>. You can replace the default to
control how data is merged.</p>
<div class="highlight-scala"><div class="highlight"><pre><span></span> <span class="n">scala</span><span class="o">></span> <span class="k">val</span> <span class="n">updater</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">MXKVStoreUpdater</span> <span class="o">{</span>
<span class="k">override</span> <span class="k">def</span> <span class="n">update</span><span class="o">(</span><span class="n">key</span><span class="k">:</span> <span class="kt">Int</span><span class="o">,</span> <span class="n">input</span><span class="k">:</span> <span class="kt">NDArray</span><span class="o">,</span> <span class="n">stored</span><span class="k">:</span> <span class="kt">NDArray</span><span class="o">)</span><span class="k">:</span> <span class="kt">Unit</span> <span class="o">=</span> <span class="o">{</span>
<span class="n">println</span><span class="o">(</span><span class="s">s"update on key </span><span class="si">$key</span><span class="s">"</span><span class="o">)</span>
<span class="n">stored</span> <span class="o">+=</span> <span class="n">input</span> <span class="o">*</span> <span class="mi">2</span>
<span class="o">}</span>
<span class="k">override</span> <span class="k">def</span> <span class="n">dispose</span><span class="o">()</span><span class="k">:</span> <span class="kt">Unit</span> <span class="o">=</span> <span class="o">{}</span>
<span class="o">}</span>
<span class="n">scala</span><span class="o">></span> <span class="n">kv</span><span class="o">.</span><span class="n">setUpdater</span><span class="o">(</span><span class="n">updater</span><span class="o">)</span>
<span class="n">scala</span><span class="o">></span> <span class="n">kv</span><span class="o">.</span><span class="n">pull</span><span class="o">(</span><span class="mi">3</span><span class="o">,</span> <span class="n">a</span><span class="o">)</span>
<span class="n">scala</span><span class="o">></span> <span class="n">a</span><span class="o">.</span><span class="n">toArray</span>
<span class="nc">Array</span><span class="o">[</span><span class="kt">Float</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Array</span><span class="o">(</span><span class="mf">4.0</span><span class="o">,</span> <span class="mf">4.0</span><span class="o">,</span> <span class="mf">4.0</span><span class="o">,</span> <span class="mf">4.0</span><span class="o">,</span> <span class="mf">4.0</span><span class="o">,</span> <span class="mf">4.0</span><span class="o">)</span>
<span class="n">scala</span><span class="o">></span> <span class="n">kv</span><span class="o">.</span><span class="n">push</span><span class="o">(</span><span class="mi">3</span><span class="o">,</span> <span class="nc">NDArray</span><span class="o">.</span><span class="n">ones</span><span class="o">(</span><span class="n">shape</span><span class="o">))</span>
<span class="n">update</span> <span class="n">on</span> <span class="n">key</span> <span class="mi">3</span>
<span class="n">scala</span><span class="o">></span> <span class="n">kv</span><span class="o">.</span><span class="n">pull</span><span class="o">(</span><span class="mi">3</span><span class="o">,</span> <span class="n">a</span><span class="o">)</span>
<span class="n">scala</span><span class="o">></span> <span class="n">a</span><span class="o">.</span><span class="n">toArray</span>
<span class="nc">Array</span><span class="o">[</span><span class="kt">Float</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Array</span><span class="o">(</span><span class="mf">6.0</span><span class="o">,</span> <span class="mf">6.0</span><span class="o">,</span> <span class="mf">6.0</span><span class="o">,</span> <span class="mf">6.0</span><span class="o">,</span> <span class="mf">6.0</span><span class="o">,</span> <span class="mf">6.0</span><span class="o">)</span>
</pre></div>
</div>
</div>
<div class="section" id="pull">
<span id="pull"></span><h3>Pull<a class="headerlink" href="#pull" title="Permalink to this headline"></a></h3>
<p>You’ve already seen how to pull a single key-value pair. Similar to the way that you use the push command, you can
pull the value into several devices with a single call.</p>
<div class="highlight-scala"><div class="highlight"><pre><span></span> <span class="n">scala</span><span class="o">></span> <span class="k">val</span> <span class="n">b</span> <span class="k">=</span> <span class="nc">Array</span><span class="o">(</span><span class="nc">NDArray</span><span class="o">.</span><span class="n">ones</span><span class="o">(</span><span class="n">shape</span><span class="o">,</span> <span class="n">gpus</span><span class="o">(</span><span class="mi">0</span><span class="o">)),</span> <span class="nc">NDArray</span><span class="o">.</span><span class="n">ones</span><span class="o">(</span><span class="n">shape</span><span class="o">,</span> <span class="n">gpus</span><span class="o">(</span><span class="mi">1</span><span class="o">)),\</span>
<span class="n">scala</span><span class="o">></span> <span class="nc">NDArray</span><span class="o">.</span><span class="n">ones</span><span class="o">(</span><span class="n">shape</span><span class="o">,</span> <span class="n">gpus</span><span class="o">(</span><span class="mi">2</span><span class="o">)),</span> <span class="nc">NDArray</span><span class="o">.</span><span class="n">ones</span><span class="o">(</span><span class="n">shape</span><span class="o">,</span> <span class="n">gpus</span><span class="o">(</span><span class="mi">3</span><span class="o">)))</span>
<span class="n">scala</span><span class="o">></span> <span class="n">kv</span><span class="o">.</span><span class="n">pull</span><span class="o">(</span><span class="mi">3</span><span class="o">,</span> <span class="n">outs</span> <span class="k">=</span> <span class="n">b</span><span class="o">)</span>
<span class="n">scala</span><span class="o">></span> <span class="n">b</span><span class="o">(</span><span class="mi">1</span><span class="o">).</span><span class="n">toArray</span>
<span class="nc">Array</span><span class="o">[</span><span class="kt">Float</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Array</span><span class="o">(</span><span class="mf">6.0</span><span class="o">,</span> <span class="mf">6.0</span><span class="o">,</span> <span class="mf">6.0</span><span class="o">,</span> <span class="mf">6.0</span><span class="o">,</span> <span class="mf">6.0</span><span class="o">,</span> <span class="mf">6.0</span><span class="o">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="list-key-value-pairs">
<span id="list-key-value-pairs"></span><h2>List Key-Value Pairs<a class="headerlink" href="#list-key-value-pairs" title="Permalink to this headline"></a></h2>
<p>All of the operations that we’ve discussed so far are performed on a single key. KVStore also provides
the interface for generating a list of key-value pairs. For a single device, use the following:</p>
<div class="highlight-scala"><div class="highlight"><pre><span></span> scala> val keys = Array(5, 7, 9)
scala> kv.init(keys, Array.fill(keys.length)(NDArray.ones(shape)))
scala> kv.push(keys, Array.fill(keys.length)(NDArray.ones(shape)))
update on key: 5
update on key: 7
update on key: 9
scala> val b = Array.fill(keys.length)(NDArray.zeros(shape))
scala> kv.pull(keys, outs = b)
scala> b(1).toArray
Array[Float] = Array(3.0, 3.0, 3.0, 3.0, 3.0, 3.0)
</pre></div>
</div>
</div>
<div class="section" id="next-steps">
<span id="next-steps"></span><h2>Next Steps<a class="headerlink" href="#next-steps" title="Permalink to this headline"></a></h2>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference external" href="https://mxnet.incubator.apache.org/tutorials/index.html#Python-Tutorials">Scala Tutorials</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div aria-label="main navigation" class="sphinxsidebar rightsidebar" role="navigation">
<div class="sphinxsidebarwrapper">
<h3><a href="../../index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">KVStore API</a><ul>
<li><a class="reference internal" href="#basic-push-and-pull">Basic Push and Pull</a><ul>
<li><a class="reference internal" href="#initialization">Initialization</a></li>
<li><a class="reference internal" href="#push-aggregation-and-updater">Push, Aggregation, and Updater</a></li>
<li><a class="reference internal" href="#pull">Pull</a></li>
</ul>
</li>
<li><a class="reference internal" href="#list-key-value-pairs">List Key-Value Pairs</a></li>
<li><a class="reference internal" href="#next-steps">Next Steps</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div><div class="footer">
<div class="section-disclaimer">
<div class="container">
<div>
<img height="60" src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/apache_incubator_logo.png"/>
<p>
Apache MXNet is an effort undergoing incubation at The Apache Software Foundation (ASF), <strong>sponsored by the <i>Apache Incubator</i></strong>. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
</p>
<p>
"Copyright © 2017, The Apache Software Foundation
Apache MXNet, MXNet, Apache, the Apache feather, and the Apache MXNet project logo are either registered trademarks or trademarks of the Apache Software Foundation."
</p>
</div>
</div>
</div>
</div> <!-- pagename != index -->
</div>
<script crossorigin="anonymous" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script src="../../_static/js/sidebar.js" type="text/javascript"></script>
<script src="../../_static/js/search.js" type="text/javascript"></script>
<script src="../../_static/js/navbar.js" type="text/javascript"></script>
<script src="../../_static/js/clipboard.min.js" type="text/javascript"></script>
<script src="../../_static/js/copycode.js" type="text/javascript"></script>
<script src="../../_static/js/page.js" type="text/javascript"></script>
<script type="text/javascript">
$('body').ready(function () {
$('body').css('visibility', 'visible');
});
</script>
</body>
</html>