You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@singa.apache.org by ch...@apache.org on 2021/05/03 09:54:39 UTC

[singa-site] branch master updated: Add the Viet Documentation uploaded by Thao

This is an automated email from the ASF dual-hosted git repository.

chrishkchris pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/singa-site.git


The following commit(s) were added to refs/heads/master by this push:
     new 007e715  Add the Viet Documentation uploaded by Thao
     new b7afbee  Merge pull request #16 from chrishkchris/viet
007e715 is described below

commit 007e715d95deaf87896efe75392aeca62593b505
Author: Chris Yeung <ye...@cermati.com>
AuthorDate: Mon May 3 17:53:05 2021 +0800

    Add the Viet Documentation uploaded by Thao
---
 content/docs/3.1.0_Viet/autograd.html              | 287 +++++++++++
 content/docs/3.1.0_Viet/autograd/index.html        | 287 +++++++++++
 content/docs/3.1.0_Viet/benchmark-train.html       |  44 ++
 content/docs/3.1.0_Viet/benchmark-train/index.html |  44 ++
 content/docs/3.1.0_Viet/build.html                 | 371 ++++++++++++++
 content/docs/3.1.0_Viet/build/index.html           | 371 ++++++++++++++
 content/docs/3.1.0_Viet/contribute-code.html       | 170 +++++++
 content/docs/3.1.0_Viet/contribute-code/index.html | 170 +++++++
 content/docs/3.1.0_Viet/contribute-docs.html       | 159 ++++++
 content/docs/3.1.0_Viet/contribute-docs/index.html | 159 ++++++
 content/docs/3.1.0_Viet/device.html                | 106 ++++
 content/docs/3.1.0_Viet/device/index.html          | 106 ++++
 content/docs/3.1.0_Viet/dist-train.html            | 395 +++++++++++++++
 content/docs/3.1.0_Viet/dist-train/index.html      | 395 +++++++++++++++
 content/docs/3.1.0_Viet/downloads.html             | 296 +++++++++++
 content/docs/3.1.0_Viet/downloads/index.html       | 296 +++++++++++
 content/docs/3.1.0_Viet/examples.html              | 168 +++++++
 content/docs/3.1.0_Viet/examples/index.html        | 168 +++++++
 content/docs/3.1.0_Viet/git-workflow.html          | 179 +++++++
 content/docs/3.1.0_Viet/git-workflow/index.html    | 179 +++++++
 content/docs/3.1.0_Viet/graph.html                 | 550 +++++++++++++++++++++
 content/docs/3.1.0_Viet/graph/index.html           | 550 +++++++++++++++++++++
 content/docs/3.1.0_Viet/history-singa.html         | 115 +++++
 content/docs/3.1.0_Viet/history-singa/index.html   | 115 +++++
 content/docs/3.1.0_Viet/how-to-release.html        | 254 ++++++++++
 content/docs/3.1.0_Viet/how-to-release/index.html  | 254 ++++++++++
 content/docs/3.1.0_Viet/install-win.html           | 358 ++++++++++++++
 content/docs/3.1.0_Viet/install-win/index.html     | 358 ++++++++++++++
 content/docs/3.1.0_Viet/installation.html          | 215 ++++++++
 content/docs/3.1.0_Viet/installation/index.html    | 215 ++++++++
 content/docs/3.1.0_Viet/issue-tracking.html        |  92 ++++
 content/docs/3.1.0_Viet/issue-tracking/index.html  |  92 ++++
 content/docs/3.1.0_Viet/mail-lists.html            | 100 ++++
 content/docs/3.1.0_Viet/mail-lists/index.html      | 100 ++++
 content/docs/3.1.0_Viet/onnx.html                  | 418 ++++++++++++++++
 content/docs/3.1.0_Viet/onnx/index.html            | 418 ++++++++++++++++
 content/docs/3.1.0_Viet/optimizer.html             | 190 +++++++
 content/docs/3.1.0_Viet/optimizer/index.html       | 190 +++++++
 content/docs/3.1.0_Viet/security.html              |  91 ++++
 content/docs/3.1.0_Viet/security/index.html        |  91 ++++
 content/docs/3.1.0_Viet/software-stack.html        | 201 ++++++++
 content/docs/3.1.0_Viet/software-stack/index.html  | 201 ++++++++
 content/docs/3.1.0_Viet/source-repository.html     | 103 ++++
 .../docs/3.1.0_Viet/source-repository/index.html   | 103 ++++
 content/docs/3.1.0_Viet/team-list.html             | 147 ++++++
 content/docs/3.1.0_Viet/team-list/index.html       | 147 ++++++
 content/docs/3.1.0_Viet/tensor.html                | 289 +++++++++++
 content/docs/3.1.0_Viet/tensor/index.html          | 289 +++++++++++
 content/docs/3.1.0_Viet/time-profiling.html        | 227 +++++++++
 content/docs/3.1.0_Viet/time-profiling/index.html  | 227 +++++++++
 content/docs/3.1.0_Viet/wheel-cpu-dev.html         |  95 ++++
 content/docs/3.1.0_Viet/wheel-cpu-dev/index.html   |  95 ++++
 content/docs/3.1.0_Viet/wheel-cpu.html             | 101 ++++
 content/docs/3.1.0_Viet/wheel-cpu/index.html       | 101 ++++
 content/docs/3.1.0_Viet/wheel-gpu-dev.html         |  95 ++++
 content/docs/3.1.0_Viet/wheel-gpu-dev/index.html   |  95 ++++
 content/docs/3.1.0_Viet/wheel-gpu.html             | 104 ++++
 content/docs/3.1.0_Viet/wheel-gpu/index.html       | 104 ++++
 content/en/versions.html                           |   2 +-
 content/en/versions/index.html                     |   2 +-
 content/img/GraphOfMLP.png                         | Bin 507141 -> 506243 bytes
 content/img/benchmark.png                          | Bin 92742 -> 92979 bytes
 content/img/overview.png                           | Bin 60478 -> 61027 bytes
 content/img/singa-logo-square.png                  | Bin 89335 -> 89230 bytes
 content/img/singa-logo.png                         | Bin 131060 -> 130799 bytes
 content/img/singa.png                              | Bin 321889 -> 322187 bytes
 content/img/singav1-sw.png                         | Bin 23605 -> 23603 bytes
 content/img/singav3-sw.png                         | Bin 16756 -> 16759 bytes
 content/img/singav3.1-sw.png                       | Bin 16814 -> 16821 bytes
 content/img/users/carnegietech.png                 | Bin 22256 -> 22268 bytes
 content/img/users/foodlg.png                       | Bin 8775 -> 8792 bytes
 content/img/users/sgh.png                          | Bin 28492 -> 28542 bytes
 content/img/users/shentilium.png                   | Bin 61291 -> 61187 bytes
 content/sitemap.xml                                |   2 +-
 content/versions.html                              |   2 +-
 content/versions/index.html                        |   2 +-
 76 files changed, 11845 insertions(+), 5 deletions(-)

diff --git a/content/docs/3.1.0_Viet/autograd.html b/content/docs/3.1.0_Viet/autograd.html
new file mode 100644
index 0000000..9862ebd
--- /dev/null
+++ b/content/docs/3.1.0_Viet/autograd.html
@@ -0,0 +1,287 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Autograd · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright owners [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/autograd.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Autograd</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license  [...]
+<p>Có hai cách thường dùng để sử dụng autograd, qua symbolic differentiation như là <a href="http://deeplearning.net/software/theano/index.html">Theano</a> hoặc reverse
+differentiation như là
+<a href="https://pytorch.org/docs/stable/notes/autograd.html">Pytorch</a>. SINGA dùng cách Pytorch, lưu trữ computation graph rồi áp dụng backward
+propagation tự động sau khi forward propagation. Thuật toán autograd được giải thích cụ thể ở
+<a href="https://pytorch.org/docs/stable/notes/autograd.html">đây</a>. Chúng tôi giải thích các modules liên quan trong Singa và đưa ra ví dụ để minh hoạ cách sử dụng.</p>
+<h2><a class="anchor" aria-hidden="true" id="các-module-liên-quan"></a><a href="#các-module-liên-quan" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<p>Autograd gồm ba classes với tên gọi <code>singa.tensor.Tensor</code>,
+<code>singa.autograd.Operation</code>, và <code>singa.autograd.Layer</code>. Trong phần tiếp theo của văn kiện này, chúng tôi dùng tensor, operation và layer để chỉ một chương trình (instance) trong class tương ứng.</p>
+<h3><a class="anchor" aria-hidden="true" id="tensor"></a><a href="#tensor" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
+<p>Ba tính năng của Tensor được sử dụng bởi autograd,</p>
+<ul>
+<li><code>.creator</code> là một chương trình <code>Operation</code>. Chương trình này lưu trữ tác vụ tạo ra Tensor instance.</li>
+<li><code>.requires_grad</code> là một biến kiểu bool. Biến được sử dụng để chỉ rằng thuật toán autograd cần tính ra độ dốc (gradient) của tensor. (như owner). Ví dụ, khi chạy backpropagation, thì cần phải tính ra độ dốc của tensor cho ma trận trọng lượng (weight matrix) của lớp tuyến tính (linear layer) và bản đồ tính năng (feature map) của convolution
+layer (không phải lớp cuối).</li>
+<li><code>.stores_grad</code> là một biến kiểu bool. Biến được sử dụng để chỉ rằng độ dốc của owner tensor cần được lưu và tạo ra bởi hàm backward. Ví dụ, độ dốc của feature maps được tính thông qua backpropagation, nhưng không được bao gồm trong kết quả của hàm backward.</li>
+</ul>
+<p>Lập trình viên có thể thay đổi <code>requires_grad</code> và <code>stores_grad</code> của chương trình Tensor. Ví dụ nếu hàm sau để là True, độ dốc tương ứng sẽ được bao gồm trong kết quả của hàm backward. Cần lưu ý rằng nếu <code>stores_grad</code> để là True, thì <code>requires_grad</code> cũng phải là True, và ngược lại.</p>
+<h3><a class="anchor" aria-hidden="true" id="operation"></a><a href="#operation" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
+<p>Hàm chạy một hoặc một vài chương trình <code>Tensor</code> instances ở đầu vào, sau đó đầu ra là một hoặc một vài chương trình <code>Tensor</code> instances. Ví dụ, hàm ReLU có thể được sử dụng như một subclass của một hàm Operation cụ thể. Khi gọi một chương trình <code>Operation</code> (sau cài đặt), cần thực hiện hai bước sau:</p>
+<ol>
+<li>Ghi lại hàm operations nguồn, vd. biến <code>creator</code>của tensor đầu vào.</li>
+<li>làm tính toán bằng cách gọi hàm thành viên <code>.forward()</code></li>
+</ol>
+<p>Có hai hàm thành viên cho forwarding và backwarding, vd.
+<code>.forward()</code> và <code>.backward()</code>. Đầu vào là <code>Tensor.data</code> (thuộc loại
+<code>CTensor</code>), và đầu ra là <code>Ctensor</code>. Nếu muốn thêm một hàm operation thì subclass <code>operation</code> cần chạy riêng <code>.forward()</code> và <code>.backward()</code>. Hàm
+<code>backward()</code> được tự động gọi bởi hàm <code>backward()</code> của autograd trong quá trình chạy backward để thực hiện độ dốc của đầu vào
+(theo mục <code>require_grad</code>).</p>
+<h3><a class="anchor" aria-hidden="true" id="layer"></a><a href="#layer" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
+<p>Với các hàm yêu cầu tham số (parameter), chúng tôi gói chúng lại thành một class mới,
+<code>Layer</code>. Ví dụ hàm convolution operation thì được nhóm vào trong convolution layer.
+<code>Layer</code> quản lý (hoặc lưu trữ) các tham số và sẽ gọi các hàm <code>Operation</code> tương ứng để thực hiện việc chuyển đổi.</p>
+<h2><a class="anchor" aria-hidden="true" id="ví-dụ"></a><a href="#ví-dụ" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
+<p>Chúng tôi cung cấp nhiều ví dụ trong
+<a href="https://github.com/apache/singa/tree/master/examples/autograd">mục ví dụ</a>.
+Chúng tôi đưa ra giải thích cụ thể trong hai ví dụ tiêu biểu ở đây.</p>
+<h3><a class="anchor" aria-hidden="true" id="dùng-hàm-operation"></a><a href="#dùng-hàm-operation" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<p>Code dưới đây áp dụng model MLP, chỉ dùng hàm Operation (không dùng hàm Layer).</p>
+<h4><a class="anchor" aria-hidden="true" id="thêm-packages"></a><a href="#thêm-packages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> singa.tensor <span class="hljs-keyword">import</span> Tensor
+<span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> autograd
+<span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> opt
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="tạo-ma-trận-trọng-lượng-weight-matrix-và-bias-vector"></a><a href="#tạo-ma-trận-trọng-lượng-weight-matrix-và-bias-vector" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S [...]
+<p>Tham số tensors được tạo bởi cả <code>requires_grad</code> và <code>stores_grad</code>
+ở giá trị <code>True</code>.</p>
+<pre><code class="hljs css language-python">w0 = Tensor(shape=(<span class="hljs-number">2</span>, <span class="hljs-number">3</span>), requires_grad=<span class="hljs-literal">True</span>, stores_grad=<span class="hljs-literal">True</span>)
+w0.gaussian(<span class="hljs-number">0.0</span>, <span class="hljs-number">0.1</span>)
+b0 = Tensor(shape=(<span class="hljs-number">1</span>, <span class="hljs-number">3</span>), requires_grad=<span class="hljs-literal">True</span>, stores_grad=<span class="hljs-literal">True</span>)
+b0.set_value(<span class="hljs-number">0.0</span>)
+
+w1 = Tensor(shape=(<span class="hljs-number">3</span>, <span class="hljs-number">2</span>), requires_grad=<span class="hljs-literal">True</span>, stores_grad=<span class="hljs-literal">True</span>)
+w1.gaussian(<span class="hljs-number">0.0</span>, <span class="hljs-number">0.1</span>)
+b1 = Tensor(shape=(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>), requires_grad=<span class="hljs-literal">True</span>, stores_grad=<span class="hljs-literal">True</span>)
+b1.set_value(<span class="hljs-number">0.0</span>)
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="training"></a><a href="#training" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<pre><code class="hljs css language-python">inputs = Tensor(data=data)  <span class="hljs-comment"># data matrix</span>
+target = Tensor(data=label) <span class="hljs-comment"># label vector</span>
+autograd.training = <span class="hljs-literal">True</span>    <span class="hljs-comment"># cho training</span>
+sgd = opt.SGD(<span class="hljs-number">0.05</span>)   <span class="hljs-comment"># optimizer</span>
+
+<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">10</span>):
+    x = autograd.matmul(inputs, w0) <span class="hljs-comment"># matrix multiplication</span>
+    x = autograd.add_bias(x, b0)    <span class="hljs-comment"># add the bias vector</span>
+    x = autograd.relu(x)            <span class="hljs-comment"># ReLU activation operation</span>
+
+    x = autograd.matmul(x, w1)
+    x = autograd.add_bias(x, b1)
+
+    loss = autograd.softmax_cross_entropy(x, target)
+
+    <span class="hljs-keyword">for</span> p, g <span class="hljs-keyword">in</span> autograd.backward(loss):
+        sgd.update(p, g)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="hàm-operation--layer"></a><a href="#hàm-operation--layer" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<p><a href="https://github.com/apache/singa/blob/master/examples/autograd/mnist_cnn.py">Ví dụ</a> sau đây áp dụng CNN model sử dụng các lớp (layers) tạo từ autograd module.</p>
+<h4><a class="anchor" aria-hidden="true" id="tạo-layers"></a><a href="#tạo-layers" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<pre><code class="hljs css language-python">conv1 = autograd.Conv2d(<span class="hljs-number">1</span>, <span class="hljs-number">32</span>, <span class="hljs-number">3</span>, padding=<span class="hljs-number">1</span>, bias=<span class="hljs-literal">False</span>)
+bn1 = autograd.BatchNorm2d(<span class="hljs-number">32</span>)
+pooling1 = autograd.MaxPool2d(<span class="hljs-number">3</span>, <span class="hljs-number">1</span>, padding=<span class="hljs-number">1</span>)
+conv21 = autograd.Conv2d(<span class="hljs-number">32</span>, <span class="hljs-number">16</span>, <span class="hljs-number">3</span>, padding=<span class="hljs-number">1</span>)
+conv22 = autograd.Conv2d(<span class="hljs-number">32</span>, <span class="hljs-number">16</span>, <span class="hljs-number">3</span>, padding=<span class="hljs-number">1</span>)
+bn2 = autograd.BatchNorm2d(<span class="hljs-number">32</span>)
+linear = autograd.Linear(<span class="hljs-number">32</span> * <span class="hljs-number">28</span> * <span class="hljs-number">28</span>, <span class="hljs-number">10</span>)
+pooling2 = autograd.AvgPool2d(<span class="hljs-number">3</span>, <span class="hljs-number">1</span>, padding=<span class="hljs-number">1</span>)
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="định-nghĩa-hàm-forward"></a><a href="#định-nghĩa-hàm-forward" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
+<p>Hàm trong forward pass sẽ được tự đông lưu cho backward propagation.</p>
+<pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(x, t)</span>:</span>
+    <span class="hljs-comment"># x là input data (batch hình ảnh)</span>
+    <span class="hljs-comment"># t là label vector (batch số nguyên)</span>
+    y = conv1(x)           <span class="hljs-comment"># Conv layer</span>
+    y = autograd.relu(y)   <span class="hljs-comment"># ReLU operation</span>
+    y = bn1(y)             <span class="hljs-comment"># BN layer</span>
+    y = pooling1(y)        <span class="hljs-comment"># Pooling Layer</span>
+
+    <span class="hljs-comment"># hai convolution layers song song</span>
+    y1 = conv21(y)
+    y2 = conv22(y)
+    y = autograd.cat((y1, y2), <span class="hljs-number">1</span>)  <span class="hljs-comment"># cat operation</span>
+    y = autograd.relu(y)           <span class="hljs-comment"># ReLU operation</span>
+    y = bn2(y)
+    y = pooling2(y)
+
+    y = autograd.flatten(y)        <span class="hljs-comment"># flatten operation</span>
+    y = linear(y)                  <span class="hljs-comment"># Linear layer</span>
+    loss = autograd.softmax_cross_entropy(y, t)  <span class="hljs-comment"># operation</span>
+    <span class="hljs-keyword">return</span> loss, y
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="training-1"></a><a href="#training-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<pre><code class="hljs css language-python">autograd.training = <span class="hljs-literal">True</span>
+<span class="hljs-keyword">for</span> epoch <span class="hljs-keyword">in</span> range(epochs):
+    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(batch_number):
+        inputs = tensor.Tensor(device=dev, data=x_train[
+                               i * batch_sz:(<span class="hljs-number">1</span> + i) * batch_sz], stores_grad=<span class="hljs-literal">False</span>)
+        targets = tensor.Tensor(device=dev, data=y_train[
+                                i * batch_sz:(<span class="hljs-number">1</span> + i) * batch_sz], requires_grad=<span class="hljs-literal">False</span>, stores_grad=<span class="hljs-literal">False</span>)
+
+        loss, y = forward(inputs, targets) <span class="hljs-comment"># forward the net</span>
+
+        <span class="hljs-keyword">for</span> p, gp <span class="hljs-keyword">in</span> autograd.backward(loss):  <span class="hljs-comment"># auto backward</span>
+            sgd.update(p, gp)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="sử-dụng-model-api"></a><a href="#sử-dụng-model-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p><a href="https://github.com/apache/singa/blob/master/examples/cnn/model/cnn.py">Ví dụ</a> sau áp dụng CNN model sử dụng <a href="./graph">Model API</a>.</p>
+<h4><a class="anchor" aria-hidden="true" id="định-nghiã-subclass-của-model"></a><a href="#định-nghiã-subclass-của-model" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
+<p>Model class được định nghĩa là subclass của Model. Theo đó, tất cả các hàm operations được sử dụng trong bước training sẽ tạo thành một computational graph và được phân tích. Hàm operation trong graph sẽ được lên lịch trình và thực hiện hiệu quả. Layers cũng có thể được bao gồm trong model class.</p>
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MLP</span><span class="hljs-params">(model.Model)</span>:</span>  <span class="hljs-comment"># model là subclass của Model</span>
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, data_size=<span class="hljs-number">10</span>, perceptron_size=<span class="hljs-number">100</span>, num_classes=<span class="hljs-number">10</span>)</span>:</span>
+        super(MLP, self).__init__()
+
+        <span class="hljs-comment"># taọ operators, layers và các object khác</span>
+        self.relu = layer.ReLU()
+        self.linear1 = layer.Linear(perceptron_size)
+        self.linear2 = layer.Linear(num_classes)
+        self.softmax_cross_entropy = layer.SoftMaxCrossEntropy()
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(self, inputs)</span>:</span>  <span class="hljs-comment"># định nghĩa forward function</span>
+        y = self.linear1(inputs)
+        y = self.relu(y)
+        y = self.linear2(y)
+        <span class="hljs-keyword">return</span> y
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">train_one_batch</span><span class="hljs-params">(self, x, y)</span>:</span>
+        out = self.forward(x)
+        loss = self.softmax_cross_entropy(out, y)
+        self.optimizer(loss)
+        <span class="hljs-keyword">return</span> out, loss
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_optimizer</span><span class="hljs-params">(self, optimizer)</span>:</span>  <span class="hljs-comment"># đính kèm optimizer</span>
+        self.optimizer = optimizer
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="training-2"></a><a href="#training-2" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<pre><code class="hljs css language-python"><span class="hljs-comment"># tạo hàm model instance</span>
+model = MLP()
+<span class="hljs-comment"># tạo optimizer và đính vào model</span>
+sgd = opt.SGD(lr=<span class="hljs-number">0.005</span>, momentum=<span class="hljs-number">0.9</span>, weight_decay=<span class="hljs-number">1e-5</span>)
+model.set_optimizer(sgd)
+<span class="hljs-comment"># input và target placeholders cho model</span>
+tx = tensor.Tensor((batch_size, <span class="hljs-number">1</span>, IMG_SIZE, IMG_SIZE), dev, tensor.float32)
+ty = tensor.Tensor((batch_size, num_classes), dev, tensor.int32)
+<span class="hljs-comment"># tổng hợp model trước khi training</span>
+model.compile([tx], is_train=<span class="hljs-literal">True</span>, use_graph=<span class="hljs-literal">True</span>, sequential=<span class="hljs-literal">False</span>)
+
+<span class="hljs-comment"># train model theo bước lặp (iterative)</span>
+<span class="hljs-keyword">for</span> b <span class="hljs-keyword">in</span> range(num_train_batch):
+    <span class="hljs-comment"># generate the next mini-batch</span>
+    x, y = ...
+
+    <span class="hljs-comment"># Copy the data into input tensors</span>
+    tx.copy_from_numpy(x)
+    ty.copy_from_numpy(y)
+
+    <span class="hljs-comment"># Training with one batch</span>
+    out, loss = model(tx, ty)
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="lưu-model-checkpoint"></a><a href="#lưu-model-checkpoint" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<pre><code class="hljs css language-python"><span class="hljs-comment"># xác định đường dẫn để lưu checkpoint</span>
+checkpointpath=<span class="hljs-string">"checkpoint.zip"</span>
+
+<span class="hljs-comment"># lưu checkpoint</span>
+model.save_states(fpath=checkpointpath)
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="tải-model-checkpoint"></a><a href="#tải-model-checkpoint" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<pre><code class="hljs css language-python"><span class="hljs-comment"># xác định đường dẫn để lưu checkpoint</span>
+checkpointpath=<span class="hljs-string">"checkpoint.zip"</span>
+
+<span class="hljs-comment"># lưu checkpoint</span>
+<span class="hljs-keyword">import</span> os
+<span class="hljs-keyword">if</span> os.path.exists(checkpointpath):
+    model.load_states(fpath=checkpointpath)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>Xem
+<a href="https://singa.readthedocs.io/en/latest/autograd.html#module-singa.autograd">tại đây</a>
+để thêm thông tin chi tiết về Python API.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/tensor"><span class="arrow-prev">← </span><span>Tensor</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/optimizer"><span>Optimizer</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#các-module-liên-quan">Các Module liên quan</a><ul class="toc-headings"><li><a href="#tensor">Tensor</a></li><li><a hre [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/autograd/index.html b/content/docs/3.1.0_Viet/autograd/index.html
new file mode 100644
index 0000000..9862ebd
--- /dev/null
+++ b/content/docs/3.1.0_Viet/autograd/index.html
@@ -0,0 +1,287 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Autograd · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright owners [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/autograd.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Autograd</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license  [...]
+<p>Có hai cách thường dùng để sử dụng autograd, qua symbolic differentiation như là <a href="http://deeplearning.net/software/theano/index.html">Theano</a> hoặc reverse
+differentiation như là
+<a href="https://pytorch.org/docs/stable/notes/autograd.html">Pytorch</a>. SINGA dùng cách Pytorch, lưu trữ computation graph rồi áp dụng backward
+propagation tự động sau khi forward propagation. Thuật toán autograd được giải thích cụ thể ở
+<a href="https://pytorch.org/docs/stable/notes/autograd.html">đây</a>. Chúng tôi giải thích các modules liên quan trong Singa và đưa ra ví dụ để minh hoạ cách sử dụng.</p>
+<h2><a class="anchor" aria-hidden="true" id="các-module-liên-quan"></a><a href="#các-module-liên-quan" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<p>Autograd gồm ba classes với tên gọi <code>singa.tensor.Tensor</code>,
+<code>singa.autograd.Operation</code>, và <code>singa.autograd.Layer</code>. Trong phần tiếp theo của văn kiện này, chúng tôi dùng tensor, operation và layer để chỉ một chương trình (instance) trong class tương ứng.</p>
+<h3><a class="anchor" aria-hidden="true" id="tensor"></a><a href="#tensor" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
+<p>Ba tính năng của Tensor được sử dụng bởi autograd,</p>
+<ul>
+<li><code>.creator</code> là một chương trình <code>Operation</code>. Chương trình này lưu trữ tác vụ tạo ra Tensor instance.</li>
+<li><code>.requires_grad</code> là một biến kiểu bool. Biến được sử dụng để chỉ rằng thuật toán autograd cần tính ra độ dốc (gradient) của tensor. (như owner). Ví dụ, khi chạy backpropagation, thì cần phải tính ra độ dốc của tensor cho ma trận trọng lượng (weight matrix) của lớp tuyến tính (linear layer) và bản đồ tính năng (feature map) của convolution
+layer (không phải lớp cuối).</li>
+<li><code>.stores_grad</code> là một biến kiểu bool. Biến được sử dụng để chỉ rằng độ dốc của owner tensor cần được lưu và tạo ra bởi hàm backward. Ví dụ, độ dốc của feature maps được tính thông qua backpropagation, nhưng không được bao gồm trong kết quả của hàm backward.</li>
+</ul>
+<p>Lập trình viên có thể thay đổi <code>requires_grad</code> và <code>stores_grad</code> của chương trình Tensor. Ví dụ nếu hàm sau để là True, độ dốc tương ứng sẽ được bao gồm trong kết quả của hàm backward. Cần lưu ý rằng nếu <code>stores_grad</code> để là True, thì <code>requires_grad</code> cũng phải là True, và ngược lại.</p>
+<h3><a class="anchor" aria-hidden="true" id="operation"></a><a href="#operation" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
+<p>Hàm chạy một hoặc một vài chương trình <code>Tensor</code> instances ở đầu vào, sau đó đầu ra là một hoặc một vài chương trình <code>Tensor</code> instances. Ví dụ, hàm ReLU có thể được sử dụng như một subclass của một hàm Operation cụ thể. Khi gọi một chương trình <code>Operation</code> (sau cài đặt), cần thực hiện hai bước sau:</p>
+<ol>
+<li>Ghi lại hàm operations nguồn, vd. biến <code>creator</code>của tensor đầu vào.</li>
+<li>làm tính toán bằng cách gọi hàm thành viên <code>.forward()</code></li>
+</ol>
+<p>Có hai hàm thành viên cho forwarding và backwarding, vd.
+<code>.forward()</code> và <code>.backward()</code>. Đầu vào là <code>Tensor.data</code> (thuộc loại
+<code>CTensor</code>), và đầu ra là <code>Ctensor</code>. Nếu muốn thêm một hàm operation thì subclass <code>operation</code> cần chạy riêng <code>.forward()</code> và <code>.backward()</code>. Hàm
+<code>backward()</code> được tự động gọi bởi hàm <code>backward()</code> của autograd trong quá trình chạy backward để thực hiện độ dốc của đầu vào
+(theo mục <code>require_grad</code>).</p>
+<h3><a class="anchor" aria-hidden="true" id="layer"></a><a href="#layer" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
+<p>Với các hàm yêu cầu tham số (parameter), chúng tôi gói chúng lại thành một class mới,
+<code>Layer</code>. Ví dụ hàm convolution operation thì được nhóm vào trong convolution layer.
+<code>Layer</code> quản lý (hoặc lưu trữ) các tham số và sẽ gọi các hàm <code>Operation</code> tương ứng để thực hiện việc chuyển đổi.</p>
+<h2><a class="anchor" aria-hidden="true" id="ví-dụ"></a><a href="#ví-dụ" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
+<p>Chúng tôi cung cấp nhiều ví dụ trong
+<a href="https://github.com/apache/singa/tree/master/examples/autograd">mục ví dụ</a>.
+Chúng tôi đưa ra giải thích cụ thể trong hai ví dụ tiêu biểu ở đây.</p>
+<h3><a class="anchor" aria-hidden="true" id="dùng-hàm-operation"></a><a href="#dùng-hàm-operation" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<p>Code dưới đây áp dụng model MLP, chỉ dùng hàm Operation (không dùng hàm Layer).</p>
+<h4><a class="anchor" aria-hidden="true" id="thêm-packages"></a><a href="#thêm-packages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> singa.tensor <span class="hljs-keyword">import</span> Tensor
+<span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> autograd
+<span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> opt
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="tạo-ma-trận-trọng-lượng-weight-matrix-và-bias-vector"></a><a href="#tạo-ma-trận-trọng-lượng-weight-matrix-và-bias-vector" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S [...]
+<p>Tham số tensors được tạo bởi cả <code>requires_grad</code> và <code>stores_grad</code>
+ở giá trị <code>True</code>.</p>
+<pre><code class="hljs css language-python">w0 = Tensor(shape=(<span class="hljs-number">2</span>, <span class="hljs-number">3</span>), requires_grad=<span class="hljs-literal">True</span>, stores_grad=<span class="hljs-literal">True</span>)
+w0.gaussian(<span class="hljs-number">0.0</span>, <span class="hljs-number">0.1</span>)
+b0 = Tensor(shape=(<span class="hljs-number">1</span>, <span class="hljs-number">3</span>), requires_grad=<span class="hljs-literal">True</span>, stores_grad=<span class="hljs-literal">True</span>)
+b0.set_value(<span class="hljs-number">0.0</span>)
+
+w1 = Tensor(shape=(<span class="hljs-number">3</span>, <span class="hljs-number">2</span>), requires_grad=<span class="hljs-literal">True</span>, stores_grad=<span class="hljs-literal">True</span>)
+w1.gaussian(<span class="hljs-number">0.0</span>, <span class="hljs-number">0.1</span>)
+b1 = Tensor(shape=(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>), requires_grad=<span class="hljs-literal">True</span>, stores_grad=<span class="hljs-literal">True</span>)
+b1.set_value(<span class="hljs-number">0.0</span>)
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="training"></a><a href="#training" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<pre><code class="hljs css language-python">inputs = Tensor(data=data)  <span class="hljs-comment"># data matrix</span>
+target = Tensor(data=label) <span class="hljs-comment"># label vector</span>
+autograd.training = <span class="hljs-literal">True</span>    <span class="hljs-comment"># cho training</span>
+sgd = opt.SGD(<span class="hljs-number">0.05</span>)   <span class="hljs-comment"># optimizer</span>
+
+<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">10</span>):
+    x = autograd.matmul(inputs, w0) <span class="hljs-comment"># matrix multiplication</span>
+    x = autograd.add_bias(x, b0)    <span class="hljs-comment"># add the bias vector</span>
+    x = autograd.relu(x)            <span class="hljs-comment"># ReLU activation operation</span>
+
+    x = autograd.matmul(x, w1)
+    x = autograd.add_bias(x, b1)
+
+    loss = autograd.softmax_cross_entropy(x, target)
+
+    <span class="hljs-keyword">for</span> p, g <span class="hljs-keyword">in</span> autograd.backward(loss):
+        sgd.update(p, g)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="hàm-operation--layer"></a><a href="#hàm-operation--layer" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<p><a href="https://github.com/apache/singa/blob/master/examples/autograd/mnist_cnn.py">Ví dụ</a> sau đây áp dụng CNN model sử dụng các lớp (layers) tạo từ autograd module.</p>
+<h4><a class="anchor" aria-hidden="true" id="tạo-layers"></a><a href="#tạo-layers" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<pre><code class="hljs css language-python">conv1 = autograd.Conv2d(<span class="hljs-number">1</span>, <span class="hljs-number">32</span>, <span class="hljs-number">3</span>, padding=<span class="hljs-number">1</span>, bias=<span class="hljs-literal">False</span>)
+bn1 = autograd.BatchNorm2d(<span class="hljs-number">32</span>)
+pooling1 = autograd.MaxPool2d(<span class="hljs-number">3</span>, <span class="hljs-number">1</span>, padding=<span class="hljs-number">1</span>)
+conv21 = autograd.Conv2d(<span class="hljs-number">32</span>, <span class="hljs-number">16</span>, <span class="hljs-number">3</span>, padding=<span class="hljs-number">1</span>)
+conv22 = autograd.Conv2d(<span class="hljs-number">32</span>, <span class="hljs-number">16</span>, <span class="hljs-number">3</span>, padding=<span class="hljs-number">1</span>)
+bn2 = autograd.BatchNorm2d(<span class="hljs-number">32</span>)
+linear = autograd.Linear(<span class="hljs-number">32</span> * <span class="hljs-number">28</span> * <span class="hljs-number">28</span>, <span class="hljs-number">10</span>)
+pooling2 = autograd.AvgPool2d(<span class="hljs-number">3</span>, <span class="hljs-number">1</span>, padding=<span class="hljs-number">1</span>)
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="định-nghĩa-hàm-forward"></a><a href="#định-nghĩa-hàm-forward" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
+<p>Hàm trong forward pass sẽ được tự đông lưu cho backward propagation.</p>
+<pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(x, t)</span>:</span>
+    <span class="hljs-comment"># x là input data (batch hình ảnh)</span>
+    <span class="hljs-comment"># t là label vector (batch số nguyên)</span>
+    y = conv1(x)           <span class="hljs-comment"># Conv layer</span>
+    y = autograd.relu(y)   <span class="hljs-comment"># ReLU operation</span>
+    y = bn1(y)             <span class="hljs-comment"># BN layer</span>
+    y = pooling1(y)        <span class="hljs-comment"># Pooling Layer</span>
+
+    <span class="hljs-comment"># hai convolution layers song song</span>
+    y1 = conv21(y)
+    y2 = conv22(y)
+    y = autograd.cat((y1, y2), <span class="hljs-number">1</span>)  <span class="hljs-comment"># cat operation</span>
+    y = autograd.relu(y)           <span class="hljs-comment"># ReLU operation</span>
+    y = bn2(y)
+    y = pooling2(y)
+
+    y = autograd.flatten(y)        <span class="hljs-comment"># flatten operation</span>
+    y = linear(y)                  <span class="hljs-comment"># Linear layer</span>
+    loss = autograd.softmax_cross_entropy(y, t)  <span class="hljs-comment"># operation</span>
+    <span class="hljs-keyword">return</span> loss, y
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="training-1"></a><a href="#training-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<pre><code class="hljs css language-python">autograd.training = <span class="hljs-literal">True</span>
+<span class="hljs-keyword">for</span> epoch <span class="hljs-keyword">in</span> range(epochs):
+    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(batch_number):
+        inputs = tensor.Tensor(device=dev, data=x_train[
+                               i * batch_sz:(<span class="hljs-number">1</span> + i) * batch_sz], stores_grad=<span class="hljs-literal">False</span>)
+        targets = tensor.Tensor(device=dev, data=y_train[
+                                i * batch_sz:(<span class="hljs-number">1</span> + i) * batch_sz], requires_grad=<span class="hljs-literal">False</span>, stores_grad=<span class="hljs-literal">False</span>)
+
+        loss, y = forward(inputs, targets) <span class="hljs-comment"># forward the net</span>
+
+        <span class="hljs-keyword">for</span> p, gp <span class="hljs-keyword">in</span> autograd.backward(loss):  <span class="hljs-comment"># auto backward</span>
+            sgd.update(p, gp)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="sử-dụng-model-api"></a><a href="#sử-dụng-model-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p><a href="https://github.com/apache/singa/blob/master/examples/cnn/model/cnn.py">Ví dụ</a> sau áp dụng CNN model sử dụng <a href="./graph">Model API</a>.</p>
+<h4><a class="anchor" aria-hidden="true" id="định-nghiã-subclass-của-model"></a><a href="#định-nghiã-subclass-của-model" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
+<p>Model class được định nghĩa là subclass của Model. Theo đó, tất cả các hàm operations được sử dụng trong bước training sẽ tạo thành một computational graph và được phân tích. Hàm operation trong graph sẽ được lên lịch trình và thực hiện hiệu quả. Layers cũng có thể được bao gồm trong model class.</p>
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MLP</span><span class="hljs-params">(model.Model)</span>:</span>  <span class="hljs-comment"># model là subclass của Model</span>
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, data_size=<span class="hljs-number">10</span>, perceptron_size=<span class="hljs-number">100</span>, num_classes=<span class="hljs-number">10</span>)</span>:</span>
+        super(MLP, self).__init__()
+
+        <span class="hljs-comment"># taọ operators, layers và các object khác</span>
+        self.relu = layer.ReLU()
+        self.linear1 = layer.Linear(perceptron_size)
+        self.linear2 = layer.Linear(num_classes)
+        self.softmax_cross_entropy = layer.SoftMaxCrossEntropy()
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(self, inputs)</span>:</span>  <span class="hljs-comment"># định nghĩa forward function</span>
+        y = self.linear1(inputs)
+        y = self.relu(y)
+        y = self.linear2(y)
+        <span class="hljs-keyword">return</span> y
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">train_one_batch</span><span class="hljs-params">(self, x, y)</span>:</span>
+        out = self.forward(x)
+        loss = self.softmax_cross_entropy(out, y)
+        self.optimizer(loss)
+        <span class="hljs-keyword">return</span> out, loss
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_optimizer</span><span class="hljs-params">(self, optimizer)</span>:</span>  <span class="hljs-comment"># đính kèm optimizer</span>
+        self.optimizer = optimizer
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="training-2"></a><a href="#training-2" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<pre><code class="hljs css language-python"><span class="hljs-comment"># tạo hàm model instance</span>
+model = MLP()
+<span class="hljs-comment"># tạo optimizer và đính vào model</span>
+sgd = opt.SGD(lr=<span class="hljs-number">0.005</span>, momentum=<span class="hljs-number">0.9</span>, weight_decay=<span class="hljs-number">1e-5</span>)
+model.set_optimizer(sgd)
+<span class="hljs-comment"># input và target placeholders cho model</span>
+tx = tensor.Tensor((batch_size, <span class="hljs-number">1</span>, IMG_SIZE, IMG_SIZE), dev, tensor.float32)
+ty = tensor.Tensor((batch_size, num_classes), dev, tensor.int32)
+<span class="hljs-comment"># tổng hợp model trước khi training</span>
+model.compile([tx], is_train=<span class="hljs-literal">True</span>, use_graph=<span class="hljs-literal">True</span>, sequential=<span class="hljs-literal">False</span>)
+
+<span class="hljs-comment"># train model theo bước lặp (iterative)</span>
+<span class="hljs-keyword">for</span> b <span class="hljs-keyword">in</span> range(num_train_batch):
+    <span class="hljs-comment"># generate the next mini-batch</span>
+    x, y = ...
+
+    <span class="hljs-comment"># Copy the data into input tensors</span>
+    tx.copy_from_numpy(x)
+    ty.copy_from_numpy(y)
+
+    <span class="hljs-comment"># Training with one batch</span>
+    out, loss = model(tx, ty)
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="lưu-model-checkpoint"></a><a href="#lưu-model-checkpoint" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<pre><code class="hljs css language-python"><span class="hljs-comment"># xác định đường dẫn để lưu checkpoint</span>
+checkpointpath=<span class="hljs-string">"checkpoint.zip"</span>
+
+<span class="hljs-comment"># lưu checkpoint</span>
+model.save_states(fpath=checkpointpath)
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="tải-model-checkpoint"></a><a href="#tải-model-checkpoint" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<pre><code class="hljs css language-python"><span class="hljs-comment"># xác định đường dẫn để lưu checkpoint</span>
+checkpointpath=<span class="hljs-string">"checkpoint.zip"</span>
+
+<span class="hljs-comment"># lưu checkpoint</span>
+<span class="hljs-keyword">import</span> os
+<span class="hljs-keyword">if</span> os.path.exists(checkpointpath):
+    model.load_states(fpath=checkpointpath)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>Xem
+<a href="https://singa.readthedocs.io/en/latest/autograd.html#module-singa.autograd">tại đây</a>
+để thêm thông tin chi tiết về Python API.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/tensor"><span class="arrow-prev">← </span><span>Tensor</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/optimizer"><span>Optimizer</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#các-module-liên-quan">Các Module liên quan</a><ul class="toc-headings"><li><a href="#tensor">Tensor</a></li><li><a hre [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/benchmark-train.html b/content/docs/3.1.0_Viet/benchmark-train.html
new file mode 100644
index 0000000..74e6650
--- /dev/null
+++ b/content/docs/3.1.0_Viet/benchmark-train.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Benchmark cho Distributed Training · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information  [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+<p>Tải công việc: chúng tôi sử dụng Mạng nơ-ron tích chập sâu (deep convolutional neural network),
+<a href="https://github.com/apache/singa/blob/master/examples/cnn/model/resnet.py">ResNet-50</a>
+làm ứng dụng. ResNet-50 có 50 lớp tích chập (convolution layers) để phân loại hình ảnh. Nó đòi hỏi 3.8 GFLOPs để đưa vào một hình ảnh (kích thước ảnh 224x224) qua mạng lưới. Kích thước ảnh đầu vào là 224x224.</p>
+<p>Phần cứng: chúng tôi sử dụng máy p2.8xlarge từ AWS, mỗi máy gồm 8 Nvidia Tesla
+K80 GPUs, bộ nhớ tổng cộng 96 GB GPU, 32 vCPU, 488 GB main memory, 10 Gbps
+network bandwidth.</p>
+<p>Metric: chúng tôi tính thời gian mỗi bước cho mỗi workers để đánh giá khả năng mở rộng của SINGA. Kích thước của mỗi nhóm được cố định ở 32 mỗi GPU.
+Phương thức training đồng bộ (Synchronous training scheme) được áp dụng. Vì thế, kích thước nhóm hiệu quả là
+$32N$, trong đó N là số máy GPUs. Chúng tôi so sánh với một hệ thống mở được dùng phổ biến có sử dụng  tham số server cấu trúc liên kết. Máy GPU đầu tiên được chọn làm server.</p>
+<p><img src="/docs/assets/benchmark.png" alt="Thí nghiệm Benchmark"> <br/> <strong>Kiểm tra khả năng mở rộng. Bars
+được dùng cho thông lượng (throughput); lines dùng cho lượng kết nối (communication cost).</strong></p>
+</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/singa-logo-square.png" alt="Apache SINGA" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/installation">Getting Started</a><a href="/docs/device">Guides</a><a href="/en/https://apache-singa.readthedocs.io/en/latest/">API Reference</a><a href="/docs/examples">Exa [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/benchmark-train/index.html b/content/docs/3.1.0_Viet/benchmark-train/index.html
new file mode 100644
index 0000000..74e6650
--- /dev/null
+++ b/content/docs/3.1.0_Viet/benchmark-train/index.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Benchmark cho Distributed Training · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information  [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+<p>Tải công việc: chúng tôi sử dụng Mạng nơ-ron tích chập sâu (deep convolutional neural network),
+<a href="https://github.com/apache/singa/blob/master/examples/cnn/model/resnet.py">ResNet-50</a>
+làm ứng dụng. ResNet-50 có 50 lớp tích chập (convolution layers) để phân loại hình ảnh. Nó đòi hỏi 3.8 GFLOPs để đưa vào một hình ảnh (kích thước ảnh 224x224) qua mạng lưới. Kích thước ảnh đầu vào là 224x224.</p>
+<p>Phần cứng: chúng tôi sử dụng máy p2.8xlarge từ AWS, mỗi máy gồm 8 Nvidia Tesla
+K80 GPUs, bộ nhớ tổng cộng 96 GB GPU, 32 vCPU, 488 GB main memory, 10 Gbps
+network bandwidth.</p>
+<p>Metric: chúng tôi tính thời gian mỗi bước cho mỗi workers để đánh giá khả năng mở rộng của SINGA. Kích thước của mỗi nhóm được cố định ở 32 mỗi GPU.
+Phương thức training đồng bộ (Synchronous training scheme) được áp dụng. Vì thế, kích thước nhóm hiệu quả là
+$32N$, trong đó N là số máy GPUs. Chúng tôi so sánh với một hệ thống mở được dùng phổ biến có sử dụng  tham số server cấu trúc liên kết. Máy GPU đầu tiên được chọn làm server.</p>
+<p><img src="/docs/assets/benchmark.png" alt="Thí nghiệm Benchmark"> <br/> <strong>Kiểm tra khả năng mở rộng. Bars
+được dùng cho thông lượng (throughput); lines dùng cho lượng kết nối (communication cost).</strong></p>
+</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/singa-logo-square.png" alt="Apache SINGA" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/installation">Getting Started</a><a href="/docs/device">Guides</a><a href="/en/https://apache-singa.readthedocs.io/en/latest/">API Reference</a><a href="/docs/examples">Exa [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/build.html b/content/docs/3.1.0_Viet/build.html
new file mode 100644
index 0000000..c2c4066
--- /dev/null
+++ b/content/docs/3.1.0_Viet/build.html
@@ -0,0 +1,371 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Cài đặt SINGA từ Nguồn (Source) · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information reg [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/build.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Cài đặt SINGA từ Nguồn (Source)</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more  [...]
+<p>Các tệp nguồn có thể được tải dưới dạng
+<a href="https://dist.apache.org/repos/dist/dev/singa/">tar.gz file</a>, hoặc git repo</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> git <span class="hljs-built_in">clone</span> https://github.com/apache/singa.git</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">cd</span> singa/</span>
+</code></pre>
+<p>Nếu bạn muốn tham gia đóng góp code cho SINGA, tham khảo
+<a href="/docs/3.1.0_Viet/contribute-code">mục contribute-code</a> với các bước làm và yêu cầu kĩ thuật.</p>
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng-conda-để-cài-singa"></a><a href="#sử-dụng-conda-để-cài-singa" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H [...]
+<p>Conda-build là phần mềm giúp cài đặt thư viện chương trình từ dữ liệu đám mây anaconda và thực hiện các tập lệnh tạo chương trình.</p>
+<p>Để cài đặt conda-build (sau khi cài conda)</p>
+<pre><code class="hljs css language-shell">conda install conda-build
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="tạo-phiên-bản-cpu"></a><a href="#tạo-phiên-bản-cpu" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p>Để tạo phiên bản CPU cho SINGA</p>
+<pre><code class="hljs css language-shell">conda build tool/conda/singa/
+</code></pre>
+<p>Lệnh trên đã được kiểm tra trên Ubuntu (14.04, 16.04 và 18.04) và macOS
+10.11. Tham khảo <a href="https://travis-ci.org/apache/singa">trang Travis-CI</a> để biết thêm chi tiết.</p>
+<h3><a class="anchor" aria-hidden="true" id="tạo-phiên-bản-gpu"></a><a href="#tạo-phiên-bản-gpu" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p>Để tạo phiên bản GPU cho SINGA, máy để cài phải có Nvida GPU, và CUDA driver (&gt;= 384.81), phải được cài đặt CUDA toolkit (&gt;=9) và cuDNN (&gt;=7). Hai Docker images dưới đây cung cấp environment để chạy:</p>
+<ol>
+<li>apache/singa:conda-cuda9.0</li>
+<li>apache/singa:conda-cuda10.0</li>
+</ol>
+<p>Sau khi environment để chạy đã sẵn sàng, bạn cần phải export phiên bản CUDA trước, sau đó chạy lệnh conda để cài SINGA:</p>
+<pre><code class="hljs css language-shell">export CUDA=x.y (e.g. 9.0)
+conda build tool/conda/singa/
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="sau-khi-chạy-chương-trình"></a><a href="#sau-khi-chạy-chương-trình" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<p>Vị trí đặt tệp tin của gói chương trình được tạo (<code>.tar.gz</code>) hiển thị trên màn hình.
+Gói chương trình được tạo có thể được cài đặt trực tiếp,</p>
+<pre><code class="hljs css language-shell">conda install -c conda-forge --use-local &lt;path to the package file&gt;
+</code></pre>
+<p>hoặc tải lên dữ liệu đám mây anaconda cloud để người dùng khác có thể tải và cài đặt. Bạn cần phải đăng kí một tài khoản trên anaconda để có thể
+<a href="https://docs.anaconda.com/anaconda-cloud/user-guide/getting-started/">tải lên gói chương trình</a>.</p>
+<pre><code class="hljs css language-shell">conda install anaconda-client
+anaconda login
+anaconda upload -l main &lt;path to the package file&gt;
+</code></pre>
+<p>Sau khi tải gói chương trình lên dữ liệu đám mây, bạn có thể tìm thấy gói trên website của
+<a href="https://anaconda.org/">Anaconda Cloud</a> hoặc qua lệnh</p>
+<pre><code class="hljs css language-shell">conda search -c &lt;anaconda username&gt; singa
+</code></pre>
+<p>Mỗi gói chương trình của SINGA đuợc nhận diện theo phiên bản hoặc dòng lệnh cài đặt. Để cài một gói chương trình SINGA cụ thể, bạn cần phải cung cấp toàn bộ thông tin, vd.</p>
+<pre><code class="hljs css language-shell">conda install -c &lt;anaconda username&gt; -c conda-forge singa=2.1.0.dev=cpu_py36
+</code></pre>
+<p>Để cho lệnh cài đặt không phức tạp, bạn có thể tạo các gói chương trình bổ sung sau dựa trên các gói chương trình cho SINGA CPU và GPU mới nhất .</p>
+<pre><code class="hljs css language-console"><span class="hljs-meta">#</span><span class="bash"> <span class="hljs-keyword">for</span> singa-cpu</span>
+conda build tool/conda/cpu/  --python=3.6
+conda build tool/conda/cpu/  --python=3.7
+<span class="hljs-meta">#</span><span class="bash"> <span class="hljs-keyword">for</span> singa-gpu</span>
+conda build tool/conda/gpu/  --python=3.6
+conda build tool/conda/gpu/  --python=3.7
+</code></pre>
+<p>Bởi vậy, khi bạn chạy</p>
+<pre><code class="hljs css language-shell">conda install -c &lt;anaconda username&gt; -c conda-forge singa-xpu
+</code></pre>
+<p>(<code>xpu</code> nghĩa là hoặc 'cpu' hoặc 'gpu'), gói SINGA tương ứng thực sự được cài đặt như một library phụ thuộc.</p>
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng-các-phương-tiện-cơ-bản-để-cài-đặt-singa-trên-ubuntu"></a><a href="#sử-dụng-các-phương-tiện-cơ-bản-để-cài-đặt-singa-trên-ubuntu" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0 [...]
+<p>Tham khảo
+<a href="https://github.com/apache/singa/blob/master/tool/docker/devel/ubuntu/cuda9/Dockerfile#L30">Dockerfiles</a>
+của SINGA để xem hướng dẫn cài đặt các chương trình library phụ thuộc trên Ubuntu 16.04. Bạn có thể tạo một Docker container sử dụng <a href="">devel images</a> và cài SINGA trong container. Để cài SINGA với GPU, DNNL, Python và unit tests, chạy lệnh theo hướng dẫn sau</p>
+<pre><code class="hljs css language-shell">mkdir build    # tại thư mục nguồn của singa
+cd build
+cmake -DENABLE_TEST=ON -DUSE_CUDA=ON -DUSE_DNNL=ON -DUSE_PYTHON3=ON ..
+make
+cd python
+pip install .
+</code></pre>
+<p>Chi tiết các lựa chọn CMake đuợc giải thích ở phần cuối cùng của trang này. Câu lệnh cuối cùng để cài gói Python. Bạn cúng có thể chạy
+<code>pip install -e .</code>, để tạo symlinks thay vì copy các tâp tin Python vào mục site-package.</p>
+<p>Nếu SINGA được compile với ENABLE_TEST=ON, bạn có thể chạy unit test bằng cách</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> ./bin/test_singa</span>
+</code></pre>
+<p>Bạn sẽ thấy tất cả các trường hợp test kèm theo kết quả test. Nếu SINGA thông qua tất cả các test, bạn đã cài đặt SINGA thành công.</p>
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng-các-phương-tiện-cơ-bản-để-cài-đặt-singa-trên-centos7"></a><a href="#sử-dụng-các-phương-tiện-cơ-bản-để-cài-đặt-singa-trên-centos7" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 [...]
+<p>Tạo từ nguồn sẽ khác trên Centos7 bởi tên của gói chương trình là khác nhau. Làm theo hướng dẫn dưới đây</p>
+<h3><a class="anchor" aria-hidden="true" id="cài-các-chương-trình-phụ-thuộc-dependent-libraries"></a><a href="#cài-các-chương-trình-phụ-thuộc-dependent-libraries" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9  [...]
+<p>Gói/chương trình cơ bản</p>
+<pre><code class="hljs css language-shell">sudo yum install freetype-devel libXft-devel ncurses-devel openblas-devel blas-devel lapack devel atlas-devel kernel-headers unzip wget pkgconfig zip zlib-devel libcurl-devel cmake curl unzip dh-autoreconf git python-devel glog-devel protobuf-devel
+</code></pre>
+<p>Cho build-essential</p>
+<pre><code class="hljs css language-shell">sudo yum group install "Development Tools"
+</code></pre>
+<p>Để cài đặt swig</p>
+<pre><code class="hljs css language-shell">sudo yum install pcre-devel
+wget http://prdownloads.sourceforge.net/swig/swig-3.0.10.tar.gz
+tar xvzf swig-3.0.10.tar.gz
+cd swig-3.0.10.tar.gz
+./configure --prefix=${RUN}
+make
+make install
+</code></pre>
+<p>Để cài đặt gfortran</p>
+<pre><code class="hljs css language-shell">sudo yum install centos-release-scl-rh
+sudo yum --enablerepo=centos-sclo-rh-testing install devtoolset-7-gcc-gfortran
+</code></pre>
+<p>Để cài đặt pip và các gói chương trình khác</p>
+<pre><code class="hljs css language-shell">sudo yum install epel-release
+sudo yum install python-pip
+pip install matplotlib numpy pandas scikit-learn pydot
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="cài-đặt"></a><a href="#cài-đặt" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<p>Làm theo bước 1-5 của <em>Use native tools để cài SINGA trên Ubuntu</em></p>
+<h3><a class="anchor" aria-hidden="true" id="kiểm-tra-testing"></a><a href="#kiểm-tra-testing" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<p>Bạn có thể chạy unit tests bằng cách,</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> ./bin/test_singa</span>
+</code></pre>
+<p>Bạn sẽ thấy tất cả các trường hợp test kèm theo kết quả test. Nếu SINGA thông qua tất cả các test, bạn đã cài đặt SINGA thành công.</p>
+<h2><a class="anchor" aria-hidden="true" id="compile-singa-trên-windows"></a><a href="#compile-singa-trên-windows" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H [...]
+<p>Hướng dẫn cài đặt trên Windows với Python vui lòng xem tại
+<a href="/docs/3.1.0_Viet/install-win">mục install-win</a>.</p>
+<h2><a class="anchor" aria-hidden="true" id="chi-tiết-bổ-sung-về-các-lựa-chọn-biên-dịch-compilation"></a><a href="#chi-tiết-bổ-sung-về-các-lựa-chọn-biên-dịch-compilation" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2  [...]
+<h3><a class="anchor" aria-hidden="true" id="use_modules-không-còn-sử-dụng"></a><a href="#use_modules-không-còn-sử-dụng" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
+<p>Nếu protobuf và openblas không được cài đặt, bạn có thể compile SINGA cùng với chúng.</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> In SINGA ROOT folder</span>
+<span class="hljs-meta">$</span><span class="bash"> mkdir build</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">cd</span> build</span>
+<span class="hljs-meta">$</span><span class="bash"> cmake -DUSE_MODULES=ON ..</span>
+<span class="hljs-meta">$</span><span class="bash"> make</span>
+</code></pre>
+<p>cmake sẽ tải OpenBlas và Protobuf (2.6.1) sau đó compile cùng với SINGA.</p>
+<p>Bạn có thể sử dụng <code>ccmake ..</code> để định dạng các lựa chọn biên dịch (compilation). Nếu chương trình phụ thuộc (dependent libraries) nào không có trong đường dẫn hệ thống mặc định,bạn cần phải export các biến environment sau:</p>
+<pre><code class="hljs css language-shell">export CMAKE_INCLUDE_PATH=&lt;path to the header file folder&gt;
+export CMAKE_LIBRARY_PATH=&lt;path to the lib file folder&gt;
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="use_python"></a><a href="#use_python" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>Là lựa chọn để compile Python wrapper cho SINGA,</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> cmake -DUSE_PYTHON=ON ..</span>
+<span class="hljs-meta">$</span><span class="bash"> make</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">cd</span> python</span>
+<span class="hljs-meta">$</span><span class="bash"> pip install .</span>
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="use_cuda"></a><a href="#use_cuda" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p>Chúng tôi khuyến khích cài đặt CUDA và
+<a href="https://developer.nvidia.com/cudnn">cuDNN</a> để chạy SINGA trên GPUs nhằm có kết quả tốt nhất.</p>
+<p>SINGA đã được kiểm nghiệm chạy trên CUDA 9/10, và cuDNN 7. Nếu cuDNN được cài đặt vào thư mục không thuộc hệ thống, vd. /home/bob/local/cudnn/, cần chạy các lệnh sau để cmake và runtime có thể tìm được</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">export</span> CMAKE_INCLUDE_PATH=/home/bob/<span class="hljs-built_in">local</span>/cudnn/include:<span class="hljs-variable">$CMAKE_INCLUDE_PATH</span></span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">export</span> CMAKE_LIBRARY_PATH=/home/bob/<span class="hljs-built_in">local</span>/cudnn/lib64:<span class="hljs-variable">$CMAKE_LIBRARY_PATH</span></span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">export</span> LD_LIBRARY_PATH=/home/bob/<span class="hljs-built_in">local</span>/cudnn/lib64:<span class="hljs-variable">$LD_LIBRARY_PATH</span></span>
+</code></pre>
+<p>Các lựa chọn cmake cho CUDA và cuDNN cần được kích hoạt</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> các Dependent libs đã được cài đặt</span>
+<span class="hljs-meta">$</span><span class="bash"> cmake -DUSE_CUDA=ON ..</span>
+<span class="hljs-meta">$</span><span class="bash"> make</span>
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="use_dnnl"></a><a href="#use_dnnl" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p>Người dùng có thể kích hoạt DNNL để cải thiện hiệu quả cho chương trình CPU.</p>
+<p>Hướng dẫn cài đặt DNNL
+<a href="https://github.com/intel/mkl-dnn#installation">tại đây</a>.</p>
+<p>SINGA đã được thử nghiệm chạy trên DNNL v1.1.</p>
+<p>Để chạy SINGA với DNNL:</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> các Dependent libs đã được cài đặt</span>
+<span class="hljs-meta">$</span><span class="bash"> cmake -DUSE_DNNL=ON ..</span>
+<span class="hljs-meta">$</span><span class="bash"> make</span>
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="use_opencl"></a><a href="#use_opencl" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>SINGA sử dụng opencl-headers và viennacl (phiên bản 1.7.1 hoặc mới hơn) để hỗ trợ OpenCL, có thể được cài đặt qua</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> Trên Ubuntu 16.04</span>
+<span class="hljs-meta">$</span><span class="bash"> sudo apt-get install opencl-headers, libviennacl-dev</span>
+<span class="hljs-meta">#</span><span class="bash"> Trên Fedora</span>
+<span class="hljs-meta">$</span><span class="bash"> sudo yum install opencl-headers, viennacl</span>
+</code></pre>
+<p>Bên cạnh đó, bạn cần OpenCL Installable Client Driver (ICD) cho nền tảng mà bạn muốn chạy OpenCL.</p>
+<ul>
+<li>Với AMD và nVidia GPUs, driver package nên cài đúng bản OpenCL ICD.</li>
+<li>Với Intel CPUs và/hoặc GPUs, có thể tải driver từ
+<a href="https://software.intel.com/en-us/articles/opencl-drivers">Intel website.</a>
+Lưu ý rằng driver này chỉ hỗ trợ các phiên bản mới của CPUs và Iris GPUs.</li>
+<li>Với các bản Intel CPUs cũ hơn, bạn có thể sử dụng gói <code>beignet-opencl-icd</code>.</li>
+</ul>
+<p>Lưu ý rằng chạy OpenCL trên CPUs không được khuyến khích bởi tốc độ chậm. Di chuyển bộ nhớ theo trình tự tính theo từng giây (1000's của ms trên CPUs so với 1's của ms trên GPUs).</p>
+<p>Có thể xem thêm thông tin về cách thiết lập environment có chạy OpenCL tại <a href="https://wiki.tiker.net/OpenCLHowTo">đây</a>.</p>
+<p>Nếu phiên bản của gói chương trình ViennaCL thấp hơn 1.7.1, bạn cần phải tạo từ nguồn:</p>
+<p>Clone <a href="https://github.com/viennacl/viennacl-dev">nguồn tại đây</a>,
+chọn (checkout) tag <code>release-1.7.1</code> để cài đặt. Bạn cần nhớ thêm đường dẫn vào phần <code>PATH</code> và tạo libraries vào <code>LD_LIBRARY_PATH</code>.</p>
+<p>Để cài SINGA với hỗ trợ OpenCL (đã thử trên SINGA 1.1):</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> cmake -DUSE_OPENCL=ON ..</span>
+<span class="hljs-meta">$</span><span class="bash"> make</span>
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="gói-chương-trình-package"></a><a href="#gói-chương-trình-package" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
+<p>Cài đặt này được sử dụng để tạo gói chương trình Debian package. Để PACKAGE=ON và tạo gói chương trình với lệnh như sau:</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> cmake -DPACKAGE=ON</span>
+<span class="hljs-meta">$</span><span class="bash"> make package</span>
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="câu-hỏi-thường-gặp-qa"></a><a href="#câu-hỏi-thường-gặp-qa" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
+<ul>
+<li><p>Q: Gặp lỗi khi 'import singa'</p>
+<p>A: Vui lòng kiểm tra chi tiết lỗi từ <code>python -c &quot;from singa import _singa_wrap&quot;</code>. Đôi khi lỗi xảy ra bởi các dependent libraries, vd. protobuf có nhiều phiên bản, nếu thiếu cudnn, phiên bản numpy sẽ không tương thích. Các bước sau đưa ra giải pháp cho từng trường hợp:</p>
+<ol>
+<li><p>Kiểm tra cudnn và cuda. Nếu thiếu cudnn hoặc không tương thích với phiên bản của wheel, bạn có thể tải phiên bản đúng của cudnn vào thư mục ~/local/cudnn/ và</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">echo</span> <span class="hljs-string">"export LD_LIBRARY_PATH=/home/&lt;yourname&gt;/local/cudnn/lib64:<span class="hljs-variable">$LD_LIBRARY_PATH</span>"</span> &gt;&gt; ~/.bashrc</span>
+</code></pre></li>
+<li><p>Nếu lỗi liên quan tới protobuf. Bạn có thể cài đặt (3.6.1) từ nguồn vào một thư mục trong máy của bạn(local). chẳng hạn ~/local/; Giải nén file tar, sau đó</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> ./configure --prefix=/home/&lt;yourname&gt;<span class="hljs-built_in">local</span></span>
+<span class="hljs-meta">$</span><span class="bash"> make &amp;&amp; make install</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">echo</span> <span class="hljs-string">"export LD_LIBRARY_PATH=/home/&lt;yourname&gt;/local/lib:<span class="hljs-variable">$LD_LIBRARY_PATH</span>"</span> &gt;&gt; ~/.bashrc</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">source</span> ~/.bashrc</span>
+</code></pre></li>
+<li><p>Nếu không tìm được libs nào bao gồm python, thì taọ virtual env sử dụng <code>pip</code> hoặc <code>conda</code>;</p></li>
+<li><p>Nếu lỗi không do các nguyên nhân trên thì đi tới thư mục của <code>_singa_wrap.so</code>,</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> python</span>
+<span class="hljs-meta">&gt;</span><span class="bash">&gt; import importlib</span>
+<span class="hljs-meta">&gt;</span><span class="bash">&gt; importlib.import_module(<span class="hljs-string">'_singa_wrap'</span>)</span>
+</code></pre></li>
+</ol>
+<p>kiểm tra thông báo lỗi. Ví dụ nếu phiên bản numpy không tương thích, thông báo lỗi sẽ là</p>
+<pre><code class="hljs css language-shell">RuntimeError: module compiled against API version 0xb but this version of numpy is 0xa
+</code></pre>
+<p>sau đó bạn cần phải nâng cấp numpy.</p></li>
+</ul>
+<ul>
+<li><p>Q: Lỗi khi chạy <code>cmake ..</code>, không tìm được dependent libraries.</p>
+<p>A: Nếu bạn vẫn chưa cài đặt libraries đó, thì cài đặt chúng. Nếu bạn cài libraries trong thư mục bên ngoài thư mục system, chẳng hạn như /usr/local, bạn cần export các biến sau đây</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">export</span> CMAKE_INCLUDE_PATH=&lt;path to your header file folder&gt;</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">export</span> CMAKE_LIBRARY_PATH=&lt;path to your lib file folder&gt;</span>
+</code></pre></li>
+</ul>
+<ul>
+<li><p>Q: Lỗi từ <code>make</code>, vd. linking phase</p>
+<p>A: Nếu libraries nằm trong thư mục không phải là thư mục system mặc định trong đường dẫn, bạn cần export các biến sau</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">export</span> LIBRARY_PATH=&lt;path to your lib file folder&gt;</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">export</span> LD_LIBRARY_PATH=&lt;path to your lib file folder&gt;</span>
+</code></pre></li>
+</ul>
+<ul>
+<li><p>Q: Lỗi từ các tệp tin headers vd. 'cblas.h no such file or directory exists'</p>
+<p>A: Bạn cần bao gồm các thư mục cblas.h vào CPLUS_INCLUDE_PATH,
+e.g.,</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">export</span> CPLUS_INCLUDE_PATH=/opt/OpenBLAS/include:<span class="hljs-variable">$CPLUS_INCLUDE_PATH</span></span>
+</code></pre></li>
+<li><p>Q: Khi compile SINGA, gặp lỗi <code>SSE2 instruction set not enabled</code></p>
+<p>A: Bạn có thể thử lệnh sau:</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> make CFLAGS=<span class="hljs-string">'-msse2'</span> CXXFLAGS=<span class="hljs-string">'-msse2'</span></span>
+</code></pre></li>
+<li><p>Q:Gặp lỗi <code>ImportError: cannot import name enum_type_wrapper</code> từ google.protobuf.internal khi tôi cố gắng import các tệp tin dạng .py.</p>
+<p>A: Bạn cần cài đặt python cho protobuf, có thể cài đặt qua</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> sudo apt-get install protobuf</span>
+</code></pre></li>
+</ul>
+<p>hoặc từ nguồn</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">cd</span> /PROTOBUF/SOURCE/FOLDER</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">cd</span> python</span>
+<span class="hljs-meta">$</span><span class="bash"> python setup.py build</span>
+<span class="hljs-meta">$</span><span class="bash"> python setup.py install</span>
+</code></pre>
+<ul>
+<li><p>Q: Khi tôi tạo OpenBLAS từ nguồn, tôi gặp yêu cầu cần phải có Fortran compiler.</p>
+<p>A: Bạn có thể compile OpenBLAS bằng cách</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> make ONLY_CBLAS=1</span>
+</code></pre>
+<p>hoặc cài dặt sử dụng</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> sudo apt-get install libopenblas-dev</span>
+</code></pre></li>
+<li><p>Q: Khi tôi tạo protocol buffer, thì bị thông báo <code>GLIBC++_3.4.20</code> không được tìm thấy trong <code>/usr/lib64/libstdc++.so.6</code>?</p>
+<p>A: Nghĩa là linker trong libstdc++.so.6 nhưng chương trình này thuộc về một phiên bản cũ hơn của GCC đã được dùng để compile và link chương trình. Chương trình phụ thuộc vào code viết trong phiên bản libstdc++ cập nhật thuộc về phiên bản mới hơn của GCC, vì vậy linker phải chỉ ra cách để cài phiên bản libstdc++ mới hơn được chia sẻ trong library. Cách đơn giản nhất để sửa lỗi này là tìm phiên bản đúng cho libstdc++ và export nó vào LD_LIBRARY_PATH. Ví dụ nếu GLIBC++_3.4.20 có trong ou [...]
+<pre><code class="hljs">  $ strings /usr/local/lib64/libstdc++.so.6|grep GLIBC++
+</code></pre>
+<p>thì bạn chỉ cần tạo biến environment</p>
+<pre><code class="hljs">  $ export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
+</code></pre></li>
+<li><p>Q: Khi tạo glog, nhận thông báo &quot;src/logging_unittest.cc:83:20: error:
+‘gflags’ is not a namespace-name&quot;</p>
+<p>A: Có thể do bạn đã cài gflags với một namespace khác như là &quot;google&quot;. vì thế glog không thể tìm thấy 'gflags' namespace. Do cài glog thì không cần phải có gflags. Nên bạn cần sửa tệp tin configure.ac thành ignore gflags.</p>
+<pre><code class="hljs">  1. cd to glog src directory
+  2. change line 125 of configure.ac  to &quot;AC_CHECK_LIB(gflags, main, ac_cv_have_libgflags=0, ac_cv_have_libgflags=0)&quot;
+  3. autoreconf
+</code></pre>
+<p>Sau đó bạn có thể cài lại glog.</p></li>
+<li><p>Q: Khi sử dụng virtual environment, bất cứ khi nào tôi chạy pip install, numpy sẽ tự cài lại numpy. Tuy nhiên, numpy này không được sử dụng khi tôi <code>import numpy</code></p>
+<p>A: Lỗi có thể gây ra bởi <code>PYTHONPATH</code> vốn nên được để trống (empty) khi bạn sử dụng virtual environment nhằm tránh conflict với đường dẫn của virtual environment.</p></li>
+<li><p>Q: Khi compile PySINGA từ nguồn, có lỗi compilation do thiếu &lt;numpy/objectarray.h&gt;</p>
+<p>A: Vui lòng cài đặt numpy và export đường dẫn của tệp tin numpy header như sau</p>
+<pre><code class="hljs">  $ export CPLUS_INCLUDE_PATH=`python -c &quot;import numpy; print numpy.get_include()&quot;`:$CPLUS_INCLUDE_PATH
+</code></pre></li>
+<li><p>Q: Khi chạy SINGA trên Mac OS X, tôi gặp lỗi &quot;Fatal Python error:
+PyThreadState_Get: no current thread Abort trap: 6&quot;</p>
+<p>A: Lỗi này thường xảy ra khi bạn có nhiều phiên bản Python trong hệ thống, và bạn cài SINGA qua pip (vấn đề này có thể được giải quyết nếu cài đặt bằng conda), vd. một bên qua OS và một bên cài đặt qua Homebrew. Python dùng trong PySINGA phải là Python interpreter. Bạn có thể kiểm tra trình thông dịch (interpreter) của mình bằng <code>which python</code> và kiểm tra bản Python dùng trong PySINGA qua <code>otool -L &lt;path to _singa_wrap.so&gt;</code>. Để sửa lỗi này, bạn compile SING [...]
+<pre><code class="hljs">  $ cmake -DPYTHON_LIBRARY=`python-config --prefix`/lib/libpython2.7.dylib -DPYTHON_INCLUDE_DIR=`python-config --prefix`/include/python2.7/ ..
+</code></pre>
+<p>Nếu cài đặt PySINGA từ gói binary packages, vd. debian hay wheel, thì bạn cần thay đổi trình thông dịch của python (python interpreter), vd., reset $PATH để đường dẫn dúng của Python ở đằng trước.</p></li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/downloads"><span class="arrow-prev">← </span><span>Download SINGA</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/contribute-code"><span>How to Contribute Code</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sử-dụng-conda-để-cài-singa">Sử dụng Conda để cài SINGA</a><ul class="toc-headings"><li>< [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/build/index.html b/content/docs/3.1.0_Viet/build/index.html
new file mode 100644
index 0000000..c2c4066
--- /dev/null
+++ b/content/docs/3.1.0_Viet/build/index.html
@@ -0,0 +1,371 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Cài đặt SINGA từ Nguồn (Source) · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information reg [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/build.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Cài đặt SINGA từ Nguồn (Source)</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more  [...]
+<p>Các tệp nguồn có thể được tải dưới dạng
+<a href="https://dist.apache.org/repos/dist/dev/singa/">tar.gz file</a>, hoặc git repo</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> git <span class="hljs-built_in">clone</span> https://github.com/apache/singa.git</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">cd</span> singa/</span>
+</code></pre>
+<p>Nếu bạn muốn tham gia đóng góp code cho SINGA, tham khảo
+<a href="/docs/3.1.0_Viet/contribute-code">mục contribute-code</a> với các bước làm và yêu cầu kĩ thuật.</p>
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng-conda-để-cài-singa"></a><a href="#sử-dụng-conda-để-cài-singa" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H [...]
+<p>Conda-build là phần mềm giúp cài đặt thư viện chương trình từ dữ liệu đám mây anaconda và thực hiện các tập lệnh tạo chương trình.</p>
+<p>Để cài đặt conda-build (sau khi cài conda)</p>
+<pre><code class="hljs css language-shell">conda install conda-build
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="tạo-phiên-bản-cpu"></a><a href="#tạo-phiên-bản-cpu" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p>Để tạo phiên bản CPU cho SINGA</p>
+<pre><code class="hljs css language-shell">conda build tool/conda/singa/
+</code></pre>
+<p>Lệnh trên đã được kiểm tra trên Ubuntu (14.04, 16.04 và 18.04) và macOS
+10.11. Tham khảo <a href="https://travis-ci.org/apache/singa">trang Travis-CI</a> để biết thêm chi tiết.</p>
+<h3><a class="anchor" aria-hidden="true" id="tạo-phiên-bản-gpu"></a><a href="#tạo-phiên-bản-gpu" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p>Để tạo phiên bản GPU cho SINGA, máy để cài phải có Nvida GPU, và CUDA driver (&gt;= 384.81), phải được cài đặt CUDA toolkit (&gt;=9) và cuDNN (&gt;=7). Hai Docker images dưới đây cung cấp environment để chạy:</p>
+<ol>
+<li>apache/singa:conda-cuda9.0</li>
+<li>apache/singa:conda-cuda10.0</li>
+</ol>
+<p>Sau khi environment để chạy đã sẵn sàng, bạn cần phải export phiên bản CUDA trước, sau đó chạy lệnh conda để cài SINGA:</p>
+<pre><code class="hljs css language-shell">export CUDA=x.y (e.g. 9.0)
+conda build tool/conda/singa/
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="sau-khi-chạy-chương-trình"></a><a href="#sau-khi-chạy-chương-trình" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<p>Vị trí đặt tệp tin của gói chương trình được tạo (<code>.tar.gz</code>) hiển thị trên màn hình.
+Gói chương trình được tạo có thể được cài đặt trực tiếp,</p>
+<pre><code class="hljs css language-shell">conda install -c conda-forge --use-local &lt;path to the package file&gt;
+</code></pre>
+<p>hoặc tải lên dữ liệu đám mây anaconda cloud để người dùng khác có thể tải và cài đặt. Bạn cần phải đăng kí một tài khoản trên anaconda để có thể
+<a href="https://docs.anaconda.com/anaconda-cloud/user-guide/getting-started/">tải lên gói chương trình</a>.</p>
+<pre><code class="hljs css language-shell">conda install anaconda-client
+anaconda login
+anaconda upload -l main &lt;path to the package file&gt;
+</code></pre>
+<p>Sau khi tải gói chương trình lên dữ liệu đám mây, bạn có thể tìm thấy gói trên website của
+<a href="https://anaconda.org/">Anaconda Cloud</a> hoặc qua lệnh</p>
+<pre><code class="hljs css language-shell">conda search -c &lt;anaconda username&gt; singa
+</code></pre>
+<p>Mỗi gói chương trình của SINGA đuợc nhận diện theo phiên bản hoặc dòng lệnh cài đặt. Để cài một gói chương trình SINGA cụ thể, bạn cần phải cung cấp toàn bộ thông tin, vd.</p>
+<pre><code class="hljs css language-shell">conda install -c &lt;anaconda username&gt; -c conda-forge singa=2.1.0.dev=cpu_py36
+</code></pre>
+<p>Để cho lệnh cài đặt không phức tạp, bạn có thể tạo các gói chương trình bổ sung sau dựa trên các gói chương trình cho SINGA CPU và GPU mới nhất .</p>
+<pre><code class="hljs css language-console"><span class="hljs-meta">#</span><span class="bash"> <span class="hljs-keyword">for</span> singa-cpu</span>
+conda build tool/conda/cpu/  --python=3.6
+conda build tool/conda/cpu/  --python=3.7
+<span class="hljs-meta">#</span><span class="bash"> <span class="hljs-keyword">for</span> singa-gpu</span>
+conda build tool/conda/gpu/  --python=3.6
+conda build tool/conda/gpu/  --python=3.7
+</code></pre>
+<p>Bởi vậy, khi bạn chạy</p>
+<pre><code class="hljs css language-shell">conda install -c &lt;anaconda username&gt; -c conda-forge singa-xpu
+</code></pre>
+<p>(<code>xpu</code> nghĩa là hoặc 'cpu' hoặc 'gpu'), gói SINGA tương ứng thực sự được cài đặt như một library phụ thuộc.</p>
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng-các-phương-tiện-cơ-bản-để-cài-đặt-singa-trên-ubuntu"></a><a href="#sử-dụng-các-phương-tiện-cơ-bản-để-cài-đặt-singa-trên-ubuntu" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0 [...]
+<p>Tham khảo
+<a href="https://github.com/apache/singa/blob/master/tool/docker/devel/ubuntu/cuda9/Dockerfile#L30">Dockerfiles</a>
+của SINGA để xem hướng dẫn cài đặt các chương trình library phụ thuộc trên Ubuntu 16.04. Bạn có thể tạo một Docker container sử dụng <a href="">devel images</a> và cài SINGA trong container. Để cài SINGA với GPU, DNNL, Python và unit tests, chạy lệnh theo hướng dẫn sau</p>
+<pre><code class="hljs css language-shell">mkdir build    # tại thư mục nguồn của singa
+cd build
+cmake -DENABLE_TEST=ON -DUSE_CUDA=ON -DUSE_DNNL=ON -DUSE_PYTHON3=ON ..
+make
+cd python
+pip install .
+</code></pre>
+<p>Chi tiết các lựa chọn CMake đuợc giải thích ở phần cuối cùng của trang này. Câu lệnh cuối cùng để cài gói Python. Bạn cúng có thể chạy
+<code>pip install -e .</code>, để tạo symlinks thay vì copy các tâp tin Python vào mục site-package.</p>
+<p>Nếu SINGA được compile với ENABLE_TEST=ON, bạn có thể chạy unit test bằng cách</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> ./bin/test_singa</span>
+</code></pre>
+<p>Bạn sẽ thấy tất cả các trường hợp test kèm theo kết quả test. Nếu SINGA thông qua tất cả các test, bạn đã cài đặt SINGA thành công.</p>
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng-các-phương-tiện-cơ-bản-để-cài-đặt-singa-trên-centos7"></a><a href="#sử-dụng-các-phương-tiện-cơ-bản-để-cài-đặt-singa-trên-centos7" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 [...]
+<p>Tạo từ nguồn sẽ khác trên Centos7 bởi tên của gói chương trình là khác nhau. Làm theo hướng dẫn dưới đây</p>
+<h3><a class="anchor" aria-hidden="true" id="cài-các-chương-trình-phụ-thuộc-dependent-libraries"></a><a href="#cài-các-chương-trình-phụ-thuộc-dependent-libraries" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9  [...]
+<p>Gói/chương trình cơ bản</p>
+<pre><code class="hljs css language-shell">sudo yum install freetype-devel libXft-devel ncurses-devel openblas-devel blas-devel lapack devel atlas-devel kernel-headers unzip wget pkgconfig zip zlib-devel libcurl-devel cmake curl unzip dh-autoreconf git python-devel glog-devel protobuf-devel
+</code></pre>
+<p>Cho build-essential</p>
+<pre><code class="hljs css language-shell">sudo yum group install "Development Tools"
+</code></pre>
+<p>Để cài đặt swig</p>
+<pre><code class="hljs css language-shell">sudo yum install pcre-devel
+wget http://prdownloads.sourceforge.net/swig/swig-3.0.10.tar.gz
+tar xvzf swig-3.0.10.tar.gz
+cd swig-3.0.10.tar.gz
+./configure --prefix=${RUN}
+make
+make install
+</code></pre>
+<p>Để cài đặt gfortran</p>
+<pre><code class="hljs css language-shell">sudo yum install centos-release-scl-rh
+sudo yum --enablerepo=centos-sclo-rh-testing install devtoolset-7-gcc-gfortran
+</code></pre>
+<p>Để cài đặt pip và các gói chương trình khác</p>
+<pre><code class="hljs css language-shell">sudo yum install epel-release
+sudo yum install python-pip
+pip install matplotlib numpy pandas scikit-learn pydot
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="cài-đặt"></a><a href="#cài-đặt" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<p>Làm theo bước 1-5 của <em>Use native tools để cài SINGA trên Ubuntu</em></p>
+<h3><a class="anchor" aria-hidden="true" id="kiểm-tra-testing"></a><a href="#kiểm-tra-testing" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<p>Bạn có thể chạy unit tests bằng cách,</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> ./bin/test_singa</span>
+</code></pre>
+<p>Bạn sẽ thấy tất cả các trường hợp test kèm theo kết quả test. Nếu SINGA thông qua tất cả các test, bạn đã cài đặt SINGA thành công.</p>
+<h2><a class="anchor" aria-hidden="true" id="compile-singa-trên-windows"></a><a href="#compile-singa-trên-windows" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H [...]
+<p>Hướng dẫn cài đặt trên Windows với Python vui lòng xem tại
+<a href="/docs/3.1.0_Viet/install-win">mục install-win</a>.</p>
+<h2><a class="anchor" aria-hidden="true" id="chi-tiết-bổ-sung-về-các-lựa-chọn-biên-dịch-compilation"></a><a href="#chi-tiết-bổ-sung-về-các-lựa-chọn-biên-dịch-compilation" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2  [...]
+<h3><a class="anchor" aria-hidden="true" id="use_modules-không-còn-sử-dụng"></a><a href="#use_modules-không-còn-sử-dụng" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
+<p>Nếu protobuf và openblas không được cài đặt, bạn có thể compile SINGA cùng với chúng.</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> In SINGA ROOT folder</span>
+<span class="hljs-meta">$</span><span class="bash"> mkdir build</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">cd</span> build</span>
+<span class="hljs-meta">$</span><span class="bash"> cmake -DUSE_MODULES=ON ..</span>
+<span class="hljs-meta">$</span><span class="bash"> make</span>
+</code></pre>
+<p>cmake sẽ tải OpenBlas và Protobuf (2.6.1) sau đó compile cùng với SINGA.</p>
+<p>Bạn có thể sử dụng <code>ccmake ..</code> để định dạng các lựa chọn biên dịch (compilation). Nếu chương trình phụ thuộc (dependent libraries) nào không có trong đường dẫn hệ thống mặc định,bạn cần phải export các biến environment sau:</p>
+<pre><code class="hljs css language-shell">export CMAKE_INCLUDE_PATH=&lt;path to the header file folder&gt;
+export CMAKE_LIBRARY_PATH=&lt;path to the lib file folder&gt;
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="use_python"></a><a href="#use_python" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>Là lựa chọn để compile Python wrapper cho SINGA,</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> cmake -DUSE_PYTHON=ON ..</span>
+<span class="hljs-meta">$</span><span class="bash"> make</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">cd</span> python</span>
+<span class="hljs-meta">$</span><span class="bash"> pip install .</span>
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="use_cuda"></a><a href="#use_cuda" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p>Chúng tôi khuyến khích cài đặt CUDA và
+<a href="https://developer.nvidia.com/cudnn">cuDNN</a> để chạy SINGA trên GPUs nhằm có kết quả tốt nhất.</p>
+<p>SINGA đã được kiểm nghiệm chạy trên CUDA 9/10, và cuDNN 7. Nếu cuDNN được cài đặt vào thư mục không thuộc hệ thống, vd. /home/bob/local/cudnn/, cần chạy các lệnh sau để cmake và runtime có thể tìm được</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">export</span> CMAKE_INCLUDE_PATH=/home/bob/<span class="hljs-built_in">local</span>/cudnn/include:<span class="hljs-variable">$CMAKE_INCLUDE_PATH</span></span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">export</span> CMAKE_LIBRARY_PATH=/home/bob/<span class="hljs-built_in">local</span>/cudnn/lib64:<span class="hljs-variable">$CMAKE_LIBRARY_PATH</span></span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">export</span> LD_LIBRARY_PATH=/home/bob/<span class="hljs-built_in">local</span>/cudnn/lib64:<span class="hljs-variable">$LD_LIBRARY_PATH</span></span>
+</code></pre>
+<p>Các lựa chọn cmake cho CUDA và cuDNN cần được kích hoạt</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> các Dependent libs đã được cài đặt</span>
+<span class="hljs-meta">$</span><span class="bash"> cmake -DUSE_CUDA=ON ..</span>
+<span class="hljs-meta">$</span><span class="bash"> make</span>
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="use_dnnl"></a><a href="#use_dnnl" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p>Người dùng có thể kích hoạt DNNL để cải thiện hiệu quả cho chương trình CPU.</p>
+<p>Hướng dẫn cài đặt DNNL
+<a href="https://github.com/intel/mkl-dnn#installation">tại đây</a>.</p>
+<p>SINGA đã được thử nghiệm chạy trên DNNL v1.1.</p>
+<p>Để chạy SINGA với DNNL:</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> các Dependent libs đã được cài đặt</span>
+<span class="hljs-meta">$</span><span class="bash"> cmake -DUSE_DNNL=ON ..</span>
+<span class="hljs-meta">$</span><span class="bash"> make</span>
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="use_opencl"></a><a href="#use_opencl" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>SINGA sử dụng opencl-headers và viennacl (phiên bản 1.7.1 hoặc mới hơn) để hỗ trợ OpenCL, có thể được cài đặt qua</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> Trên Ubuntu 16.04</span>
+<span class="hljs-meta">$</span><span class="bash"> sudo apt-get install opencl-headers, libviennacl-dev</span>
+<span class="hljs-meta">#</span><span class="bash"> Trên Fedora</span>
+<span class="hljs-meta">$</span><span class="bash"> sudo yum install opencl-headers, viennacl</span>
+</code></pre>
+<p>Bên cạnh đó, bạn cần OpenCL Installable Client Driver (ICD) cho nền tảng mà bạn muốn chạy OpenCL.</p>
+<ul>
+<li>Với AMD và nVidia GPUs, driver package nên cài đúng bản OpenCL ICD.</li>
+<li>Với Intel CPUs và/hoặc GPUs, có thể tải driver từ
+<a href="https://software.intel.com/en-us/articles/opencl-drivers">Intel website.</a>
+Lưu ý rằng driver này chỉ hỗ trợ các phiên bản mới của CPUs và Iris GPUs.</li>
+<li>Với các bản Intel CPUs cũ hơn, bạn có thể sử dụng gói <code>beignet-opencl-icd</code>.</li>
+</ul>
+<p>Lưu ý rằng chạy OpenCL trên CPUs không được khuyến khích bởi tốc độ chậm. Di chuyển bộ nhớ theo trình tự tính theo từng giây (1000's của ms trên CPUs so với 1's của ms trên GPUs).</p>
+<p>Có thể xem thêm thông tin về cách thiết lập environment có chạy OpenCL tại <a href="https://wiki.tiker.net/OpenCLHowTo">đây</a>.</p>
+<p>Nếu phiên bản của gói chương trình ViennaCL thấp hơn 1.7.1, bạn cần phải tạo từ nguồn:</p>
+<p>Clone <a href="https://github.com/viennacl/viennacl-dev">nguồn tại đây</a>,
+chọn (checkout) tag <code>release-1.7.1</code> để cài đặt. Bạn cần nhớ thêm đường dẫn vào phần <code>PATH</code> và tạo libraries vào <code>LD_LIBRARY_PATH</code>.</p>
+<p>Để cài SINGA với hỗ trợ OpenCL (đã thử trên SINGA 1.1):</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> cmake -DUSE_OPENCL=ON ..</span>
+<span class="hljs-meta">$</span><span class="bash"> make</span>
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="gói-chương-trình-package"></a><a href="#gói-chương-trình-package" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
+<p>Cài đặt này được sử dụng để tạo gói chương trình Debian package. Để PACKAGE=ON và tạo gói chương trình với lệnh như sau:</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> cmake -DPACKAGE=ON</span>
+<span class="hljs-meta">$</span><span class="bash"> make package</span>
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="câu-hỏi-thường-gặp-qa"></a><a href="#câu-hỏi-thường-gặp-qa" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
+<ul>
+<li><p>Q: Gặp lỗi khi 'import singa'</p>
+<p>A: Vui lòng kiểm tra chi tiết lỗi từ <code>python -c &quot;from singa import _singa_wrap&quot;</code>. Đôi khi lỗi xảy ra bởi các dependent libraries, vd. protobuf có nhiều phiên bản, nếu thiếu cudnn, phiên bản numpy sẽ không tương thích. Các bước sau đưa ra giải pháp cho từng trường hợp:</p>
+<ol>
+<li><p>Kiểm tra cudnn và cuda. Nếu thiếu cudnn hoặc không tương thích với phiên bản của wheel, bạn có thể tải phiên bản đúng của cudnn vào thư mục ~/local/cudnn/ và</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">echo</span> <span class="hljs-string">"export LD_LIBRARY_PATH=/home/&lt;yourname&gt;/local/cudnn/lib64:<span class="hljs-variable">$LD_LIBRARY_PATH</span>"</span> &gt;&gt; ~/.bashrc</span>
+</code></pre></li>
+<li><p>Nếu lỗi liên quan tới protobuf. Bạn có thể cài đặt (3.6.1) từ nguồn vào một thư mục trong máy của bạn(local). chẳng hạn ~/local/; Giải nén file tar, sau đó</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> ./configure --prefix=/home/&lt;yourname&gt;<span class="hljs-built_in">local</span></span>
+<span class="hljs-meta">$</span><span class="bash"> make &amp;&amp; make install</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">echo</span> <span class="hljs-string">"export LD_LIBRARY_PATH=/home/&lt;yourname&gt;/local/lib:<span class="hljs-variable">$LD_LIBRARY_PATH</span>"</span> &gt;&gt; ~/.bashrc</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">source</span> ~/.bashrc</span>
+</code></pre></li>
+<li><p>Nếu không tìm được libs nào bao gồm python, thì taọ virtual env sử dụng <code>pip</code> hoặc <code>conda</code>;</p></li>
+<li><p>Nếu lỗi không do các nguyên nhân trên thì đi tới thư mục của <code>_singa_wrap.so</code>,</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> python</span>
+<span class="hljs-meta">&gt;</span><span class="bash">&gt; import importlib</span>
+<span class="hljs-meta">&gt;</span><span class="bash">&gt; importlib.import_module(<span class="hljs-string">'_singa_wrap'</span>)</span>
+</code></pre></li>
+</ol>
+<p>kiểm tra thông báo lỗi. Ví dụ nếu phiên bản numpy không tương thích, thông báo lỗi sẽ là</p>
+<pre><code class="hljs css language-shell">RuntimeError: module compiled against API version 0xb but this version of numpy is 0xa
+</code></pre>
+<p>sau đó bạn cần phải nâng cấp numpy.</p></li>
+</ul>
+<ul>
+<li><p>Q: Lỗi khi chạy <code>cmake ..</code>, không tìm được dependent libraries.</p>
+<p>A: Nếu bạn vẫn chưa cài đặt libraries đó, thì cài đặt chúng. Nếu bạn cài libraries trong thư mục bên ngoài thư mục system, chẳng hạn như /usr/local, bạn cần export các biến sau đây</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">export</span> CMAKE_INCLUDE_PATH=&lt;path to your header file folder&gt;</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">export</span> CMAKE_LIBRARY_PATH=&lt;path to your lib file folder&gt;</span>
+</code></pre></li>
+</ul>
+<ul>
+<li><p>Q: Lỗi từ <code>make</code>, vd. linking phase</p>
+<p>A: Nếu libraries nằm trong thư mục không phải là thư mục system mặc định trong đường dẫn, bạn cần export các biến sau</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">export</span> LIBRARY_PATH=&lt;path to your lib file folder&gt;</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">export</span> LD_LIBRARY_PATH=&lt;path to your lib file folder&gt;</span>
+</code></pre></li>
+</ul>
+<ul>
+<li><p>Q: Lỗi từ các tệp tin headers vd. 'cblas.h no such file or directory exists'</p>
+<p>A: Bạn cần bao gồm các thư mục cblas.h vào CPLUS_INCLUDE_PATH,
+e.g.,</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">export</span> CPLUS_INCLUDE_PATH=/opt/OpenBLAS/include:<span class="hljs-variable">$CPLUS_INCLUDE_PATH</span></span>
+</code></pre></li>
+<li><p>Q: Khi compile SINGA, gặp lỗi <code>SSE2 instruction set not enabled</code></p>
+<p>A: Bạn có thể thử lệnh sau:</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> make CFLAGS=<span class="hljs-string">'-msse2'</span> CXXFLAGS=<span class="hljs-string">'-msse2'</span></span>
+</code></pre></li>
+<li><p>Q:Gặp lỗi <code>ImportError: cannot import name enum_type_wrapper</code> từ google.protobuf.internal khi tôi cố gắng import các tệp tin dạng .py.</p>
+<p>A: Bạn cần cài đặt python cho protobuf, có thể cài đặt qua</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> sudo apt-get install protobuf</span>
+</code></pre></li>
+</ul>
+<p>hoặc từ nguồn</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">cd</span> /PROTOBUF/SOURCE/FOLDER</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">cd</span> python</span>
+<span class="hljs-meta">$</span><span class="bash"> python setup.py build</span>
+<span class="hljs-meta">$</span><span class="bash"> python setup.py install</span>
+</code></pre>
+<ul>
+<li><p>Q: Khi tôi tạo OpenBLAS từ nguồn, tôi gặp yêu cầu cần phải có Fortran compiler.</p>
+<p>A: Bạn có thể compile OpenBLAS bằng cách</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> make ONLY_CBLAS=1</span>
+</code></pre>
+<p>hoặc cài dặt sử dụng</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> sudo apt-get install libopenblas-dev</span>
+</code></pre></li>
+<li><p>Q: Khi tôi tạo protocol buffer, thì bị thông báo <code>GLIBC++_3.4.20</code> không được tìm thấy trong <code>/usr/lib64/libstdc++.so.6</code>?</p>
+<p>A: Nghĩa là linker trong libstdc++.so.6 nhưng chương trình này thuộc về một phiên bản cũ hơn của GCC đã được dùng để compile và link chương trình. Chương trình phụ thuộc vào code viết trong phiên bản libstdc++ cập nhật thuộc về phiên bản mới hơn của GCC, vì vậy linker phải chỉ ra cách để cài phiên bản libstdc++ mới hơn được chia sẻ trong library. Cách đơn giản nhất để sửa lỗi này là tìm phiên bản đúng cho libstdc++ và export nó vào LD_LIBRARY_PATH. Ví dụ nếu GLIBC++_3.4.20 có trong ou [...]
+<pre><code class="hljs">  $ strings /usr/local/lib64/libstdc++.so.6|grep GLIBC++
+</code></pre>
+<p>thì bạn chỉ cần tạo biến environment</p>
+<pre><code class="hljs">  $ export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
+</code></pre></li>
+<li><p>Q: Khi tạo glog, nhận thông báo &quot;src/logging_unittest.cc:83:20: error:
+‘gflags’ is not a namespace-name&quot;</p>
+<p>A: Có thể do bạn đã cài gflags với một namespace khác như là &quot;google&quot;. vì thế glog không thể tìm thấy 'gflags' namespace. Do cài glog thì không cần phải có gflags. Nên bạn cần sửa tệp tin configure.ac thành ignore gflags.</p>
+<pre><code class="hljs">  1. cd to glog src directory
+  2. change line 125 of configure.ac  to &quot;AC_CHECK_LIB(gflags, main, ac_cv_have_libgflags=0, ac_cv_have_libgflags=0)&quot;
+  3. autoreconf
+</code></pre>
+<p>Sau đó bạn có thể cài lại glog.</p></li>
+<li><p>Q: Khi sử dụng virtual environment, bất cứ khi nào tôi chạy pip install, numpy sẽ tự cài lại numpy. Tuy nhiên, numpy này không được sử dụng khi tôi <code>import numpy</code></p>
+<p>A: Lỗi có thể gây ra bởi <code>PYTHONPATH</code> vốn nên được để trống (empty) khi bạn sử dụng virtual environment nhằm tránh conflict với đường dẫn của virtual environment.</p></li>
+<li><p>Q: Khi compile PySINGA từ nguồn, có lỗi compilation do thiếu &lt;numpy/objectarray.h&gt;</p>
+<p>A: Vui lòng cài đặt numpy và export đường dẫn của tệp tin numpy header như sau</p>
+<pre><code class="hljs">  $ export CPLUS_INCLUDE_PATH=`python -c &quot;import numpy; print numpy.get_include()&quot;`:$CPLUS_INCLUDE_PATH
+</code></pre></li>
+<li><p>Q: Khi chạy SINGA trên Mac OS X, tôi gặp lỗi &quot;Fatal Python error:
+PyThreadState_Get: no current thread Abort trap: 6&quot;</p>
+<p>A: Lỗi này thường xảy ra khi bạn có nhiều phiên bản Python trong hệ thống, và bạn cài SINGA qua pip (vấn đề này có thể được giải quyết nếu cài đặt bằng conda), vd. một bên qua OS và một bên cài đặt qua Homebrew. Python dùng trong PySINGA phải là Python interpreter. Bạn có thể kiểm tra trình thông dịch (interpreter) của mình bằng <code>which python</code> và kiểm tra bản Python dùng trong PySINGA qua <code>otool -L &lt;path to _singa_wrap.so&gt;</code>. Để sửa lỗi này, bạn compile SING [...]
+<pre><code class="hljs">  $ cmake -DPYTHON_LIBRARY=`python-config --prefix`/lib/libpython2.7.dylib -DPYTHON_INCLUDE_DIR=`python-config --prefix`/include/python2.7/ ..
+</code></pre>
+<p>Nếu cài đặt PySINGA từ gói binary packages, vd. debian hay wheel, thì bạn cần thay đổi trình thông dịch của python (python interpreter), vd., reset $PATH để đường dẫn dúng của Python ở đằng trước.</p></li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/downloads"><span class="arrow-prev">← </span><span>Download SINGA</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/contribute-code"><span>How to Contribute Code</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sử-dụng-conda-để-cài-singa">Sử dụng Conda để cài SINGA</a><ul class="toc-headings"><li>< [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/contribute-code.html b/content/docs/3.1.0_Viet/contribute-code.html
new file mode 100644
index 0000000..ff04611
--- /dev/null
+++ b/content/docs/3.1.0_Viet/contribute-code.html
@@ -0,0 +1,170 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Tham gia viết code · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyrig [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/contribute-code.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Tham gia viết code</h1></header><article><div><span><!-- Licensed to the Apache Software Foundation (ASF) under one or more cont [...]
+<h2><a class="anchor" aria-hidden="true" id="định-dạng-mã-code"></a><a href="#định-dạng-mã-code" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p>Nền tảng code của SINGA tuân theo định dạng Google cho cả code <a href="http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml">CPP</a> và
+<a href="http://google.github.io/styleguide/pyguide.html">Python</a>.</p>
+<p>Một cách đơn giản để thực hiện định dạng lập trình Google là sử dụng linting và các công cụ định dạng trong Visual Studio Code editor:</p>
+<ul>
+<li><a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools">C/C++ extension</a></li>
+<li><a href="https://marketplace.visualstudio.com/items?itemName=ms-python.python">Python extension</a></li>
+<li><a href="https://marketplace.visualstudio.com/items?itemName=mine.cpplint">cpplint extension</a></li>
+<li><a href="https://marketplace.visualstudio.com/items?itemName=xaver.clang-format">Clang-Format</a></li>
+</ul>
+<p>Sau khi cài extensions, chỉnh sửa tệp tin <code>settings.json</code>.</p>
+<pre><code class="hljs css language-json">{
+  <span class="hljs-attr">"[cpp]"</span>: {
+    <span class="hljs-attr">"editor.defaultFormatter"</span>: <span class="hljs-string">"xaver.clang-format"</span>
+  },
+  <span class="hljs-attr">"cpplint.cpplintPath"</span>: <span class="hljs-string">"path/to/cpplint"</span>,
+
+  <span class="hljs-attr">"editor.formatOnSave"</span>: <span class="hljs-literal">true</span>,
+  <span class="hljs-attr">"python.formatting.provider"</span>: <span class="hljs-string">"yapf"</span>,
+  <span class="hljs-attr">"python.linting.enabled"</span>: <span class="hljs-literal">true</span>,
+  <span class="hljs-attr">"python.linting.lintOnSave"</span>: <span class="hljs-literal">true</span>,
+  <span class="hljs-attr">"clang-format.language.cpp.style"</span>: <span class="hljs-string">"google"</span>,
+  <span class="hljs-attr">"python.formatting.yapfArgs"</span>: [<span class="hljs-string">"--style"</span>, <span class="hljs-string">"{based_on_style: google}"</span>]
+}
+</code></pre>
+<p>Dựa vào nền tảng bạn đang sử dụng. tệp tin user settings được đặt tại đây:</p>
+<ol>
+<li>Windows %APPDATA%\Code\User\settings.json</li>
+<li>macOS &quot;$HOME/Library/Application Support/Code/User/settings.json&quot;</li>
+<li>Linux &quot;$HOME/.config/Code/User/settings.json&quot;</li>
+</ol>
+<p>Thông số cấu hình cụ thể có trong các tệp tin config file tuơng ứng. Những công cụ này sẽ tự động tìm kiếm các tập tin cấu hình configuration files trong root của dự án, vd. <code>.pylintrc</code>.</p>
+<h4><a class="anchor" aria-hidden="true" id="cài-đặt-công-cụ"></a><a href="#cài-đặt-công-cụ" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
+<p>Tốt nhất là tất cả người tham gia viết mã code sử dụng cùng một phiên bản công cụ định dạng mã code (clang-format 9.0.0 và yapf 0.29.0), để tất cả định dạng mã code sẽ giống nhau dù thuộc về các PRs khác nhau, nhằm tránh tạo conflict trong github pull request.</p>
+<p>Trước tiên, cài đặt LLVM 9.0 cung cấp clang-format phiên bản 9.0.0. Trang tải LLVM là:</p>
+<ul>
+<li><p><a href="http://releases.llvm.org/download.html#9.0.0">LLVM</a></p>
+<ul>
+<li><p>Trên Ubuntu</p>
+<pre><code class="hljs css language-sh">sudo apt-get install clang-format-9
+</code></pre></li>
+<li><p>Trên Windows. Tải gói pre-built và cài đặt</p></li>
+</ul></li>
+</ul>
+<p>Sau đó, cài cpplint, pylint và yapf</p>
+<ul>
+<li><p>Ubuntu or OSX:</p>
+<pre><code class="hljs"><span class="hljs-meta">$</span><span class="bash"> sudo pip install cpplint</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">which</span> cpplint</span>
+/path/to/cpplint
+<span class="hljs-meta">
+$</span><span class="bash"> pip install yapf==0.29.0</span>
+<span class="hljs-meta">$</span><span class="bash"> pip install pylint</span>
+</code></pre></li>
+<li><p>Windows: Cài Anaconda cho gói quản lý package management.</p>
+<pre><code class="hljs">$ pip <span class="hljs-keyword">install</span> cpplint
+$ <span class="hljs-keyword">where</span> cpplint
+C:/<span class="hljs-keyword">path</span>/<span class="hljs-keyword">to</span>/cpplint.exe
+
+$ pip <span class="hljs-keyword">install</span> yapf==<span class="hljs-number">0.29</span><span class="hljs-number">.0</span>
+$ pip <span class="hljs-keyword">install</span> pylint
+</code></pre></li>
+</ul>
+<h4><a class="anchor" aria-hidden="true" id="sử-dụng"></a><a href="#sử-dụng" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<ul>
+<li>Sau khi kích hoạt, linting sẽ tự động được áp dụng khi bạn chỉnh sửa các tập tin mã code nguồn (source code file). Lỗi và cảnh báo sẽ hiển thị trên thanh Visual Studio Code <code>PROBLEMS</code>.</li>
+<li>Định dạng mã code có thể thực hiện bằng cách sử dụng Command Palette(<code>Shift+Ctrl+P</code> cho
+Windows hay <code>Shift+Command+P</code> cho OSX) và gõ <code>Format Document</code>.</li>
+</ul>
+<h4><a class="anchor" aria-hidden="true" id="gửi"></a><a href="#gửi" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
+<p>Bạn cần phải chữa lỗi định dạng nếu có trước khi gửi đi pull requests.</p>
+<h2><a class="anchor" aria-hidden="true" id="tạo-environment"></a><a href="#tạo-environment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
+<p>Chúng tôi khuyến khích dùng Visual Studio Code để viết code. Có thể cài các Extensions như Python, C/C++,
+Code Spell Checker, autoDocstring, vim, Remote Development. Tham khảo cấu hình (vd., <code>settings.json</code>) của các extensions <a href="https://gist.github.com/nudles/3d23cfb6ffb30ca7636c45fe60278c55">tại đây</a>.</p>
+<p>Nếu bạn cập nhật mã code CPP, bạn cần recompile SINGA
+<a href="/docs/3.1.0_Viet/build">từ nguồn</a>. Nên sử dụng các công cụ cài đặt cơ bản trong <code>*-devel</code> Docker images hay <code>conda build</code>.</p>
+<p>Nếu bạn chỉ cập nhật mã code Python, bạn cần cài đặt SINGAS một lần, sau đó copy các tập tin Python cập nhật để thay thế chúng trong thư mục cài đặt Python,</p>
+<pre><code class="hljs css language-shell">cp python/singa/xx.py  &lt;path to conda&gt;/lib/python3.7/site-packages/singa/
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="trình-tự"></a><a href="#trình-tự" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p>Vui lòng tham khảo mục <a href="/docs/3.1.0_Viet/git-workflow">git workflow</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/build"><span class="arrow-prev">← </span><span>Build SINGA from Source</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/contribute-docs"><span>How to Contribute to Documentation</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#định-dạng-mã-code">Định dạng mã code</a></li><li><a href="#tạo-environm [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/contribute-code/index.html b/content/docs/3.1.0_Viet/contribute-code/index.html
new file mode 100644
index 0000000..ff04611
--- /dev/null
+++ b/content/docs/3.1.0_Viet/contribute-code/index.html
@@ -0,0 +1,170 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Tham gia viết code · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyrig [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/contribute-code.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Tham gia viết code</h1></header><article><div><span><!-- Licensed to the Apache Software Foundation (ASF) under one or more cont [...]
+<h2><a class="anchor" aria-hidden="true" id="định-dạng-mã-code"></a><a href="#định-dạng-mã-code" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p>Nền tảng code của SINGA tuân theo định dạng Google cho cả code <a href="http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml">CPP</a> và
+<a href="http://google.github.io/styleguide/pyguide.html">Python</a>.</p>
+<p>Một cách đơn giản để thực hiện định dạng lập trình Google là sử dụng linting và các công cụ định dạng trong Visual Studio Code editor:</p>
+<ul>
+<li><a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools">C/C++ extension</a></li>
+<li><a href="https://marketplace.visualstudio.com/items?itemName=ms-python.python">Python extension</a></li>
+<li><a href="https://marketplace.visualstudio.com/items?itemName=mine.cpplint">cpplint extension</a></li>
+<li><a href="https://marketplace.visualstudio.com/items?itemName=xaver.clang-format">Clang-Format</a></li>
+</ul>
+<p>Sau khi cài extensions, chỉnh sửa tệp tin <code>settings.json</code>.</p>
+<pre><code class="hljs css language-json">{
+  <span class="hljs-attr">"[cpp]"</span>: {
+    <span class="hljs-attr">"editor.defaultFormatter"</span>: <span class="hljs-string">"xaver.clang-format"</span>
+  },
+  <span class="hljs-attr">"cpplint.cpplintPath"</span>: <span class="hljs-string">"path/to/cpplint"</span>,
+
+  <span class="hljs-attr">"editor.formatOnSave"</span>: <span class="hljs-literal">true</span>,
+  <span class="hljs-attr">"python.formatting.provider"</span>: <span class="hljs-string">"yapf"</span>,
+  <span class="hljs-attr">"python.linting.enabled"</span>: <span class="hljs-literal">true</span>,
+  <span class="hljs-attr">"python.linting.lintOnSave"</span>: <span class="hljs-literal">true</span>,
+  <span class="hljs-attr">"clang-format.language.cpp.style"</span>: <span class="hljs-string">"google"</span>,
+  <span class="hljs-attr">"python.formatting.yapfArgs"</span>: [<span class="hljs-string">"--style"</span>, <span class="hljs-string">"{based_on_style: google}"</span>]
+}
+</code></pre>
+<p>Dựa vào nền tảng bạn đang sử dụng. tệp tin user settings được đặt tại đây:</p>
+<ol>
+<li>Windows %APPDATA%\Code\User\settings.json</li>
+<li>macOS &quot;$HOME/Library/Application Support/Code/User/settings.json&quot;</li>
+<li>Linux &quot;$HOME/.config/Code/User/settings.json&quot;</li>
+</ol>
+<p>Thông số cấu hình cụ thể có trong các tệp tin config file tuơng ứng. Những công cụ này sẽ tự động tìm kiếm các tập tin cấu hình configuration files trong root của dự án, vd. <code>.pylintrc</code>.</p>
+<h4><a class="anchor" aria-hidden="true" id="cài-đặt-công-cụ"></a><a href="#cài-đặt-công-cụ" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
+<p>Tốt nhất là tất cả người tham gia viết mã code sử dụng cùng một phiên bản công cụ định dạng mã code (clang-format 9.0.0 và yapf 0.29.0), để tất cả định dạng mã code sẽ giống nhau dù thuộc về các PRs khác nhau, nhằm tránh tạo conflict trong github pull request.</p>
+<p>Trước tiên, cài đặt LLVM 9.0 cung cấp clang-format phiên bản 9.0.0. Trang tải LLVM là:</p>
+<ul>
+<li><p><a href="http://releases.llvm.org/download.html#9.0.0">LLVM</a></p>
+<ul>
+<li><p>Trên Ubuntu</p>
+<pre><code class="hljs css language-sh">sudo apt-get install clang-format-9
+</code></pre></li>
+<li><p>Trên Windows. Tải gói pre-built và cài đặt</p></li>
+</ul></li>
+</ul>
+<p>Sau đó, cài cpplint, pylint và yapf</p>
+<ul>
+<li><p>Ubuntu or OSX:</p>
+<pre><code class="hljs"><span class="hljs-meta">$</span><span class="bash"> sudo pip install cpplint</span>
+<span class="hljs-meta">$</span><span class="bash"> <span class="hljs-built_in">which</span> cpplint</span>
+/path/to/cpplint
+<span class="hljs-meta">
+$</span><span class="bash"> pip install yapf==0.29.0</span>
+<span class="hljs-meta">$</span><span class="bash"> pip install pylint</span>
+</code></pre></li>
+<li><p>Windows: Cài Anaconda cho gói quản lý package management.</p>
+<pre><code class="hljs">$ pip <span class="hljs-keyword">install</span> cpplint
+$ <span class="hljs-keyword">where</span> cpplint
+C:/<span class="hljs-keyword">path</span>/<span class="hljs-keyword">to</span>/cpplint.exe
+
+$ pip <span class="hljs-keyword">install</span> yapf==<span class="hljs-number">0.29</span><span class="hljs-number">.0</span>
+$ pip <span class="hljs-keyword">install</span> pylint
+</code></pre></li>
+</ul>
+<h4><a class="anchor" aria-hidden="true" id="sử-dụng"></a><a href="#sử-dụng" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<ul>
+<li>Sau khi kích hoạt, linting sẽ tự động được áp dụng khi bạn chỉnh sửa các tập tin mã code nguồn (source code file). Lỗi và cảnh báo sẽ hiển thị trên thanh Visual Studio Code <code>PROBLEMS</code>.</li>
+<li>Định dạng mã code có thể thực hiện bằng cách sử dụng Command Palette(<code>Shift+Ctrl+P</code> cho
+Windows hay <code>Shift+Command+P</code> cho OSX) và gõ <code>Format Document</code>.</li>
+</ul>
+<h4><a class="anchor" aria-hidden="true" id="gửi"></a><a href="#gửi" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
+<p>Bạn cần phải chữa lỗi định dạng nếu có trước khi gửi đi pull requests.</p>
+<h2><a class="anchor" aria-hidden="true" id="tạo-environment"></a><a href="#tạo-environment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
+<p>Chúng tôi khuyến khích dùng Visual Studio Code để viết code. Có thể cài các Extensions như Python, C/C++,
+Code Spell Checker, autoDocstring, vim, Remote Development. Tham khảo cấu hình (vd., <code>settings.json</code>) của các extensions <a href="https://gist.github.com/nudles/3d23cfb6ffb30ca7636c45fe60278c55">tại đây</a>.</p>
+<p>Nếu bạn cập nhật mã code CPP, bạn cần recompile SINGA
+<a href="/docs/3.1.0_Viet/build">từ nguồn</a>. Nên sử dụng các công cụ cài đặt cơ bản trong <code>*-devel</code> Docker images hay <code>conda build</code>.</p>
+<p>Nếu bạn chỉ cập nhật mã code Python, bạn cần cài đặt SINGAS một lần, sau đó copy các tập tin Python cập nhật để thay thế chúng trong thư mục cài đặt Python,</p>
+<pre><code class="hljs css language-shell">cp python/singa/xx.py  &lt;path to conda&gt;/lib/python3.7/site-packages/singa/
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="trình-tự"></a><a href="#trình-tự" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p>Vui lòng tham khảo mục <a href="/docs/3.1.0_Viet/git-workflow">git workflow</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/build"><span class="arrow-prev">← </span><span>Build SINGA from Source</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/contribute-docs"><span>How to Contribute to Documentation</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#định-dạng-mã-code">Định dạng mã code</a></li><li><a href="#tạo-environm [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/contribute-docs.html b/content/docs/3.1.0_Viet/contribute-docs.html
new file mode 100644
index 0000000..bf5dc5a
--- /dev/null
+++ b/content/docs/3.1.0_Viet/contribute-docs.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Tham gia chỉnh sửa Hướng Dẫn Sử Dụng · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/contribute-docs.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Tham gia chỉnh sửa Hướng Dẫn Sử Dụng</h1></header><article><div><span><!-- Licensed to the Apache Software Foundation (ASF) unde [...]
+<p>Hướng Dẫn Sử Dụng có hai dạng, dạng tập tin markdown và dạng sử dụng API
+reference. Tài liệu này giới thiệu vài công cụ và chỉ dẫn trong việc chuẩn bị các tập tin nguồn markdown và chú thích API.</p>
+<p>Tập tin markdown sẽ được sử dụng trong việc tạo trang HTML qua <a href="https://docusaurus.io/">Docusaurus</a>; Chú thích API (từ nguồn mã code) sẽ được sử dụng để tạo các trang tham khảo API sử dụng Sphinx (cho Python) và Doxygen (cho CPP).</p>
+<h2><a class="anchor" aria-hidden="true" id="tập-tin-markdown"></a><a href="#tập-tin-markdown" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<p>Làm theo
+<a href="https://developers.google.com/style">định dạng Văn bản Google</a>. Ví dụ,</p>
+<ol>
+<li>Bỏ 'vui lòng' (please) khỏi bất cứ hướng dẫn sử dụng nào. 'Please click...' thành 'Click ...'.</li>
+<li>Làm theo
+<a href="https://owl.purdue.edu/owl/general_writing/mechanics/help_with_capitals.html">qui tắc viết hoa tiêu chuẩn</a>.</li>
+<li>Sử dụng 'bạn' thay cho 'chúng tôi' trong hướng dẫn.</li>
+<li>Sử dụng thì hiện tại và tránh sử dụng từ 'sẽ'</li>
+<li>Nên dùng dạng chủ động thay vì bị động</li>
+</ol>
+<p>Thêm vào đó, để cho nội dung hướng dẫn sủ dụng thống nhất,</p>
+<ol>
+<li>Viết câu ngắn, chẳng hạn độ dài &lt;=80</li>
+<li>Sử dụng đường dẫn liên quan, mặc định chúng ta đang ở thư mục root của repo,
+vd., <code>doc-site/docs</code> để chỉ <code>singa-doc/docs-site/docs</code></li>
+<li>Nhấn mạnh câu lệnh, đường dẫn, class, function và biến sử dụng backticks,
+vd., <code>Tensor</code>, <code>singa-doc/docs-site/docs</code>.</li>
+<li>Để nêu bật các điều khoản/khái niệm, sử dụng <em>graph</em> hoặc <strong>graph</strong></li>
+</ol>
+<p><a href="https://prettier.io/">Cộng cụ prettier</a> được sử dụng bởi dự án này sẽ tự làm định dạng code dựa trên
+<a href="https://github.com/apache/singa-doc/blob/master/docs-site/.prettierrc">cấu hình</a>
+khi thực hiện <code>git commit</code>. Ví dụ, nó sẽ gói chữ trong các tập tin markdown thành nhiều nhất 80 kí tự (trừ các dòng chú thích).</p>
+<p>Khi giới thiệu một khái niệm (concept) (vd., class <code>Tensor</code>), đưa ra khái quát chung (mục đích và mối quan hệ với các khái niệm khác), APIs và ví dụ. Google colab có thể được sử dụng để mô phỏng điều này.</p>
+<p>Tham khảo <a href="https://github.com/apache/singa-doc/tree/master/docs-site">trang</a>
+để biết thêm chi tiết về cách chỉnh sửa các tập tin markdown và xây dựng website.</p>
+<h2><a class="anchor" aria-hidden="true" id="tham-khảo-api"></a><a href="#tham-khảo-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<h3><a class="anchor" aria-hidden="true" id="cpp-api"></a><a href="#cpp-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<p>Thực hiện theo
+<a href="https://google.github.io/styleguide/cppguide.html#Comments">Mẫu chú thích của Google CPP</a>.</p>
+<p>Để tạo văn bản, chạy &quot;doxygen&quot; từ thư mục doc (khuyến khích Doxygen &gt;= 1.8)</p>
+<h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>Thực hiện theo
+<a href="http://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings">Mẫu Google Python DocString</a>.</p>
+<h2><a class="anchor" aria-hidden="true" id="visual-studio-code-vscode"></a><a href="#visual-studio-code-vscode" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<p>Nếu bạn sử dụng vscode để viết code, các plugins sau sẽ giúp ích.</p>
+<h3><a class="anchor" aria-hidden="true" id="docstring-snippet"></a><a href="#docstring-snippet" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p><a href="https://marketplace.visualstudio.com/items?itemName=njpwerner.autodocstring">autoDocstring</a>
+tạo docstring của functions, classes, v.v. Lựa chọn định dạng DocString
+to <code>google</code>.</p>
+<h3><a class="anchor" aria-hidden="true" id="kiểm-tra-lỗi-chính-tả"></a><a href="#kiểm-tra-lỗi-chính-tả" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
+<p><a href="https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker">Code Spell Checker</a>
+có thể được cơ cấu để kiểm tra chú thích trong mã code, hoặc các tập tin .md và .rst.</p>
+<p>Để kiểm tra lỗi chính tả cho các dòng chú thích trong code Python, thêm vào các snippet sau qua
+<code>File - Preferences - User Snippets - python.json</code></p>
+<pre><code class="hljs">&quot;cspell check&quot; : {
+&quot;prefix&quot;: &quot;cspell&quot;,
+&quot;body&quot;: [
+    &quot;# Chỉ dẫn kiểm tra lỗi chính tả cho các dòng chú thích trong code python và c/cpp&quot;,
+    &quot;# cSpell:includeRegExp #.* &quot;,
+    &quot;# cSpell:includeRegExp (\&quot;\&quot;\&quot;|''')[^\1]*\1&quot;,
+    &quot;# cSpell: CStyleComment&quot;,
+],
+&quot;description&quot;: &quot;# chỉ kiểm tra lỗi chính tả cho chú thích trong python&quot;
+}
+</code></pre>
+<p>Để kiểm tra lỗi chính tả cho các dòng chú thích trong code Cpp, thêm vào các snippet sau qua
+<code>File - Preferences - User Snippets - cpp.json</code></p>
+<pre><code class="hljs">&quot;cspell check&quot; : {
+&quot;prefix&quot;: &quot;cspell&quot;,
+&quot;body&quot;: [
+    &quot;// Chỉ dẫn kiểm tra lỗi chính tả cho các dòng chú thích trong code cpp&quot;,
+    &quot;// cSpell:includeRegExp CStyleComment&quot;,
+],
+&quot;description&quot;: &quot;# chỉ kiểm tra lỗi chính tả cho chú thích trong cpp&quot;
+}
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/contribute-code"><span class="arrow-prev">← </span><span>How to Contribute Code</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/how-to-release"><span>How to Prepare a Release</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#tập-tin-markdown">Tập Tin Markdown</a></li><li><a href="#tham-khảo-api">T [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/contribute-docs/index.html b/content/docs/3.1.0_Viet/contribute-docs/index.html
new file mode 100644
index 0000000..bf5dc5a
--- /dev/null
+++ b/content/docs/3.1.0_Viet/contribute-docs/index.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Tham gia chỉnh sửa Hướng Dẫn Sử Dụng · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/contribute-docs.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Tham gia chỉnh sửa Hướng Dẫn Sử Dụng</h1></header><article><div><span><!-- Licensed to the Apache Software Foundation (ASF) unde [...]
+<p>Hướng Dẫn Sử Dụng có hai dạng, dạng tập tin markdown và dạng sử dụng API
+reference. Tài liệu này giới thiệu vài công cụ và chỉ dẫn trong việc chuẩn bị các tập tin nguồn markdown và chú thích API.</p>
+<p>Tập tin markdown sẽ được sử dụng trong việc tạo trang HTML qua <a href="https://docusaurus.io/">Docusaurus</a>; Chú thích API (từ nguồn mã code) sẽ được sử dụng để tạo các trang tham khảo API sử dụng Sphinx (cho Python) và Doxygen (cho CPP).</p>
+<h2><a class="anchor" aria-hidden="true" id="tập-tin-markdown"></a><a href="#tập-tin-markdown" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<p>Làm theo
+<a href="https://developers.google.com/style">định dạng Văn bản Google</a>. Ví dụ,</p>
+<ol>
+<li>Bỏ 'vui lòng' (please) khỏi bất cứ hướng dẫn sử dụng nào. 'Please click...' thành 'Click ...'.</li>
+<li>Làm theo
+<a href="https://owl.purdue.edu/owl/general_writing/mechanics/help_with_capitals.html">qui tắc viết hoa tiêu chuẩn</a>.</li>
+<li>Sử dụng 'bạn' thay cho 'chúng tôi' trong hướng dẫn.</li>
+<li>Sử dụng thì hiện tại và tránh sử dụng từ 'sẽ'</li>
+<li>Nên dùng dạng chủ động thay vì bị động</li>
+</ol>
+<p>Thêm vào đó, để cho nội dung hướng dẫn sủ dụng thống nhất,</p>
+<ol>
+<li>Viết câu ngắn, chẳng hạn độ dài &lt;=80</li>
+<li>Sử dụng đường dẫn liên quan, mặc định chúng ta đang ở thư mục root của repo,
+vd., <code>doc-site/docs</code> để chỉ <code>singa-doc/docs-site/docs</code></li>
+<li>Nhấn mạnh câu lệnh, đường dẫn, class, function và biến sử dụng backticks,
+vd., <code>Tensor</code>, <code>singa-doc/docs-site/docs</code>.</li>
+<li>Để nêu bật các điều khoản/khái niệm, sử dụng <em>graph</em> hoặc <strong>graph</strong></li>
+</ol>
+<p><a href="https://prettier.io/">Cộng cụ prettier</a> được sử dụng bởi dự án này sẽ tự làm định dạng code dựa trên
+<a href="https://github.com/apache/singa-doc/blob/master/docs-site/.prettierrc">cấu hình</a>
+khi thực hiện <code>git commit</code>. Ví dụ, nó sẽ gói chữ trong các tập tin markdown thành nhiều nhất 80 kí tự (trừ các dòng chú thích).</p>
+<p>Khi giới thiệu một khái niệm (concept) (vd., class <code>Tensor</code>), đưa ra khái quát chung (mục đích và mối quan hệ với các khái niệm khác), APIs và ví dụ. Google colab có thể được sử dụng để mô phỏng điều này.</p>
+<p>Tham khảo <a href="https://github.com/apache/singa-doc/tree/master/docs-site">trang</a>
+để biết thêm chi tiết về cách chỉnh sửa các tập tin markdown và xây dựng website.</p>
+<h2><a class="anchor" aria-hidden="true" id="tham-khảo-api"></a><a href="#tham-khảo-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<h3><a class="anchor" aria-hidden="true" id="cpp-api"></a><a href="#cpp-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<p>Thực hiện theo
+<a href="https://google.github.io/styleguide/cppguide.html#Comments">Mẫu chú thích của Google CPP</a>.</p>
+<p>Để tạo văn bản, chạy &quot;doxygen&quot; từ thư mục doc (khuyến khích Doxygen &gt;= 1.8)</p>
+<h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>Thực hiện theo
+<a href="http://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings">Mẫu Google Python DocString</a>.</p>
+<h2><a class="anchor" aria-hidden="true" id="visual-studio-code-vscode"></a><a href="#visual-studio-code-vscode" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<p>Nếu bạn sử dụng vscode để viết code, các plugins sau sẽ giúp ích.</p>
+<h3><a class="anchor" aria-hidden="true" id="docstring-snippet"></a><a href="#docstring-snippet" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p><a href="https://marketplace.visualstudio.com/items?itemName=njpwerner.autodocstring">autoDocstring</a>
+tạo docstring của functions, classes, v.v. Lựa chọn định dạng DocString
+to <code>google</code>.</p>
+<h3><a class="anchor" aria-hidden="true" id="kiểm-tra-lỗi-chính-tả"></a><a href="#kiểm-tra-lỗi-chính-tả" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
+<p><a href="https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker">Code Spell Checker</a>
+có thể được cơ cấu để kiểm tra chú thích trong mã code, hoặc các tập tin .md và .rst.</p>
+<p>Để kiểm tra lỗi chính tả cho các dòng chú thích trong code Python, thêm vào các snippet sau qua
+<code>File - Preferences - User Snippets - python.json</code></p>
+<pre><code class="hljs">&quot;cspell check&quot; : {
+&quot;prefix&quot;: &quot;cspell&quot;,
+&quot;body&quot;: [
+    &quot;# Chỉ dẫn kiểm tra lỗi chính tả cho các dòng chú thích trong code python và c/cpp&quot;,
+    &quot;# cSpell:includeRegExp #.* &quot;,
+    &quot;# cSpell:includeRegExp (\&quot;\&quot;\&quot;|''')[^\1]*\1&quot;,
+    &quot;# cSpell: CStyleComment&quot;,
+],
+&quot;description&quot;: &quot;# chỉ kiểm tra lỗi chính tả cho chú thích trong python&quot;
+}
+</code></pre>
+<p>Để kiểm tra lỗi chính tả cho các dòng chú thích trong code Cpp, thêm vào các snippet sau qua
+<code>File - Preferences - User Snippets - cpp.json</code></p>
+<pre><code class="hljs">&quot;cspell check&quot; : {
+&quot;prefix&quot;: &quot;cspell&quot;,
+&quot;body&quot;: [
+    &quot;// Chỉ dẫn kiểm tra lỗi chính tả cho các dòng chú thích trong code cpp&quot;,
+    &quot;// cSpell:includeRegExp CStyleComment&quot;,
+],
+&quot;description&quot;: &quot;# chỉ kiểm tra lỗi chính tả cho chú thích trong cpp&quot;
+}
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/contribute-code"><span class="arrow-prev">← </span><span>How to Contribute Code</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/how-to-release"><span>How to Prepare a Release</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#tập-tin-markdown">Tập Tin Markdown</a></li><li><a href="#tham-khảo-api">T [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/device.html b/content/docs/3.1.0_Viet/device.html
new file mode 100644
index 0000000..342dd28
--- /dev/null
+++ b/content/docs/3.1.0_Viet/device.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Device · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright ownershi [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/device.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Device</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agre [...]
+<p>Device dùng ở đây nghĩa là thiết bị phần cứng với bộ nhớ và các bộ phận máy tính. Tất cả <a href="./tensor">Tensor operations</a> được sắp xếp bởi các thiết bị resident device
+khi chạy. Bộ nhớ của Tensor luôn luôn được quản lý bởi memory manager của thiết bị đó. Bởi vậy việc tận dụng tối đa bộ nhớ và thực hiện được tiến hành tại Device class.</p>
+<h2><a class="anchor" aria-hidden="true" id="các-thiết-bị-cụ-thể"></a><a href="#các-thiết-bị-cụ-thể" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>Hiện tại, SINGA được chạy trên ba Device,</p>
+<ol>
+<li>CudaGPU cho cạc Nvidia GPU card chạy code Cuda</li>
+<li>CppCPU cho CPU chạy Cpp code</li>
+<li>OpenclGPU cho cạc GPU chạy OpenCL code</li>
+</ol>
+<h2><a class="anchor" aria-hidden="true" id="ví-dụ-sử-dụng"></a><a href="#ví-dụ-sử-dụng" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>Code dưới đây là ví dụ về việc tạo device:</p>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> device
+cuda = device.create_cuda_gpu_on(<span class="hljs-number">0</span>)  <span class="hljs-comment"># sử dụng cạc GPU với ID 0</span>
+host = device.get_default_device()  <span class="hljs-comment"># tạo host mặc định cho device (CppCPU)</span>
+ary1 = device.create_cuda_gpus(<span class="hljs-number">2</span>)  <span class="hljs-comment"># tạo 2 devices, bắt đầu từ ID 0</span>
+ary2 = device.create_cuda_gpus([<span class="hljs-number">0</span>,<span class="hljs-number">2</span>])  <span class="hljs-comment"># tạo 2 devices với ID 0 và 2</span>
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/examples"><span class="arrow-prev">← </span><span>Examples</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/tensor"><span>Tensor</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#các-thiết-bị-cụ-thể">Các thiết bị cụ thể</a></li><li><a href="#ví-dụ-sử-dụng">Ví Dụ Sử Dụng</a></li></ul></nav></div><fo [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/device/index.html b/content/docs/3.1.0_Viet/device/index.html
new file mode 100644
index 0000000..342dd28
--- /dev/null
+++ b/content/docs/3.1.0_Viet/device/index.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Device · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright ownershi [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/device.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Device</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agre [...]
+<p>Device dùng ở đây nghĩa là thiết bị phần cứng với bộ nhớ và các bộ phận máy tính. Tất cả <a href="./tensor">Tensor operations</a> được sắp xếp bởi các thiết bị resident device
+khi chạy. Bộ nhớ của Tensor luôn luôn được quản lý bởi memory manager của thiết bị đó. Bởi vậy việc tận dụng tối đa bộ nhớ và thực hiện được tiến hành tại Device class.</p>
+<h2><a class="anchor" aria-hidden="true" id="các-thiết-bị-cụ-thể"></a><a href="#các-thiết-bị-cụ-thể" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>Hiện tại, SINGA được chạy trên ba Device,</p>
+<ol>
+<li>CudaGPU cho cạc Nvidia GPU card chạy code Cuda</li>
+<li>CppCPU cho CPU chạy Cpp code</li>
+<li>OpenclGPU cho cạc GPU chạy OpenCL code</li>
+</ol>
+<h2><a class="anchor" aria-hidden="true" id="ví-dụ-sử-dụng"></a><a href="#ví-dụ-sử-dụng" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>Code dưới đây là ví dụ về việc tạo device:</p>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> device
+cuda = device.create_cuda_gpu_on(<span class="hljs-number">0</span>)  <span class="hljs-comment"># sử dụng cạc GPU với ID 0</span>
+host = device.get_default_device()  <span class="hljs-comment"># tạo host mặc định cho device (CppCPU)</span>
+ary1 = device.create_cuda_gpus(<span class="hljs-number">2</span>)  <span class="hljs-comment"># tạo 2 devices, bắt đầu từ ID 0</span>
+ary2 = device.create_cuda_gpus([<span class="hljs-number">0</span>,<span class="hljs-number">2</span>])  <span class="hljs-comment"># tạo 2 devices với ID 0 và 2</span>
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/examples"><span class="arrow-prev">← </span><span>Examples</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/tensor"><span>Tensor</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#các-thiết-bị-cụ-thể">Các thiết bị cụ thể</a></li><li><a href="#ví-dụ-sử-dụng">Ví Dụ Sử Dụng</a></li></ul></nav></div><fo [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/dist-train.html b/content/docs/3.1.0_Viet/dist-train.html
new file mode 100644
index 0000000..2597f49
--- /dev/null
+++ b/content/docs/3.1.0_Viet/dist-train.html
@@ -0,0 +1,395 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Distributed Training · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copy [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/dist-train.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Distributed Training</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contri [...]
+<p>SINGA hỗ trợ data parallel training trên nhiều GPUs (trên một node hoặc nhiều node khác nhau). Sơ đồ sau mô phỏng data parallel training:</p>
+<p><img src="/docs/assets/MPI.png" alt="MPI.png"></p>
+<p>Trong distributed training, mỗi chỉ lệnh (gọi là worker) chạy một training script trên một máy GPU. Mỗi chỉ lệnh (process) có một communication rank riêng. Dữ liệu để training được phân cho các worker và model thì được sao chép cho mỗi worker. Ở mỗi vòng, worker đọc một mini-batch dữ liệu (vd.,
+256 hình ảnh) từ phần được chia và chạy thuật toán BackPropagation để tính ra độ dốc (gradient) của weight, được lấy trung bình qua all-reduce (cung cấp bởi <a href="https://developer.nvidia.com/nccl">NCCL</a>)
+để cập nhật weight theo thuật toán
+stochastic gradient descent (SGD).</p>
+<p>Hàm all-reduce operation bởi NCCL có thể được sử dụng để giảm và đồng bộ hoá độ dốc từ các máy GPU các nhau. Xem thử training với 4 GPUs như dưới đây. Sau khi độ dốc (gradients) từ 4 GPUs được tính, all-reduce sẽ trả lại tổng độ dốc (gradient) cho các GPU và đưa tới mỗi GPU. Sau đó có thể dễ dàng tính ra độ dốc trung bình.</p>
+<p><img src="/docs/assets/AllReduce.png" alt="AllReduce.png"></p>
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng"></a><a href="#sử-dụng" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<p>SINGA áp dụng một module gọi là <code>DistOpt</code> (là dạng con của <code>Opt</code>) cho distributed
+training. Nó gói lại normal SGD optimizer và gọi  <code>Communicator</code> để động bộ hoá độ dốc. Ví dụ sau mô phỏng cách sử dụng <code>DistOpt</code> để
+training một CNN model với dữ liệu MNIST. Nguồn code có thể tìm
+<a href="https://github.com/apache/singa/blob/master/examples/cnn/">tại đây</a>, và <a href="">Colab notebook</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="code-ví-dụ"></a><a href="#code-ví-dụ" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<ol>
+<li>Định nghĩa neural network model:</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CNN</span><span class="hljs-params">(model.Model)</span>:</span>
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, num_classes=<span class="hljs-number">10</span>, num_channels=<span class="hljs-number">1</span>)</span>:</span>
+        super(CNN, self).__init__()
+        self.conv1 = layer.Conv2d(num_channels, <span class="hljs-number">20</span>, <span class="hljs-number">5</span>, padding=<span class="hljs-number">0</span>, activation=<span class="hljs-string">"RELU"</span>)
+        self.conv2 = layer.Conv2d(<span class="hljs-number">20</span>, <span class="hljs-number">50</span>, <span class="hljs-number">5</span>, padding=<span class="hljs-number">0</span>, activation=<span class="hljs-string">"RELU"</span>)
+        self.linear1 = layer.Linear(<span class="hljs-number">500</span>)
+        self.linear2 = layer.Linear(num_classes)
+        self.pooling1 = layer.MaxPool2d(<span class="hljs-number">2</span>, <span class="hljs-number">2</span>, padding=<span class="hljs-number">0</span>)
+        self.pooling2 = layer.MaxPool2d(<span class="hljs-number">2</span>, <span class="hljs-number">2</span>, padding=<span class="hljs-number">0</span>)
+        self.relu = layer.ReLU()
+        self.flatten = layer.Flatten()
+        self.softmax_cross_entropy = layer.SoftMaxCrossEntropy()
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(self, x)</span>:</span>
+        y = self.conv1(x)
+        y = self.pooling1(y)
+        y = self.conv2(y)
+        y = self.pooling2(y)
+        y = self.flatten(y)
+        y = self.linear1(y)
+        y = self.relu(y)
+        y = self.linear2(y)
+        <span class="hljs-keyword">return</span> y
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">train_one_batch</span><span class="hljs-params">(self, x, y, dist_option=<span class="hljs-string">'fp32'</span>, spars=<span class="hljs-number">0</span>)</span>:</span>
+        out = self.forward(x)
+        loss = self.softmax_cross_entropy(out, y)
+
+        <span class="hljs-comment"># cho phép nhiều lựa chọn dùng trong distributed training</span>
+        <span class="hljs-comment"># Tham khảo mục "Optimizations về Distributed Training"</span>
+        <span class="hljs-keyword">if</span> dist_option == <span class="hljs-string">'fp32'</span>:
+            self.optimizer(loss)
+        <span class="hljs-keyword">elif</span> dist_option == <span class="hljs-string">'fp16'</span>:
+            self.optimizer.backward_and_update_half(loss)
+        <span class="hljs-keyword">elif</span> dist_option == <span class="hljs-string">'partialUpdate'</span>:
+            self.optimizer.backward_and_partial_update(loss)
+        <span class="hljs-keyword">elif</span> dist_option == <span class="hljs-string">'sparseTopK'</span>:
+            self.optimizer.backward_and_sparse_update(loss,
+                                                      topK=<span class="hljs-literal">True</span>,
+                                                      spars=spars)
+        <span class="hljs-keyword">elif</span> dist_option == <span class="hljs-string">'sparseThreshold'</span>:
+            self.optimizer.backward_and_sparse_update(loss,
+                                                      topK=<span class="hljs-literal">False</span>,
+                                                      spars=spars)
+        <span class="hljs-keyword">return</span> out, loss
+
+<span class="hljs-comment"># tạo model</span>
+model = CNN()
+</code></pre>
+<ol start="2">
+<li>Tạo <code>DistOpt</code> instance và đính nó vào model đã tạo:</li>
+</ol>
+<pre><code class="hljs css language-python">sgd = opt.SGD(lr=<span class="hljs-number">0.005</span>, momentum=<span class="hljs-number">0.9</span>, weight_decay=<span class="hljs-number">1e-5</span>)
+sgd = opt.DistOpt(sgd)
+model.set_optimizer(sgd)
+dev = device.create_cuda_gpu_on(sgd.local_rank)
+</code></pre>
+<p>Đây là giải thích cho các biến sử dụng trong code:</p>
+<p>(i) <code>dev</code></p>
+<p>dev dùng để chỉ <code>Device</code> instance, nơi tải dữ liệu và chạy CNN model.</p>
+<p>(ii)<code>local_rank</code></p>
+<p>Local rank chỉ số GPU mà chỉ lệnh (process) hiện tại đang sử dụng trên cùng một node. Ví dụ, nếu bạn đang sử dụng một node có 2 GPUs, <code>local_rank=0</code> nghĩa là chỉ lệnh này đang sử dụng máy GPU đầu tiên, trong khi  <code>local_rank=1</code> nghĩa là đang sử dụng máy GPU thứ hai. Sử dụng MPI hay đa xử lý, bạn có thể chạy cùng một tập lệnh training chỉ khác giá trị của <code>local_rank</code>.</p>
+<p>(iii)<code>global_rank</code></p>
+<p>Rank trong global biểu thị global rank cho tất cả các chỉ lệnh (process) trong các nodes mà bạn đang sử dụng. Lấy ví dụ trường hợp bạn có 3 nodes và mỗi một node có hai GPUs, <code>global_rank=0</code> nghĩa là chỉ lệnh đang sử dụng máy GPU đầu tiên ở node đầu tiên, <code>global_rank=2</code> nghĩa là chỉ lệnh đang sử dụng máy GPU đầu tiên ở node thứ 2, và <code>global_rank=4</code> nghĩa là chỉ lệnh đang sử dụng máy GPU đầu tiên ở node thứ 3.</p>
+<ol start="3">
+<li>Tải và phân chia dữ liệu để training/validation</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">data_partition</span><span class="hljs-params">(dataset_x, dataset_y, global_rank, world_size)</span>:</span>
+    data_per_rank = dataset_x.shape[<span class="hljs-number">0</span>] // world_size
+    idx_start = global_rank * data_per_rank
+    idx_end = (global_rank + <span class="hljs-number">1</span>) * data_per_rank
+    <span class="hljs-keyword">return</span> dataset_x[idx_start:idx_end], dataset_y[idx_start:idx_end]
+
+train_x, train_y, test_x, test_y = load_dataset()
+train_x, train_y = data_partition(train_x, train_y,
+                                  sgd.global_rank, sgd.world_size)
+test_x, test_y = data_partition(test_x, test_y,
+                                sgd.global_rank, sgd.world_size)
+</code></pre>
+<p>Một phần của bộ dữ liệu (dataset) được trả lại cho <code>dev</code>.</p>
+<p>Tại đây, <code>world_size</code> thể hiện tổng số chỉ lệnh trong tất cả các node mà bạn đang sử dụng cho distributed training.</p>
+<ol start="4">
+<li>Khởi tạo và đồng bộ các tham số của model cho tất cả workers:</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-comment"># Đồng bộ tham số ban đầu </span>
+tx = tensor.Tensor((batch_size, <span class="hljs-number">1</span>, IMG_SIZE, IMG_SIZE), dev, tensor.float32)
+ty = tensor.Tensor((batch_size, num_classes), dev, tensor.int32)
+model.compile([tx], is_train=<span class="hljs-literal">True</span>, use_graph=graph, sequential=<span class="hljs-literal">True</span>)
+...
+<span class="hljs-comment"># Sử dụng cùng một random seed cho các ranks khác nhau</span>
+seed = <span class="hljs-number">0</span>
+dev.SetRandSeed(seed)
+np.random.seed(seed)
+</code></pre>
+<ol start="5">
+<li>Chạy BackPropagation và distributed SGD</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">for</span> epoch <span class="hljs-keyword">in</span> range(max_epoch):
+    <span class="hljs-keyword">for</span> b <span class="hljs-keyword">in</span> range(num_train_batch):
+        x = train_x[idx[b * batch_size: (b + <span class="hljs-number">1</span>) * batch_size]]
+        y = train_y[idx[b * batch_size: (b + <span class="hljs-number">1</span>) * batch_size]]
+        tx.copy_from_numpy(x)
+        ty.copy_from_numpy(y)
+        <span class="hljs-comment"># Train the model</span>
+        out, loss = model(tx, ty)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="hướng-dẫn-thực-hiện"></a><a href="#hướng-dẫn-thực-hiện" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>Có hai cách để bắt đầu quá trình training: MPI hoặc Python đa xử lý.</p>
+<h4><a class="anchor" aria-hidden="true" id="python-đa-xử-lý"></a><a href="#python-đa-xử-lý" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
+<p>Chạy trên một node với nhiều GPUs, trong đó mỗi GPU là một worker.</p>
+<ol>
+<li>Đặt tất cả các training codes trong cùng một hàm (function)</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">train_mnist_cnn</span><span class="hljs-params">(nccl_id=None, local_rank=None, world_size=None)</span>:</span>
+    ...
+</code></pre>
+<ol start="2">
+<li>Tạo <code>mnist_multiprocess.py</code></li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">'__main__'</span>:
+    <span class="hljs-comment"># Generate a NCCL ID to be used for collective communication</span>
+    nccl_id = singa.NcclIdHolder()
+
+    <span class="hljs-comment"># Define the number of GPUs to be used in the training process</span>
+    world_size = int(sys.argv[<span class="hljs-number">1</span>])
+
+    <span class="hljs-comment"># Define and launch the multi-processing</span>
+    <span class="hljs-keyword">import</span> multiprocessing
+    process = []
+    <span class="hljs-keyword">for</span> local_rank <span class="hljs-keyword">in</span> range(<span class="hljs-number">0</span>, world_size):
+        process.append(multiprocessing.Process(target=train_mnist_cnn,
+                       args=(nccl_id, local_rank, world_size)))
+
+    <span class="hljs-keyword">for</span> p <span class="hljs-keyword">in</span> process:
+        p.start()
+</code></pre>
+<p>Dưới đây là giải thích cho các biến tạo ở trên:</p>
+<p>(i) <code>nccl_id</code></p>
+<p>Lưu ý rằng chúng ta cần phải tạo một NCCL ID ở đây để sử dụng cho collective
+communication, sau đó gửi nó tới tất cả các chỉ lệnh. NCCL ID giống như là vé vào cửa, khi chỉ có chỉ lệnh với ID này có thể tham gia vào quá trình all-reduce.
+(Về sua nếu dùng MPI, thì việc sử dụng NCCL ID là không cần thiết, bởi vì ID được gửi đi bởi MPI trong code của chúng tôi một cách tự động)</p>
+<p>(ii) <code>world_size</code></p>
+<p>world_size là số lượng máy GPUs bạn muốn sử dụng cho training.</p>
+<p>(iii) <code>local_rank</code></p>
+<p>local_rank xác định local rank của distributed training và máy gpu được sử dụng trong chỉ lệnh. Trong code bên trên, for loop được sử dụng để chạy hàm train function, và local_rank chạy vòng từ 0 tới world_size. Trong trường hợp này, chỉ lệnh khác nhau có thể sử dụng máy GPUs khác nhau để training.</p>
+<p>Tham số để tạo <code>DistOpt</code> instance cần được cập nhật như sau:</p>
+<pre><code class="hljs css language-python">sgd = opt.DistOpt(sgd, nccl_id=nccl_id, local_rank=local_rank, world_size=world_size)
+</code></pre>
+<ol start="3">
+<li>Chạy <code>mnist_multiprocess.py</code></li>
+</ol>
+<pre><code class="hljs css language-sh">python mnist_multiprocess.py 2
+</code></pre>
+<p>Kết qủa hiển thị tốc độ so với training trên một máy GPU.</p>
+<pre><code class="hljs">Starting Epoch <span class="hljs-number">0</span>:
+Training loss = <span class="hljs-number">408.909790</span>, training accuracy = <span class="hljs-number">0.880475</span>
+Evaluation accuracy = <span class="hljs-number">0.956430</span>
+Starting Epoch <span class="hljs-number">1</span>:
+Training loss = <span class="hljs-number">102.396790</span>, training accuracy = <span class="hljs-number">0.967415</span>
+Evaluation accuracy = <span class="hljs-number">0.977564</span>
+Starting Epoch <span class="hljs-number">2</span>:
+Training loss = <span class="hljs-number">69.217010</span>, training accuracy = <span class="hljs-number">0.977915</span>
+Evaluation accuracy = <span class="hljs-number">0.981370</span>
+Starting Epoch <span class="hljs-number">3</span>:
+Training loss = <span class="hljs-number">54.248390</span>, training accuracy = <span class="hljs-number">0.982823</span>
+Evaluation accuracy = <span class="hljs-number">0.984075</span>
+Starting Epoch <span class="hljs-number">4</span>:
+Training loss = <span class="hljs-number">45.213406</span>, training accuracy = <span class="hljs-number">0.985560</span>
+Evaluation accuracy = <span class="hljs-number">0.985276</span>
+Starting Epoch <span class="hljs-number">5</span>:
+Training loss = <span class="hljs-number">38.868435</span>, training accuracy = <span class="hljs-number">0.987764</span>
+Evaluation accuracy = <span class="hljs-number">0.986278</span>
+Starting Epoch <span class="hljs-number">6</span>:
+Training loss = <span class="hljs-number">34.078186</span>, training accuracy = <span class="hljs-number">0.989149</span>
+Evaluation accuracy = <span class="hljs-number">0.987881</span>
+Starting Epoch <span class="hljs-number">7</span>:
+Training loss = <span class="hljs-number">30.138697</span>, training accuracy = <span class="hljs-number">0.990451</span>
+Evaluation accuracy = <span class="hljs-number">0.988181</span>
+Starting Epoch <span class="hljs-number">8</span>:
+Training loss = <span class="hljs-number">26.854443</span>, training accuracy = <span class="hljs-number">0.991520</span>
+Evaluation accuracy = <span class="hljs-number">0.988682</span>
+Starting Epoch <span class="hljs-number">9</span>:
+Training loss = <span class="hljs-number">24.039650</span>, training accuracy = <span class="hljs-number">0.992405</span>
+Evaluation accuracy = <span class="hljs-number">0.989083</span>
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="mpi"></a><a href="#mpi" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
+<p>Có thể dùng cho cả một node và nhiều node miễn là có nhiều máy GPUs.</p>
+<ol>
+<li>Tạo <code>mnist_dist.py</code></li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">'__main__'</span>:
+    train_mnist_cnn()
+</code></pre>
+<ol start="2">
+<li>Tạo một hostfile cho MPI, vd. hostfile dưới đây sử dụng 2 chỉ lệnh (vd.,
+2 GPUs) trên một node</li>
+</ol>
+<pre><code class="hljs css language-txt">localhost:<span class="hljs-number">2</span>
+</code></pre>
+<ol start="3">
+<li>Khởi động quá trình training qua <code>mpiexec</code></li>
+</ol>
+<pre><code class="hljs css language-sh">mpiexec --hostfile host_file python mnist_dist.py
+</code></pre>
+<p>Kết qủa có thể hiển thị tốc độ so với training trên một máy GPU.</p>
+<pre><code class="hljs">Starting Epoch <span class="hljs-number">0</span>:
+Training loss = <span class="hljs-number">383.969543</span>, training accuracy = <span class="hljs-number">0.886402</span>
+Evaluation accuracy = <span class="hljs-number">0.954327</span>
+Starting Epoch <span class="hljs-number">1</span>:
+Training loss = <span class="hljs-number">97.531479</span>, training accuracy = <span class="hljs-number">0.969451</span>
+Evaluation accuracy = <span class="hljs-number">0.977163</span>
+Starting Epoch <span class="hljs-number">2</span>:
+Training loss = <span class="hljs-number">67.166870</span>, training accuracy = <span class="hljs-number">0.978516</span>
+Evaluation accuracy = <span class="hljs-number">0.980769</span>
+Starting Epoch <span class="hljs-number">3</span>:
+Training loss = <span class="hljs-number">53.369656</span>, training accuracy = <span class="hljs-number">0.983040</span>
+Evaluation accuracy = <span class="hljs-number">0.983974</span>
+Starting Epoch <span class="hljs-number">4</span>:
+Training loss = <span class="hljs-number">45.100403</span>, training accuracy = <span class="hljs-number">0.985777</span>
+Evaluation accuracy = <span class="hljs-number">0.986078</span>
+Starting Epoch <span class="hljs-number">5</span>:
+Training loss = <span class="hljs-number">39.330826</span>, training accuracy = <span class="hljs-number">0.987447</span>
+Evaluation accuracy = <span class="hljs-number">0.987179</span>
+Starting Epoch <span class="hljs-number">6</span>:
+Training loss = <span class="hljs-number">34.655270</span>, training accuracy = <span class="hljs-number">0.988799</span>
+Evaluation accuracy = <span class="hljs-number">0.987780</span>
+Starting Epoch <span class="hljs-number">7</span>:
+Training loss = <span class="hljs-number">30.749735</span>, training accuracy = <span class="hljs-number">0.989984</span>
+Evaluation accuracy = <span class="hljs-number">0.988281</span>
+Starting Epoch <span class="hljs-number">8</span>:
+Training loss = <span class="hljs-number">27.422146</span>, training accuracy = <span class="hljs-number">0.991319</span>
+Evaluation accuracy = <span class="hljs-number">0.988582</span>
+Starting Epoch <span class="hljs-number">9</span>:
+Training loss = <span class="hljs-number">24.548153</span>, training accuracy = <span class="hljs-number">0.992171</span>
+Evaluation accuracy = <span class="hljs-number">0.988682</span>
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="tối-ưu-hoá-distributed-training"></a><a href="#tối-ưu-hoá-distributed-training" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
+<p>SINGA cung cấp chiến lược đa tối ưu hoá cho distributed training để giảm communication cost. Tham khảo API của <code>DistOpt</code> cho cấu hình của mỗi cách.</p>
+<p>Khi sử dụng <code>model.Model</code> để tạo một model, cần phải đặt các lựa chọn cho
+distributed training trong phương pháp <code>train_one_batch</code>. Tham khảo code ví dụ trên đầu trang. Bạn có thể chỉ cần copy code cho các lựa chọn và sử dụng nó cho các model khác.
+Với các lựa chọn xác định, ta có thể đặt tham số<code>dist_option</code> và <code>spars</code> khi bắt đầu training với  <code>model(tx, ty, dist_option, spars)</code></p>
+<h3><a class="anchor" aria-hidden="true" id="không-tối-ưu-hoá"></a><a href="#không-tối-ưu-hoá" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<pre><code class="hljs css language-python">out, loss = model(tx, ty)
+</code></pre>
+<p><code>loss</code> là output tensor từ hàm loss function, vd., cross-entropy cho
+classification tasks.</p>
+<h3><a class="anchor" aria-hidden="true" id="half-precision-gradients"></a><a href="#half-precision-gradients" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
+<pre><code class="hljs css language-python">out, loss = model(tx, ty, dist_option = <span class="hljs-string">'fp16'</span>)
+</code></pre>
+<p>Chuyển đổi gía trị độ dốc sang hiển thị dạng 16-bit (vd., half-precision) trước khi gọi hàm all-reduce.</p>
+<h3><a class="anchor" aria-hidden="true" id="đồng-bộ-cục-bộ-partial-synchronization"></a><a href="#đồng-bộ-cục-bộ-partial-synchronization" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1. [...]
+<pre><code class="hljs css language-python">out, loss = model(tx, ty, dist_option = <span class="hljs-string">'partialUpdate'</span>)
+</code></pre>
+<p>Ở mỗi vòng lặp (iteration), mỗi rank thực hiện việc cập nhật sgd. Sau đó chỉ một nhóm tham số là được tính trung bình để đồng bộ hoá. Điều này giúp tiết kiệm communication cost.
+Độ lớn của nhóm này được xác định khi tạo hàm <code>DistOpt</code> instance.</p>
+<h3><a class="anchor" aria-hidden="true" id="phân-bổ-độ-dốc-gradient-sparsification"></a><a href="#phân-bổ-độ-dốc-gradient-sparsification" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1. [...]
+<p>Kế hoạch phân bổ để chọn ra một nhóm nhỏ độ dốc nhằm thực hiện all-reduce. Có hai cách:</p>
+<ul>
+<li>Chọn K phần tử lớn nhất. spars là một phần (0 - 1) của tổng số phần tử được chọn.</li>
+</ul>
+<pre><code class="hljs css language-python">out, loss = model(tx, ty, dist_option = <span class="hljs-string">'sparseTopK'</span>, spars = spars)
+</code></pre>
+<ul>
+<li>Tất cả độ dốc có giá trị tuyệt đối lớn hơn ngưỡng spars đặt trước được lựa chọn.</li>
+</ul>
+<pre><code class="hljs css language-python">out, loss = model(tx, ty, dist_option = <span class="hljs-string">'sparseThreshold'</span>, spars = spars)
+</code></pre>
+<p>Các hyper-parameter được cấu tạo khi tạo hàm <code>DistOpt</code> instance.</p>
+<h2><a class="anchor" aria-hidden="true" id="thực-hiện"></a><a href="#thực-hiện" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
+<p>Mục này chủ yếu dành cho các lập trình viên (developer) muốn biết lập trình trong
+distribute module được thực hiện như thế nào.</p>
+<h3><a class="anchor" aria-hidden="true" id="giao-diện-c-cho-bộ-chuyển-mạch-communicator-nccl"></a><a href="#giao-diện-c-cho-bộ-chuyển-mạch-communicator-nccl" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9z [...]
+<p>Trước tiên, communication layer được lập trình bằng ngôn ngữ C
+<a href="https://github.com/apache/singa/blob/master/src/io/communicator.cc">communicator.cc</a>.
+Nó áp dụng NCCL library cho collective communication.</p>
+<p>Có hai hàm tạo nên communicator, một cho MPI và một cho đa phương thức (multiprocess).</p>
+<p>(i) Hàm tạo sử dụng MPI</p>
+<p>Hàm tạo bước đầu sẽ sử dụng global rank và world size, sau đó tính toán ra local rank. Tiếp theo, rank 0 sẽ tạo ra NCCL ID và phát nó lên mỗi rank. Sau đó, nó gọi hàm setup để khởi tạo NCCL
+communicator, cuda streams, và buffers.</p>
+<p>(ii) Hàm tạo sử dụng Python đa phương thức</p>
+<p>Hàm tạo bước đầu sẽ sử dụng rank, world size, và NCCL ID từ input argument. Sau đó, nó gọi hàm setup function để khởi tạo NCCL communicator, cuda streams, và buffers.</p>
+<p>Sau khi khởi động, nó thực hiện chức năng all-reduce để đồng bộ hoá các tham số model và độ dốc. Ví dụ, synch sử dụng một input tensor và tiến hành all-reduce qua đoạn chương trình NCCL. Sau khi gọi synch, cần gọi hàm wait để đợi hàm all-reduce operation kết thúc.</p>
+<h3><a class="anchor" aria-hidden="true" id="giao-diện-python-của-distopt"></a><a href="#giao-diện-python-của-distopt" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 [...]
+<p>Sau đó, giao diện python sẽ tạo ra một
+<a href="https://github.com/apache/singa/blob/master/python/singa/opt.py">DistOpt</a> class để gói một
+<a href="https://github.com/apache/singa/blob/master/python/singa/opt.py">optimizer</a>
+object để thực hiện distributed training dựa trên MPI hoặc đa xử lý. Trong khi khởi động, nó tạo ra một NCCL communicator object (từ giao diện C đề cập ở mục nhỏ phía trên). Sau đó, communicator object này được sử dụng trong mỗi hàm all-reduce trong DistOpt.</p>
+<p>Trong MPI hoặc đa xử lý, mỗi chỉ lệnh có một rank, cho biết thông tin máy GPU nào qui trình này đang sử dụng. Dữ liệu training được chia nhỏ để mỗi chỉ lệnh có thể đánh giá sub-gradient dựa trên dữ liệu đã chia trước đó. Sau khi sub-gradient được tạo ra ở mỗi chỉ lệnh, độ dốc stochastic gradient tổng hợp sẽ được tạo ra bằng cách all-reduce các sub-gradients đánh giá bởi tất cả các chỉ lệnh.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/onnx"><span class="arrow-prev">← </span><span>ONNX</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/time-profiling"><span>Time Profiling</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sử-dụng">Sử Dụng</a><ul class="toc-headings"><li><a href="#code-ví-dụ">Code Ví Dụ</a></li><li><a href="#hướng-dẫ [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/dist-train/index.html b/content/docs/3.1.0_Viet/dist-train/index.html
new file mode 100644
index 0000000..2597f49
--- /dev/null
+++ b/content/docs/3.1.0_Viet/dist-train/index.html
@@ -0,0 +1,395 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Distributed Training · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copy [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/dist-train.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Distributed Training</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contri [...]
+<p>SINGA hỗ trợ data parallel training trên nhiều GPUs (trên một node hoặc nhiều node khác nhau). Sơ đồ sau mô phỏng data parallel training:</p>
+<p><img src="/docs/assets/MPI.png" alt="MPI.png"></p>
+<p>Trong distributed training, mỗi chỉ lệnh (gọi là worker) chạy một training script trên một máy GPU. Mỗi chỉ lệnh (process) có một communication rank riêng. Dữ liệu để training được phân cho các worker và model thì được sao chép cho mỗi worker. Ở mỗi vòng, worker đọc một mini-batch dữ liệu (vd.,
+256 hình ảnh) từ phần được chia và chạy thuật toán BackPropagation để tính ra độ dốc (gradient) của weight, được lấy trung bình qua all-reduce (cung cấp bởi <a href="https://developer.nvidia.com/nccl">NCCL</a>)
+để cập nhật weight theo thuật toán
+stochastic gradient descent (SGD).</p>
+<p>Hàm all-reduce operation bởi NCCL có thể được sử dụng để giảm và đồng bộ hoá độ dốc từ các máy GPU các nhau. Xem thử training với 4 GPUs như dưới đây. Sau khi độ dốc (gradients) từ 4 GPUs được tính, all-reduce sẽ trả lại tổng độ dốc (gradient) cho các GPU và đưa tới mỗi GPU. Sau đó có thể dễ dàng tính ra độ dốc trung bình.</p>
+<p><img src="/docs/assets/AllReduce.png" alt="AllReduce.png"></p>
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng"></a><a href="#sử-dụng" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<p>SINGA áp dụng một module gọi là <code>DistOpt</code> (là dạng con của <code>Opt</code>) cho distributed
+training. Nó gói lại normal SGD optimizer và gọi  <code>Communicator</code> để động bộ hoá độ dốc. Ví dụ sau mô phỏng cách sử dụng <code>DistOpt</code> để
+training một CNN model với dữ liệu MNIST. Nguồn code có thể tìm
+<a href="https://github.com/apache/singa/blob/master/examples/cnn/">tại đây</a>, và <a href="">Colab notebook</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="code-ví-dụ"></a><a href="#code-ví-dụ" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<ol>
+<li>Định nghĩa neural network model:</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CNN</span><span class="hljs-params">(model.Model)</span>:</span>
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, num_classes=<span class="hljs-number">10</span>, num_channels=<span class="hljs-number">1</span>)</span>:</span>
+        super(CNN, self).__init__()
+        self.conv1 = layer.Conv2d(num_channels, <span class="hljs-number">20</span>, <span class="hljs-number">5</span>, padding=<span class="hljs-number">0</span>, activation=<span class="hljs-string">"RELU"</span>)
+        self.conv2 = layer.Conv2d(<span class="hljs-number">20</span>, <span class="hljs-number">50</span>, <span class="hljs-number">5</span>, padding=<span class="hljs-number">0</span>, activation=<span class="hljs-string">"RELU"</span>)
+        self.linear1 = layer.Linear(<span class="hljs-number">500</span>)
+        self.linear2 = layer.Linear(num_classes)
+        self.pooling1 = layer.MaxPool2d(<span class="hljs-number">2</span>, <span class="hljs-number">2</span>, padding=<span class="hljs-number">0</span>)
+        self.pooling2 = layer.MaxPool2d(<span class="hljs-number">2</span>, <span class="hljs-number">2</span>, padding=<span class="hljs-number">0</span>)
+        self.relu = layer.ReLU()
+        self.flatten = layer.Flatten()
+        self.softmax_cross_entropy = layer.SoftMaxCrossEntropy()
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(self, x)</span>:</span>
+        y = self.conv1(x)
+        y = self.pooling1(y)
+        y = self.conv2(y)
+        y = self.pooling2(y)
+        y = self.flatten(y)
+        y = self.linear1(y)
+        y = self.relu(y)
+        y = self.linear2(y)
+        <span class="hljs-keyword">return</span> y
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">train_one_batch</span><span class="hljs-params">(self, x, y, dist_option=<span class="hljs-string">'fp32'</span>, spars=<span class="hljs-number">0</span>)</span>:</span>
+        out = self.forward(x)
+        loss = self.softmax_cross_entropy(out, y)
+
+        <span class="hljs-comment"># cho phép nhiều lựa chọn dùng trong distributed training</span>
+        <span class="hljs-comment"># Tham khảo mục "Optimizations về Distributed Training"</span>
+        <span class="hljs-keyword">if</span> dist_option == <span class="hljs-string">'fp32'</span>:
+            self.optimizer(loss)
+        <span class="hljs-keyword">elif</span> dist_option == <span class="hljs-string">'fp16'</span>:
+            self.optimizer.backward_and_update_half(loss)
+        <span class="hljs-keyword">elif</span> dist_option == <span class="hljs-string">'partialUpdate'</span>:
+            self.optimizer.backward_and_partial_update(loss)
+        <span class="hljs-keyword">elif</span> dist_option == <span class="hljs-string">'sparseTopK'</span>:
+            self.optimizer.backward_and_sparse_update(loss,
+                                                      topK=<span class="hljs-literal">True</span>,
+                                                      spars=spars)
+        <span class="hljs-keyword">elif</span> dist_option == <span class="hljs-string">'sparseThreshold'</span>:
+            self.optimizer.backward_and_sparse_update(loss,
+                                                      topK=<span class="hljs-literal">False</span>,
+                                                      spars=spars)
+        <span class="hljs-keyword">return</span> out, loss
+
+<span class="hljs-comment"># tạo model</span>
+model = CNN()
+</code></pre>
+<ol start="2">
+<li>Tạo <code>DistOpt</code> instance và đính nó vào model đã tạo:</li>
+</ol>
+<pre><code class="hljs css language-python">sgd = opt.SGD(lr=<span class="hljs-number">0.005</span>, momentum=<span class="hljs-number">0.9</span>, weight_decay=<span class="hljs-number">1e-5</span>)
+sgd = opt.DistOpt(sgd)
+model.set_optimizer(sgd)
+dev = device.create_cuda_gpu_on(sgd.local_rank)
+</code></pre>
+<p>Đây là giải thích cho các biến sử dụng trong code:</p>
+<p>(i) <code>dev</code></p>
+<p>dev dùng để chỉ <code>Device</code> instance, nơi tải dữ liệu và chạy CNN model.</p>
+<p>(ii)<code>local_rank</code></p>
+<p>Local rank chỉ số GPU mà chỉ lệnh (process) hiện tại đang sử dụng trên cùng một node. Ví dụ, nếu bạn đang sử dụng một node có 2 GPUs, <code>local_rank=0</code> nghĩa là chỉ lệnh này đang sử dụng máy GPU đầu tiên, trong khi  <code>local_rank=1</code> nghĩa là đang sử dụng máy GPU thứ hai. Sử dụng MPI hay đa xử lý, bạn có thể chạy cùng một tập lệnh training chỉ khác giá trị của <code>local_rank</code>.</p>
+<p>(iii)<code>global_rank</code></p>
+<p>Rank trong global biểu thị global rank cho tất cả các chỉ lệnh (process) trong các nodes mà bạn đang sử dụng. Lấy ví dụ trường hợp bạn có 3 nodes và mỗi một node có hai GPUs, <code>global_rank=0</code> nghĩa là chỉ lệnh đang sử dụng máy GPU đầu tiên ở node đầu tiên, <code>global_rank=2</code> nghĩa là chỉ lệnh đang sử dụng máy GPU đầu tiên ở node thứ 2, và <code>global_rank=4</code> nghĩa là chỉ lệnh đang sử dụng máy GPU đầu tiên ở node thứ 3.</p>
+<ol start="3">
+<li>Tải và phân chia dữ liệu để training/validation</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">data_partition</span><span class="hljs-params">(dataset_x, dataset_y, global_rank, world_size)</span>:</span>
+    data_per_rank = dataset_x.shape[<span class="hljs-number">0</span>] // world_size
+    idx_start = global_rank * data_per_rank
+    idx_end = (global_rank + <span class="hljs-number">1</span>) * data_per_rank
+    <span class="hljs-keyword">return</span> dataset_x[idx_start:idx_end], dataset_y[idx_start:idx_end]
+
+train_x, train_y, test_x, test_y = load_dataset()
+train_x, train_y = data_partition(train_x, train_y,
+                                  sgd.global_rank, sgd.world_size)
+test_x, test_y = data_partition(test_x, test_y,
+                                sgd.global_rank, sgd.world_size)
+</code></pre>
+<p>Một phần của bộ dữ liệu (dataset) được trả lại cho <code>dev</code>.</p>
+<p>Tại đây, <code>world_size</code> thể hiện tổng số chỉ lệnh trong tất cả các node mà bạn đang sử dụng cho distributed training.</p>
+<ol start="4">
+<li>Khởi tạo và đồng bộ các tham số của model cho tất cả workers:</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-comment"># Đồng bộ tham số ban đầu </span>
+tx = tensor.Tensor((batch_size, <span class="hljs-number">1</span>, IMG_SIZE, IMG_SIZE), dev, tensor.float32)
+ty = tensor.Tensor((batch_size, num_classes), dev, tensor.int32)
+model.compile([tx], is_train=<span class="hljs-literal">True</span>, use_graph=graph, sequential=<span class="hljs-literal">True</span>)
+...
+<span class="hljs-comment"># Sử dụng cùng một random seed cho các ranks khác nhau</span>
+seed = <span class="hljs-number">0</span>
+dev.SetRandSeed(seed)
+np.random.seed(seed)
+</code></pre>
+<ol start="5">
+<li>Chạy BackPropagation và distributed SGD</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">for</span> epoch <span class="hljs-keyword">in</span> range(max_epoch):
+    <span class="hljs-keyword">for</span> b <span class="hljs-keyword">in</span> range(num_train_batch):
+        x = train_x[idx[b * batch_size: (b + <span class="hljs-number">1</span>) * batch_size]]
+        y = train_y[idx[b * batch_size: (b + <span class="hljs-number">1</span>) * batch_size]]
+        tx.copy_from_numpy(x)
+        ty.copy_from_numpy(y)
+        <span class="hljs-comment"># Train the model</span>
+        out, loss = model(tx, ty)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="hướng-dẫn-thực-hiện"></a><a href="#hướng-dẫn-thực-hiện" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>Có hai cách để bắt đầu quá trình training: MPI hoặc Python đa xử lý.</p>
+<h4><a class="anchor" aria-hidden="true" id="python-đa-xử-lý"></a><a href="#python-đa-xử-lý" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
+<p>Chạy trên một node với nhiều GPUs, trong đó mỗi GPU là một worker.</p>
+<ol>
+<li>Đặt tất cả các training codes trong cùng một hàm (function)</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">train_mnist_cnn</span><span class="hljs-params">(nccl_id=None, local_rank=None, world_size=None)</span>:</span>
+    ...
+</code></pre>
+<ol start="2">
+<li>Tạo <code>mnist_multiprocess.py</code></li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">'__main__'</span>:
+    <span class="hljs-comment"># Generate a NCCL ID to be used for collective communication</span>
+    nccl_id = singa.NcclIdHolder()
+
+    <span class="hljs-comment"># Define the number of GPUs to be used in the training process</span>
+    world_size = int(sys.argv[<span class="hljs-number">1</span>])
+
+    <span class="hljs-comment"># Define and launch the multi-processing</span>
+    <span class="hljs-keyword">import</span> multiprocessing
+    process = []
+    <span class="hljs-keyword">for</span> local_rank <span class="hljs-keyword">in</span> range(<span class="hljs-number">0</span>, world_size):
+        process.append(multiprocessing.Process(target=train_mnist_cnn,
+                       args=(nccl_id, local_rank, world_size)))
+
+    <span class="hljs-keyword">for</span> p <span class="hljs-keyword">in</span> process:
+        p.start()
+</code></pre>
+<p>Dưới đây là giải thích cho các biến tạo ở trên:</p>
+<p>(i) <code>nccl_id</code></p>
+<p>Lưu ý rằng chúng ta cần phải tạo một NCCL ID ở đây để sử dụng cho collective
+communication, sau đó gửi nó tới tất cả các chỉ lệnh. NCCL ID giống như là vé vào cửa, khi chỉ có chỉ lệnh với ID này có thể tham gia vào quá trình all-reduce.
+(Về sua nếu dùng MPI, thì việc sử dụng NCCL ID là không cần thiết, bởi vì ID được gửi đi bởi MPI trong code của chúng tôi một cách tự động)</p>
+<p>(ii) <code>world_size</code></p>
+<p>world_size là số lượng máy GPUs bạn muốn sử dụng cho training.</p>
+<p>(iii) <code>local_rank</code></p>
+<p>local_rank xác định local rank của distributed training và máy gpu được sử dụng trong chỉ lệnh. Trong code bên trên, for loop được sử dụng để chạy hàm train function, và local_rank chạy vòng từ 0 tới world_size. Trong trường hợp này, chỉ lệnh khác nhau có thể sử dụng máy GPUs khác nhau để training.</p>
+<p>Tham số để tạo <code>DistOpt</code> instance cần được cập nhật như sau:</p>
+<pre><code class="hljs css language-python">sgd = opt.DistOpt(sgd, nccl_id=nccl_id, local_rank=local_rank, world_size=world_size)
+</code></pre>
+<ol start="3">
+<li>Chạy <code>mnist_multiprocess.py</code></li>
+</ol>
+<pre><code class="hljs css language-sh">python mnist_multiprocess.py 2
+</code></pre>
+<p>Kết qủa hiển thị tốc độ so với training trên một máy GPU.</p>
+<pre><code class="hljs">Starting Epoch <span class="hljs-number">0</span>:
+Training loss = <span class="hljs-number">408.909790</span>, training accuracy = <span class="hljs-number">0.880475</span>
+Evaluation accuracy = <span class="hljs-number">0.956430</span>
+Starting Epoch <span class="hljs-number">1</span>:
+Training loss = <span class="hljs-number">102.396790</span>, training accuracy = <span class="hljs-number">0.967415</span>
+Evaluation accuracy = <span class="hljs-number">0.977564</span>
+Starting Epoch <span class="hljs-number">2</span>:
+Training loss = <span class="hljs-number">69.217010</span>, training accuracy = <span class="hljs-number">0.977915</span>
+Evaluation accuracy = <span class="hljs-number">0.981370</span>
+Starting Epoch <span class="hljs-number">3</span>:
+Training loss = <span class="hljs-number">54.248390</span>, training accuracy = <span class="hljs-number">0.982823</span>
+Evaluation accuracy = <span class="hljs-number">0.984075</span>
+Starting Epoch <span class="hljs-number">4</span>:
+Training loss = <span class="hljs-number">45.213406</span>, training accuracy = <span class="hljs-number">0.985560</span>
+Evaluation accuracy = <span class="hljs-number">0.985276</span>
+Starting Epoch <span class="hljs-number">5</span>:
+Training loss = <span class="hljs-number">38.868435</span>, training accuracy = <span class="hljs-number">0.987764</span>
+Evaluation accuracy = <span class="hljs-number">0.986278</span>
+Starting Epoch <span class="hljs-number">6</span>:
+Training loss = <span class="hljs-number">34.078186</span>, training accuracy = <span class="hljs-number">0.989149</span>
+Evaluation accuracy = <span class="hljs-number">0.987881</span>
+Starting Epoch <span class="hljs-number">7</span>:
+Training loss = <span class="hljs-number">30.138697</span>, training accuracy = <span class="hljs-number">0.990451</span>
+Evaluation accuracy = <span class="hljs-number">0.988181</span>
+Starting Epoch <span class="hljs-number">8</span>:
+Training loss = <span class="hljs-number">26.854443</span>, training accuracy = <span class="hljs-number">0.991520</span>
+Evaluation accuracy = <span class="hljs-number">0.988682</span>
+Starting Epoch <span class="hljs-number">9</span>:
+Training loss = <span class="hljs-number">24.039650</span>, training accuracy = <span class="hljs-number">0.992405</span>
+Evaluation accuracy = <span class="hljs-number">0.989083</span>
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="mpi"></a><a href="#mpi" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
+<p>Có thể dùng cho cả một node và nhiều node miễn là có nhiều máy GPUs.</p>
+<ol>
+<li>Tạo <code>mnist_dist.py</code></li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">'__main__'</span>:
+    train_mnist_cnn()
+</code></pre>
+<ol start="2">
+<li>Tạo một hostfile cho MPI, vd. hostfile dưới đây sử dụng 2 chỉ lệnh (vd.,
+2 GPUs) trên một node</li>
+</ol>
+<pre><code class="hljs css language-txt">localhost:<span class="hljs-number">2</span>
+</code></pre>
+<ol start="3">
+<li>Khởi động quá trình training qua <code>mpiexec</code></li>
+</ol>
+<pre><code class="hljs css language-sh">mpiexec --hostfile host_file python mnist_dist.py
+</code></pre>
+<p>Kết qủa có thể hiển thị tốc độ so với training trên một máy GPU.</p>
+<pre><code class="hljs">Starting Epoch <span class="hljs-number">0</span>:
+Training loss = <span class="hljs-number">383.969543</span>, training accuracy = <span class="hljs-number">0.886402</span>
+Evaluation accuracy = <span class="hljs-number">0.954327</span>
+Starting Epoch <span class="hljs-number">1</span>:
+Training loss = <span class="hljs-number">97.531479</span>, training accuracy = <span class="hljs-number">0.969451</span>
+Evaluation accuracy = <span class="hljs-number">0.977163</span>
+Starting Epoch <span class="hljs-number">2</span>:
+Training loss = <span class="hljs-number">67.166870</span>, training accuracy = <span class="hljs-number">0.978516</span>
+Evaluation accuracy = <span class="hljs-number">0.980769</span>
+Starting Epoch <span class="hljs-number">3</span>:
+Training loss = <span class="hljs-number">53.369656</span>, training accuracy = <span class="hljs-number">0.983040</span>
+Evaluation accuracy = <span class="hljs-number">0.983974</span>
+Starting Epoch <span class="hljs-number">4</span>:
+Training loss = <span class="hljs-number">45.100403</span>, training accuracy = <span class="hljs-number">0.985777</span>
+Evaluation accuracy = <span class="hljs-number">0.986078</span>
+Starting Epoch <span class="hljs-number">5</span>:
+Training loss = <span class="hljs-number">39.330826</span>, training accuracy = <span class="hljs-number">0.987447</span>
+Evaluation accuracy = <span class="hljs-number">0.987179</span>
+Starting Epoch <span class="hljs-number">6</span>:
+Training loss = <span class="hljs-number">34.655270</span>, training accuracy = <span class="hljs-number">0.988799</span>
+Evaluation accuracy = <span class="hljs-number">0.987780</span>
+Starting Epoch <span class="hljs-number">7</span>:
+Training loss = <span class="hljs-number">30.749735</span>, training accuracy = <span class="hljs-number">0.989984</span>
+Evaluation accuracy = <span class="hljs-number">0.988281</span>
+Starting Epoch <span class="hljs-number">8</span>:
+Training loss = <span class="hljs-number">27.422146</span>, training accuracy = <span class="hljs-number">0.991319</span>
+Evaluation accuracy = <span class="hljs-number">0.988582</span>
+Starting Epoch <span class="hljs-number">9</span>:
+Training loss = <span class="hljs-number">24.548153</span>, training accuracy = <span class="hljs-number">0.992171</span>
+Evaluation accuracy = <span class="hljs-number">0.988682</span>
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="tối-ưu-hoá-distributed-training"></a><a href="#tối-ưu-hoá-distributed-training" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
+<p>SINGA cung cấp chiến lược đa tối ưu hoá cho distributed training để giảm communication cost. Tham khảo API của <code>DistOpt</code> cho cấu hình của mỗi cách.</p>
+<p>Khi sử dụng <code>model.Model</code> để tạo một model, cần phải đặt các lựa chọn cho
+distributed training trong phương pháp <code>train_one_batch</code>. Tham khảo code ví dụ trên đầu trang. Bạn có thể chỉ cần copy code cho các lựa chọn và sử dụng nó cho các model khác.
+Với các lựa chọn xác định, ta có thể đặt tham số<code>dist_option</code> và <code>spars</code> khi bắt đầu training với  <code>model(tx, ty, dist_option, spars)</code></p>
+<h3><a class="anchor" aria-hidden="true" id="không-tối-ưu-hoá"></a><a href="#không-tối-ưu-hoá" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<pre><code class="hljs css language-python">out, loss = model(tx, ty)
+</code></pre>
+<p><code>loss</code> là output tensor từ hàm loss function, vd., cross-entropy cho
+classification tasks.</p>
+<h3><a class="anchor" aria-hidden="true" id="half-precision-gradients"></a><a href="#half-precision-gradients" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
+<pre><code class="hljs css language-python">out, loss = model(tx, ty, dist_option = <span class="hljs-string">'fp16'</span>)
+</code></pre>
+<p>Chuyển đổi gía trị độ dốc sang hiển thị dạng 16-bit (vd., half-precision) trước khi gọi hàm all-reduce.</p>
+<h3><a class="anchor" aria-hidden="true" id="đồng-bộ-cục-bộ-partial-synchronization"></a><a href="#đồng-bộ-cục-bộ-partial-synchronization" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1. [...]
+<pre><code class="hljs css language-python">out, loss = model(tx, ty, dist_option = <span class="hljs-string">'partialUpdate'</span>)
+</code></pre>
+<p>Ở mỗi vòng lặp (iteration), mỗi rank thực hiện việc cập nhật sgd. Sau đó chỉ một nhóm tham số là được tính trung bình để đồng bộ hoá. Điều này giúp tiết kiệm communication cost.
+Độ lớn của nhóm này được xác định khi tạo hàm <code>DistOpt</code> instance.</p>
+<h3><a class="anchor" aria-hidden="true" id="phân-bổ-độ-dốc-gradient-sparsification"></a><a href="#phân-bổ-độ-dốc-gradient-sparsification" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1. [...]
+<p>Kế hoạch phân bổ để chọn ra một nhóm nhỏ độ dốc nhằm thực hiện all-reduce. Có hai cách:</p>
+<ul>
+<li>Chọn K phần tử lớn nhất. spars là một phần (0 - 1) của tổng số phần tử được chọn.</li>
+</ul>
+<pre><code class="hljs css language-python">out, loss = model(tx, ty, dist_option = <span class="hljs-string">'sparseTopK'</span>, spars = spars)
+</code></pre>
+<ul>
+<li>Tất cả độ dốc có giá trị tuyệt đối lớn hơn ngưỡng spars đặt trước được lựa chọn.</li>
+</ul>
+<pre><code class="hljs css language-python">out, loss = model(tx, ty, dist_option = <span class="hljs-string">'sparseThreshold'</span>, spars = spars)
+</code></pre>
+<p>Các hyper-parameter được cấu tạo khi tạo hàm <code>DistOpt</code> instance.</p>
+<h2><a class="anchor" aria-hidden="true" id="thực-hiện"></a><a href="#thực-hiện" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
+<p>Mục này chủ yếu dành cho các lập trình viên (developer) muốn biết lập trình trong
+distribute module được thực hiện như thế nào.</p>
+<h3><a class="anchor" aria-hidden="true" id="giao-diện-c-cho-bộ-chuyển-mạch-communicator-nccl"></a><a href="#giao-diện-c-cho-bộ-chuyển-mạch-communicator-nccl" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9z [...]
+<p>Trước tiên, communication layer được lập trình bằng ngôn ngữ C
+<a href="https://github.com/apache/singa/blob/master/src/io/communicator.cc">communicator.cc</a>.
+Nó áp dụng NCCL library cho collective communication.</p>
+<p>Có hai hàm tạo nên communicator, một cho MPI và một cho đa phương thức (multiprocess).</p>
+<p>(i) Hàm tạo sử dụng MPI</p>
+<p>Hàm tạo bước đầu sẽ sử dụng global rank và world size, sau đó tính toán ra local rank. Tiếp theo, rank 0 sẽ tạo ra NCCL ID và phát nó lên mỗi rank. Sau đó, nó gọi hàm setup để khởi tạo NCCL
+communicator, cuda streams, và buffers.</p>
+<p>(ii) Hàm tạo sử dụng Python đa phương thức</p>
+<p>Hàm tạo bước đầu sẽ sử dụng rank, world size, và NCCL ID từ input argument. Sau đó, nó gọi hàm setup function để khởi tạo NCCL communicator, cuda streams, và buffers.</p>
+<p>Sau khi khởi động, nó thực hiện chức năng all-reduce để đồng bộ hoá các tham số model và độ dốc. Ví dụ, synch sử dụng một input tensor và tiến hành all-reduce qua đoạn chương trình NCCL. Sau khi gọi synch, cần gọi hàm wait để đợi hàm all-reduce operation kết thúc.</p>
+<h3><a class="anchor" aria-hidden="true" id="giao-diện-python-của-distopt"></a><a href="#giao-diện-python-của-distopt" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 [...]
+<p>Sau đó, giao diện python sẽ tạo ra một
+<a href="https://github.com/apache/singa/blob/master/python/singa/opt.py">DistOpt</a> class để gói một
+<a href="https://github.com/apache/singa/blob/master/python/singa/opt.py">optimizer</a>
+object để thực hiện distributed training dựa trên MPI hoặc đa xử lý. Trong khi khởi động, nó tạo ra một NCCL communicator object (từ giao diện C đề cập ở mục nhỏ phía trên). Sau đó, communicator object này được sử dụng trong mỗi hàm all-reduce trong DistOpt.</p>
+<p>Trong MPI hoặc đa xử lý, mỗi chỉ lệnh có một rank, cho biết thông tin máy GPU nào qui trình này đang sử dụng. Dữ liệu training được chia nhỏ để mỗi chỉ lệnh có thể đánh giá sub-gradient dựa trên dữ liệu đã chia trước đó. Sau khi sub-gradient được tạo ra ở mỗi chỉ lệnh, độ dốc stochastic gradient tổng hợp sẽ được tạo ra bằng cách all-reduce các sub-gradients đánh giá bởi tất cả các chỉ lệnh.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/onnx"><span class="arrow-prev">← </span><span>ONNX</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/time-profiling"><span>Time Profiling</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sử-dụng">Sử Dụng</a><ul class="toc-headings"><li><a href="#code-ví-dụ">Code Ví Dụ</a></li><li><a href="#hướng-dẫ [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/downloads.html b/content/docs/3.1.0_Viet/downloads.html
new file mode 100644
index 0000000..14cd36e
--- /dev/null
+++ b/content/docs/3.1.0_Viet/downloads.html
@@ -0,0 +1,296 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Tải SINGA · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright owner [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/download.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Tải SINGA</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license [...]
+<h2><a class="anchor" aria-hidden="true" id="kiểm-chứng"></a><a href="#kiểm-chứng" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>Để kiểm chứng tập tin tar.gz đã tải, tải
+<a href="https://www.apache.org/dist/singa/KEYS">KEYS</a> và tập tin ASC sau đó thực hiện các lệnh sau</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">%</span><span class="bash"> gpg --import KEYS</span>
+<span class="hljs-meta">%</span><span class="bash"> gpg --verify downloaded_file.asc downloaded_file</span>
+</code></pre>
+<p>Bạn có thể kiểm tra giá trị của SHA512 hoặc MD5 để xem liệu việc tải về đã hoàn thành chưa.</p>
+<h2><a class="anchor" aria-hidden="true" id="v310-30-tháng-10-năm-2020"></a><a href="#v310-30-tháng-10-năm-2020" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<ul>
+<li><a href="http://www.apache.org/dyn/closer.cgi/singa/3.1.0/apache-singa-3.1.0.tar.gz">Apache SINGA 3.1.0</a>
+<a href="https://www.apache.org/dist/singa/3.1.0/apache-singa-3.1.0.tar.gz.sha512">[SHA512]</a>
+<a href="https://www.apache.org/dist/singa/3.1.0/apache-singa-3.1.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_3.1.0">Release Notes 3.1.0</a></li>
+<li>Thay đổi chung:
+<ul>
+<li>Cập nhật Tensor core:
+<ul>
+<li>Hỗ trợ tensor transformation (reshape, transpose) cho tensors có tới 6 chiều (dimensions).</li>
+<li>Áp dụn traverse_unary_transform ở Cuda backend, tương tự như CPP backend one.</li>
+</ul></li>
+<li>Thêm hàm tensor operators vào autograd module.</li>
+<li>Cải tạo lại sonnx để
+<ul>
+<li>Hỗ trợ việc tạo hàm operators từ cả layer và autograd.</li>
+<li>Viết lại SingaRep để SINGA representation mạnh và nhanh hơn.</li>
+<li>Thêm SONNXModel áp dụng từ Model để API và các tính năng đồng bộ với nhau.</li>
+</ul></li>
+</ul>
+<ul>
+<li>Thay thế Travis CI với trình tự Github. Thêm quản lý chất lượng và độ bao phủ.</li>
+<li>Thêm Tập lệnh compiling và packaging nhằm tạo gói wheel packages cho distribution.</li>
+<li>Fix bugs
+<ul>
+<li>Hoàn thiện Tập lệnh training cho ví dụ về IMDB LSTM model.</li>
+<li>Ổn định lại hàm Tensor operation Mult khi sử dụng Broadcasting.</li>
+<li>Hàm Gaussian trong Tensor giờ có thể chạy trên Tensor với kích thước lẻ.</li>
+<li>Cập nhật hàm hỗ trợ chạy thử gradients() trong autograd để tìm tham số
+gradient qua tham số python object id khi chạy thử.</li>
+</ul></li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="v300-18-april-2020"></a><a href="#v300-18-april-2020" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<ul>
+<li><a href="https://archive.apache.org/dist/singa/3.0.0/apache-singa-3.0.0.tar.gz">Apache SINGA 3.0.0</a>
+<a href="https://archive.apache.org/dist/singa/3.0.0/apache-singa-3.0.0.tar.gz.sha512">[SHA512]</a>
+<a href="https://archive.apache.org/dist/singa/3.0.0/apache-singa-3.0.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_3.0.0">Ghi Chú Phát Hành 3.0.0</a></li>
+<li>Các tính năng mới và thay đổi chính,
+<ul>
+<li>Nâng cấp ONNX. Thử nghiệm nhiều ONNX models trên SINGA.</li>
+<li>Thực hiện Distributed training với MPI và tối ưu hoá NCCL Communication qua
+phân bổ và nén độ dốc, và truyền tải phân khúc.</li>
+<li>Xây dựng và tối ưu hoá tốc độ và bộ nhớ sử dụng graph của Computational graph.</li>
+<li>Lập trang Tài Liệu sử dụng mới (singa.apache.org) và website tham khảo API
+(apache-singa.rtfd.io).</li>
+<li>CI cho việc kiểm tra chất lượng mã code.</li>
+<li>Thay thế MKLDNN bằng DNNL</li>
+<li>Cập nhật APIs cho tensor để hỗ trợ hàm broadcasting.</li>
+<li>Tạo autograd operators mới để hỗ trợ các ONNX models.</li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="incubating-v200-20-tháng-4-năm-2019"></a><a href="#incubating-v200-20-tháng-4-năm-2019" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2 [...]
+<ul>
+<li><a href="https://archive.apache.org/dist/incubator/singa/2.0.0/apache-singa-incubating-2.0.0.tar.gz">Apache SINGA 2.0.0 (incubating)</a>
+<a href="https://archive.apache.org/dist/incubator/singa/2.0.0/apache-singa-incubating-2.0.0.tar.gz.sha512">[SHA512]</a>
+<a href="https://archive.apache.org/dist/incubator/singa/2.0.0/apache-singa-incubating-2.0.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_2.0.0.html">Ghi Chú Phát Hành 2.0.0 (incubating)</a></li>
+<li>Các tính năng mới và thay đổi chính,
+<ul>
+<li>Nâng cấp autograd (cho Convolution networks và recurrent networks)</li>
+<li>Hỗ trợ ONNX</li>
+<li>Cải thiện hàm CPP operations qua Intel MKL DNN lib</li>
+<li>Thực hiện tensor broadcasting</li>
+<li>Chuyển Docker images dưới tên sử dụng trong Apache</li>
+<li>Cập nhật các phiên bản dependent lib trong conda-build config</li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="incubating-v120-6-june-2018"></a><a href="#incubating-v120-6-june-2018" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<ul>
+<li><a href="https://archive.apache.org/dist/incubator/singa/1.2.0/apache-singa-incubating-1.2.0.tar.gz">Apache SINGA 1.2.0 (incubating)</a>
+<a href="https://archive.apache.org/dist/incubator/singa/1.2.0/apache-singa-incubating-1.2.0.tar.gz.sha512">[SHA512]</a>
+<a href="https://archive.apache.org/dist/incubator/singa/1.2.0/apache-singa-incubating-1.2.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_1.2.0.html">Release Notes 1.2.0 (incubating)</a></li>
+<li>Các tính năng mới và thay đổi chính,
+<ul>
+<li>Thực hiện autograd (đang hỗ trợ MLP model)</li>
+<li>Nâng cấp PySinga để hỗ trợ Python 3</li>
+<li>Cải thiện Tensor class với mục stride</li>
+<li>Nâng cấp cuDNN từ V5 sang V7</li>
+<li>Thêm VGG, Inception V4, ResNet, và DenseNet cho ImageNet classification</li>
+<li>Tạo alias cho gói conda packages</li>
+<li>Hoàn thiện Tài liệu sử dụng bằng tiếng Trung</li>
+<li>Thêm hướng dẫn chạy Singa trên Windows</li>
+<li>Cập nhật compilation, CI</li>
+<li>Sửa lỗi nếu có</li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="incubating-v110-12-february-2017"></a><a href="#incubating-v110-12-february-2017" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
+<ul>
+<li><a href="https://archive.apache.org/dist/incubator/singa/1.1.0/apache-singa-incubating-1.1.0.tar.gz">Apache SINGA 1.1.0 (incubating)</a>
+<a href="https://archive.apache.org/dist/incubator/singa/1.1.0/apache-singa-incubating-1.1.0.tar.gz.md5">[MD5]</a>
+<a href="https://archive.apache.org/dist/incubator/singa/1.1.0/apache-singa-incubating-1.1.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_1.1.0.html">Release Notes 1.1.0 (incubating)</a></li>
+<li>Các tính năng mới và thay đổi chính,
+<ul>
+<li>Tạo Docker images (phiên bản CPU và GPU)</li>
+<li>Tạo Amazon AMI cho SINGA (phiên bản CPU)</li>
+<li>Tích hợp với Jenkins để tự động tạo gói Wheel và Debian
+(cho cài đặt), và cập nhật website.</li>
+<li>Nâng cấp FeedFowardNet, vd., nhiều mode cho inputs và verbose để sửa lỗi</li>
+<li>Thêm Concat và Slice layers</li>
+<li>Mở rộng CrossEntropyLoss nhằm chấp nhật instance với nhiều labels</li>
+<li>Thêm image_tool.py với phương thức image augmentation</li>
+<li>Hỗ trợ tải và lưu model qua Snapshot API</li>
+<li>Compile SINGA source trên Windows</li>
+<li>Compile những dependent libraries bắt buộc cùng với SINGA code</li>
+<li>Kích hoạt Java binding (cơ bản) cho SINGA</li>
+<li>Thêm phiên bản ID trong kiểm soát tập tin</li>
+<li>Thêm gói sử dụng Rafiki cung cấp RESTFul APIs</li>
+<li>Thêm ví dụ pretrained từ Caffe, bao gồm GoogleNet</li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="incubating-v100-8-september-2016"></a><a href="#incubating-v100-8-september-2016" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
+<ul>
+<li><a href="https://archive.apache.org/dist/incubator/singa/1.0.0/apache-singa-incubating-1.0.0.tar.gz">Apache SINGA 1.0.0 (incubating)</a>
+<a href="https://archive.apache.org/dist/incubator/singa/1.0.0/apache-singa-incubating-1.0.0.tar.gz.md5">[MD5]</a>
+<a href="https://archive.apache.org/dist/incubator/singa/1.0.0/apache-singa-incubating-1.0.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_1.0.0.html">Release Notes 1.0.0 (incubating)</a></li>
+<li>Các tính năng mới và thay đổi chính,
+<ul>
+<li>Tạo Tensor nhằm hỗ trợ nhiều model khác nhau.</li>
+<li>Tạo Device để chạy trên các thiết bị phần cứng khác nhau, bao gồm CPU,
+(Nvidia/AMD) GPU và FPGA (sẽ thử nghiệm ở các phiên bản mới).</li>
+<li>Thay thế GNU autotool với cmake khi compilation.</li>
+<li>Hỗ trợ Mac OS</li>
+<li>Cải thiện Python binding, bao gồm cài đặt và lập trình.</li>
+<li>Tạo thêm nhiều deep learning models, bao gồm VGG và ResNet</li>
+<li>Thêm IO classes để đọc/viết tập tin và mã hoá/giải mã dữ liệu</li>
+<li>Các thành phần network communication mới trực tiếp từ Socket.</li>
+<li>Cudnn V5 với Dropout và RNN layers.</li>
+<li>Thay thế công cụ xây dựng website từ maven sang Sphinx</li>
+<li>Tích hợp Travis-CI</li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="incubating-v030-20-april-2016"></a><a href="#incubating-v030-20-april-2016" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
+<ul>
+<li><a href="https://archive.apache.org/dist/incubator/singa/0.3.0/apache-singa-incubating-0.3.0.tar.gz">Apache SINGA 0.3.0 (incubating)</a>
+<a href="https://archive.apache.org/dist/incubator/singa/0.3.0/apache-singa-incubating-0.3.0.tar.gz.md5">[MD5]</a>
+<a href="https://archive.apache.org/dist/incubator/singa/0.3.0/apache-singa-incubating-0.3.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_0.3.0.html">Release Notes 0.3.0 (incubating)</a></li>
+<li>Các tính năng mới và thay đổi chính,
+<ul>
+<li>Training trên nhóm máy GPU: cho phép training các deep learning models trên một nhóm máy GPU</li>
+<li>Cải thiện Python wrapper khiến cho job configuration trở nên dễ dàng, bao gồm
+neural net và thuật toán SGD.</li>
+<li>Thêm cập nhật SGD updaters mới, bao gồm Adam, AdaDelta và AdaMax.</li>
+<li>Cài đặt cần ít dependent libraries hơn cho mỗi node training.</li>
+<li>Đa dạng training với CPU và GPU.</li>
+<li>Hỗ trợ cuDNN V4.</li>
+<li>Tìm nạp trước dữ liệu.</li>
+<li>Sửa lỗi nếu có.</li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="incubating-v020-14-january-2016"></a><a href="#incubating-v020-14-january-2016" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
+<ul>
+<li><a href="https://archive.apache.org/dist/incubator/singa/0.2.0/apache-singa-incubating-0.2.0.tar.gz">Apache SINGA 0.2.0 (incubating)</a>
+<a href="https://archive.apache.org/dist/incubator/singa/0.2.0/apache-singa-incubating-0.2.0.tar.gz.md5">[MD5]</a>
+<a href="https://archive.apache.org/dist/incubator/singa/0.2.0/apache-singa-incubating-0.2.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_0.2.0.html">Release Notes 0.2.0 (incubating)</a></li>
+<li>Các tính năng mới và thay đổi chính,
+<ul>
+<li>Training trên GPU cho phép training các models phức tạp trên một node với nhiều card GPU.</li>
+<li>Chia nhỏ Hybrid neural net hỗ trợ dữ liệu và model song song cùng lúc.</li>
+<li>Cải thiện Python wrapper khiến cho job configuration trở nên dễ dàng, bao gồm
+neural net và thuật toán SGD.</li>
+<li>Áp dụng RNN model và thuật toán BPTT để hỗ trợ các ứng dụng dựa trên
+RNN models, e.g., GRU.</li>
+<li>Tích hợp các phần mêm đám mây bao gồm Mesos, Docker và HDFS.</li>
+<li>Cung cấp hình ảnh cấu trúc neural net và thông tin layer, hỗ trợ việc sửa lỗi.</li>
+<li>Hàm Linear algebra và các hàm  ngẫu nhiên không dùng Blobs và chỉ điểm dữ liệu thô.</li>
+<li>Tạo layers mới, bao gồm SoftmaxLayer, ArgSortLayer, DummyLayer, RNN layers và
+cuDNN layers.</li>
+<li>Cập nhật Layer class để chứa nhiều data/grad Blobs.</li>
+<li>Trích xuất các features và thử nghiệm hiệu quả cho dữ liệu mới bằng cách tải các tham số model đã được train từ trước.</li>
+<li>Thêm Store class cho hàm IO operations.</li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="incubating-v010-8-october-2015"></a><a href="#incubating-v010-8-october-2015" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
+<ul>
+<li><a href="https://archive.apache.org/dist/incubator/singa/apache-singa-incubating-0.1.0.tar.gz">Apache SINGA 0.1.0 (incubating)</a>
+<a href="https://archive.apache.org/dist/incubator/singa/apache-singa-incubating-0.1.0.tar.gz.md5">[MD5]</a>
+<a href="https://archive.apache.org/dist/incubator/singa/apache-singa-incubating-0.1.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="https://console.aws.amazon.com/ec2/v2/home?region=ap-southeast-1#LaunchInstanceWizard:ami=ami-b41001e6">Amazon EC2 image</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_0.1.0.html">Release Notes 0.1.0 (incubating)</a></li>
+<li>Các thay đổi chính gồm có,
+<ul>
+<li>Cài đặt sử dụng tiện ích GNU build</li>
+<li>Tập lệnh cho job management với zookeeper</li>
+<li>Lập trình model dựa trên NeuralNet và trích xuất Layer.</li>
+<li>Kết cấu hệ thống dựa trên Worker, Server và Stub.</li>
+<li>Training models từ ba model khác nhau, là feed-forward
+models, energy models và RNN models.</li>
+<li>Đồng bộ và không đồng bộ và không đồng bộ distributed training frameworks sử dụng CPU</li>
+<li>Điểm kiểm tra (Checkpoint) và khôi phục</li>
+<li>Kiểm tra đơn vị sử dụng gtest</li>
+</ul></li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/time-profiling"><span class="arrow-prev">← </span><span>Time Profiling</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/build"><span>Build SINGA from Source</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#kiểm-chứng">Kiểm Chứng</a></li><li><a href="#v310-30-tháng-10-năm-2020">V3.1.0 (30 tháng 10  [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/downloads/index.html b/content/docs/3.1.0_Viet/downloads/index.html
new file mode 100644
index 0000000..14cd36e
--- /dev/null
+++ b/content/docs/3.1.0_Viet/downloads/index.html
@@ -0,0 +1,296 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Tải SINGA · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright owner [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/download.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Tải SINGA</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license [...]
+<h2><a class="anchor" aria-hidden="true" id="kiểm-chứng"></a><a href="#kiểm-chứng" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>Để kiểm chứng tập tin tar.gz đã tải, tải
+<a href="https://www.apache.org/dist/singa/KEYS">KEYS</a> và tập tin ASC sau đó thực hiện các lệnh sau</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">%</span><span class="bash"> gpg --import KEYS</span>
+<span class="hljs-meta">%</span><span class="bash"> gpg --verify downloaded_file.asc downloaded_file</span>
+</code></pre>
+<p>Bạn có thể kiểm tra giá trị của SHA512 hoặc MD5 để xem liệu việc tải về đã hoàn thành chưa.</p>
+<h2><a class="anchor" aria-hidden="true" id="v310-30-tháng-10-năm-2020"></a><a href="#v310-30-tháng-10-năm-2020" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<ul>
+<li><a href="http://www.apache.org/dyn/closer.cgi/singa/3.1.0/apache-singa-3.1.0.tar.gz">Apache SINGA 3.1.0</a>
+<a href="https://www.apache.org/dist/singa/3.1.0/apache-singa-3.1.0.tar.gz.sha512">[SHA512]</a>
+<a href="https://www.apache.org/dist/singa/3.1.0/apache-singa-3.1.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_3.1.0">Release Notes 3.1.0</a></li>
+<li>Thay đổi chung:
+<ul>
+<li>Cập nhật Tensor core:
+<ul>
+<li>Hỗ trợ tensor transformation (reshape, transpose) cho tensors có tới 6 chiều (dimensions).</li>
+<li>Áp dụn traverse_unary_transform ở Cuda backend, tương tự như CPP backend one.</li>
+</ul></li>
+<li>Thêm hàm tensor operators vào autograd module.</li>
+<li>Cải tạo lại sonnx để
+<ul>
+<li>Hỗ trợ việc tạo hàm operators từ cả layer và autograd.</li>
+<li>Viết lại SingaRep để SINGA representation mạnh và nhanh hơn.</li>
+<li>Thêm SONNXModel áp dụng từ Model để API và các tính năng đồng bộ với nhau.</li>
+</ul></li>
+</ul>
+<ul>
+<li>Thay thế Travis CI với trình tự Github. Thêm quản lý chất lượng và độ bao phủ.</li>
+<li>Thêm Tập lệnh compiling và packaging nhằm tạo gói wheel packages cho distribution.</li>
+<li>Fix bugs
+<ul>
+<li>Hoàn thiện Tập lệnh training cho ví dụ về IMDB LSTM model.</li>
+<li>Ổn định lại hàm Tensor operation Mult khi sử dụng Broadcasting.</li>
+<li>Hàm Gaussian trong Tensor giờ có thể chạy trên Tensor với kích thước lẻ.</li>
+<li>Cập nhật hàm hỗ trợ chạy thử gradients() trong autograd để tìm tham số
+gradient qua tham số python object id khi chạy thử.</li>
+</ul></li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="v300-18-april-2020"></a><a href="#v300-18-april-2020" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<ul>
+<li><a href="https://archive.apache.org/dist/singa/3.0.0/apache-singa-3.0.0.tar.gz">Apache SINGA 3.0.0</a>
+<a href="https://archive.apache.org/dist/singa/3.0.0/apache-singa-3.0.0.tar.gz.sha512">[SHA512]</a>
+<a href="https://archive.apache.org/dist/singa/3.0.0/apache-singa-3.0.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_3.0.0">Ghi Chú Phát Hành 3.0.0</a></li>
+<li>Các tính năng mới và thay đổi chính,
+<ul>
+<li>Nâng cấp ONNX. Thử nghiệm nhiều ONNX models trên SINGA.</li>
+<li>Thực hiện Distributed training với MPI và tối ưu hoá NCCL Communication qua
+phân bổ và nén độ dốc, và truyền tải phân khúc.</li>
+<li>Xây dựng và tối ưu hoá tốc độ và bộ nhớ sử dụng graph của Computational graph.</li>
+<li>Lập trang Tài Liệu sử dụng mới (singa.apache.org) và website tham khảo API
+(apache-singa.rtfd.io).</li>
+<li>CI cho việc kiểm tra chất lượng mã code.</li>
+<li>Thay thế MKLDNN bằng DNNL</li>
+<li>Cập nhật APIs cho tensor để hỗ trợ hàm broadcasting.</li>
+<li>Tạo autograd operators mới để hỗ trợ các ONNX models.</li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="incubating-v200-20-tháng-4-năm-2019"></a><a href="#incubating-v200-20-tháng-4-năm-2019" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2 [...]
+<ul>
+<li><a href="https://archive.apache.org/dist/incubator/singa/2.0.0/apache-singa-incubating-2.0.0.tar.gz">Apache SINGA 2.0.0 (incubating)</a>
+<a href="https://archive.apache.org/dist/incubator/singa/2.0.0/apache-singa-incubating-2.0.0.tar.gz.sha512">[SHA512]</a>
+<a href="https://archive.apache.org/dist/incubator/singa/2.0.0/apache-singa-incubating-2.0.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_2.0.0.html">Ghi Chú Phát Hành 2.0.0 (incubating)</a></li>
+<li>Các tính năng mới và thay đổi chính,
+<ul>
+<li>Nâng cấp autograd (cho Convolution networks và recurrent networks)</li>
+<li>Hỗ trợ ONNX</li>
+<li>Cải thiện hàm CPP operations qua Intel MKL DNN lib</li>
+<li>Thực hiện tensor broadcasting</li>
+<li>Chuyển Docker images dưới tên sử dụng trong Apache</li>
+<li>Cập nhật các phiên bản dependent lib trong conda-build config</li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="incubating-v120-6-june-2018"></a><a href="#incubating-v120-6-june-2018" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<ul>
+<li><a href="https://archive.apache.org/dist/incubator/singa/1.2.0/apache-singa-incubating-1.2.0.tar.gz">Apache SINGA 1.2.0 (incubating)</a>
+<a href="https://archive.apache.org/dist/incubator/singa/1.2.0/apache-singa-incubating-1.2.0.tar.gz.sha512">[SHA512]</a>
+<a href="https://archive.apache.org/dist/incubator/singa/1.2.0/apache-singa-incubating-1.2.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_1.2.0.html">Release Notes 1.2.0 (incubating)</a></li>
+<li>Các tính năng mới và thay đổi chính,
+<ul>
+<li>Thực hiện autograd (đang hỗ trợ MLP model)</li>
+<li>Nâng cấp PySinga để hỗ trợ Python 3</li>
+<li>Cải thiện Tensor class với mục stride</li>
+<li>Nâng cấp cuDNN từ V5 sang V7</li>
+<li>Thêm VGG, Inception V4, ResNet, và DenseNet cho ImageNet classification</li>
+<li>Tạo alias cho gói conda packages</li>
+<li>Hoàn thiện Tài liệu sử dụng bằng tiếng Trung</li>
+<li>Thêm hướng dẫn chạy Singa trên Windows</li>
+<li>Cập nhật compilation, CI</li>
+<li>Sửa lỗi nếu có</li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="incubating-v110-12-february-2017"></a><a href="#incubating-v110-12-february-2017" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
+<ul>
+<li><a href="https://archive.apache.org/dist/incubator/singa/1.1.0/apache-singa-incubating-1.1.0.tar.gz">Apache SINGA 1.1.0 (incubating)</a>
+<a href="https://archive.apache.org/dist/incubator/singa/1.1.0/apache-singa-incubating-1.1.0.tar.gz.md5">[MD5]</a>
+<a href="https://archive.apache.org/dist/incubator/singa/1.1.0/apache-singa-incubating-1.1.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_1.1.0.html">Release Notes 1.1.0 (incubating)</a></li>
+<li>Các tính năng mới và thay đổi chính,
+<ul>
+<li>Tạo Docker images (phiên bản CPU và GPU)</li>
+<li>Tạo Amazon AMI cho SINGA (phiên bản CPU)</li>
+<li>Tích hợp với Jenkins để tự động tạo gói Wheel và Debian
+(cho cài đặt), và cập nhật website.</li>
+<li>Nâng cấp FeedFowardNet, vd., nhiều mode cho inputs và verbose để sửa lỗi</li>
+<li>Thêm Concat và Slice layers</li>
+<li>Mở rộng CrossEntropyLoss nhằm chấp nhật instance với nhiều labels</li>
+<li>Thêm image_tool.py với phương thức image augmentation</li>
+<li>Hỗ trợ tải và lưu model qua Snapshot API</li>
+<li>Compile SINGA source trên Windows</li>
+<li>Compile những dependent libraries bắt buộc cùng với SINGA code</li>
+<li>Kích hoạt Java binding (cơ bản) cho SINGA</li>
+<li>Thêm phiên bản ID trong kiểm soát tập tin</li>
+<li>Thêm gói sử dụng Rafiki cung cấp RESTFul APIs</li>
+<li>Thêm ví dụ pretrained từ Caffe, bao gồm GoogleNet</li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="incubating-v100-8-september-2016"></a><a href="#incubating-v100-8-september-2016" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
+<ul>
+<li><a href="https://archive.apache.org/dist/incubator/singa/1.0.0/apache-singa-incubating-1.0.0.tar.gz">Apache SINGA 1.0.0 (incubating)</a>
+<a href="https://archive.apache.org/dist/incubator/singa/1.0.0/apache-singa-incubating-1.0.0.tar.gz.md5">[MD5]</a>
+<a href="https://archive.apache.org/dist/incubator/singa/1.0.0/apache-singa-incubating-1.0.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_1.0.0.html">Release Notes 1.0.0 (incubating)</a></li>
+<li>Các tính năng mới và thay đổi chính,
+<ul>
+<li>Tạo Tensor nhằm hỗ trợ nhiều model khác nhau.</li>
+<li>Tạo Device để chạy trên các thiết bị phần cứng khác nhau, bao gồm CPU,
+(Nvidia/AMD) GPU và FPGA (sẽ thử nghiệm ở các phiên bản mới).</li>
+<li>Thay thế GNU autotool với cmake khi compilation.</li>
+<li>Hỗ trợ Mac OS</li>
+<li>Cải thiện Python binding, bao gồm cài đặt và lập trình.</li>
+<li>Tạo thêm nhiều deep learning models, bao gồm VGG và ResNet</li>
+<li>Thêm IO classes để đọc/viết tập tin và mã hoá/giải mã dữ liệu</li>
+<li>Các thành phần network communication mới trực tiếp từ Socket.</li>
+<li>Cudnn V5 với Dropout và RNN layers.</li>
+<li>Thay thế công cụ xây dựng website từ maven sang Sphinx</li>
+<li>Tích hợp Travis-CI</li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="incubating-v030-20-april-2016"></a><a href="#incubating-v030-20-april-2016" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
+<ul>
+<li><a href="https://archive.apache.org/dist/incubator/singa/0.3.0/apache-singa-incubating-0.3.0.tar.gz">Apache SINGA 0.3.0 (incubating)</a>
+<a href="https://archive.apache.org/dist/incubator/singa/0.3.0/apache-singa-incubating-0.3.0.tar.gz.md5">[MD5]</a>
+<a href="https://archive.apache.org/dist/incubator/singa/0.3.0/apache-singa-incubating-0.3.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_0.3.0.html">Release Notes 0.3.0 (incubating)</a></li>
+<li>Các tính năng mới và thay đổi chính,
+<ul>
+<li>Training trên nhóm máy GPU: cho phép training các deep learning models trên một nhóm máy GPU</li>
+<li>Cải thiện Python wrapper khiến cho job configuration trở nên dễ dàng, bao gồm
+neural net và thuật toán SGD.</li>
+<li>Thêm cập nhật SGD updaters mới, bao gồm Adam, AdaDelta và AdaMax.</li>
+<li>Cài đặt cần ít dependent libraries hơn cho mỗi node training.</li>
+<li>Đa dạng training với CPU và GPU.</li>
+<li>Hỗ trợ cuDNN V4.</li>
+<li>Tìm nạp trước dữ liệu.</li>
+<li>Sửa lỗi nếu có.</li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="incubating-v020-14-january-2016"></a><a href="#incubating-v020-14-january-2016" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
+<ul>
+<li><a href="https://archive.apache.org/dist/incubator/singa/0.2.0/apache-singa-incubating-0.2.0.tar.gz">Apache SINGA 0.2.0 (incubating)</a>
+<a href="https://archive.apache.org/dist/incubator/singa/0.2.0/apache-singa-incubating-0.2.0.tar.gz.md5">[MD5]</a>
+<a href="https://archive.apache.org/dist/incubator/singa/0.2.0/apache-singa-incubating-0.2.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_0.2.0.html">Release Notes 0.2.0 (incubating)</a></li>
+<li>Các tính năng mới và thay đổi chính,
+<ul>
+<li>Training trên GPU cho phép training các models phức tạp trên một node với nhiều card GPU.</li>
+<li>Chia nhỏ Hybrid neural net hỗ trợ dữ liệu và model song song cùng lúc.</li>
+<li>Cải thiện Python wrapper khiến cho job configuration trở nên dễ dàng, bao gồm
+neural net và thuật toán SGD.</li>
+<li>Áp dụng RNN model và thuật toán BPTT để hỗ trợ các ứng dụng dựa trên
+RNN models, e.g., GRU.</li>
+<li>Tích hợp các phần mêm đám mây bao gồm Mesos, Docker và HDFS.</li>
+<li>Cung cấp hình ảnh cấu trúc neural net và thông tin layer, hỗ trợ việc sửa lỗi.</li>
+<li>Hàm Linear algebra và các hàm  ngẫu nhiên không dùng Blobs và chỉ điểm dữ liệu thô.</li>
+<li>Tạo layers mới, bao gồm SoftmaxLayer, ArgSortLayer, DummyLayer, RNN layers và
+cuDNN layers.</li>
+<li>Cập nhật Layer class để chứa nhiều data/grad Blobs.</li>
+<li>Trích xuất các features và thử nghiệm hiệu quả cho dữ liệu mới bằng cách tải các tham số model đã được train từ trước.</li>
+<li>Thêm Store class cho hàm IO operations.</li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="incubating-v010-8-october-2015"></a><a href="#incubating-v010-8-october-2015" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
+<ul>
+<li><a href="https://archive.apache.org/dist/incubator/singa/apache-singa-incubating-0.1.0.tar.gz">Apache SINGA 0.1.0 (incubating)</a>
+<a href="https://archive.apache.org/dist/incubator/singa/apache-singa-incubating-0.1.0.tar.gz.md5">[MD5]</a>
+<a href="https://archive.apache.org/dist/incubator/singa/apache-singa-incubating-0.1.0.tar.gz.asc">[ASC]</a></li>
+<li><a href="https://console.aws.amazon.com/ec2/v2/home?region=ap-southeast-1#LaunchInstanceWizard:ami=ami-b41001e6">Amazon EC2 image</a></li>
+<li><a href="http://singa.apache.org/docs/releases/RELEASE_NOTES_0.1.0.html">Release Notes 0.1.0 (incubating)</a></li>
+<li>Các thay đổi chính gồm có,
+<ul>
+<li>Cài đặt sử dụng tiện ích GNU build</li>
+<li>Tập lệnh cho job management với zookeeper</li>
+<li>Lập trình model dựa trên NeuralNet và trích xuất Layer.</li>
+<li>Kết cấu hệ thống dựa trên Worker, Server và Stub.</li>
+<li>Training models từ ba model khác nhau, là feed-forward
+models, energy models và RNN models.</li>
+<li>Đồng bộ và không đồng bộ và không đồng bộ distributed training frameworks sử dụng CPU</li>
+<li>Điểm kiểm tra (Checkpoint) và khôi phục</li>
+<li>Kiểm tra đơn vị sử dụng gtest</li>
+</ul></li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/time-profiling"><span class="arrow-prev">← </span><span>Time Profiling</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/build"><span>Build SINGA from Source</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#kiểm-chứng">Kiểm Chứng</a></li><li><a href="#v310-30-tháng-10-năm-2020">V3.1.0 (30 tháng 10  [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/examples.html b/content/docs/3.1.0_Viet/examples.html
new file mode 100644
index 0000000..3384a56
--- /dev/null
+++ b/content/docs/3.1.0_Viet/examples.html
@@ -0,0 +1,168 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Ví Dụ · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright ownership [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/examples.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Ví Dụ</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agr [...]
+<p>Phần này đưa ra một vài ví dụ về việc thực hiện deep learning sử dụng SINGA. Mã nguồn (source code) được cung cấp trong SINGA repo trên
+<a href="https://github.com/apache/singa/tree/master/examples">Github</a>. Có thể tham khảo các ví dụ sử dụng SINGA Python APIs trên CPU hoặc một GPU trên
+<a href="https://colab.research.google.com/">Google Colab</a>. Bạn có thể trực tiếp chạy thử trên
+Google Cloud mà không cần tạo local environment. Đường dẫn tới mỗi ví dụ được cung cấp dưới đây.</p>
+<h2><a class="anchor" aria-hidden="true" id="image-classification"></a><a href="#image-classification" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<table>
+<thead>
+<tr><th>Model</th><th>Dataset</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td>CNN cơ bản</td><td>MNIST, CIFAR10, CIFAR100</td><td><a href="https://colab.research.google.com/drive/1fbGUs1AsoX6bU5F745RwQpohP4bHTktq">Colab</a></td></tr>
+<tr><td>AlexNet</td><td>ImageNet</td><td><a href="">Cpp</a></td></tr>
+<tr><td>VGG</td><td>ImageNet</td><td><a href="">Cpp</a>, <a href="">Python</a>, <a href="https://colab.research.google.com/drive/14kxgRKtbjPCKKsDJVNi3AvTev81Gp_Ds">Colab</a></td></tr>
+<tr><td>XceptionNet</td><td>MNIST, CIFAR10, CIFAR100</td><td><a href="">Python</a></td></tr>
+<tr><td>ResNet</td><td>MNIST, CIFAR10, CIFAR100, CIFAR10</td><td><a href="">Python</a>, <a href="https://colab.research.google.com/drive/1u1RYefSsVbiP4I-5wiBKHjsT9L0FxLm9">Colab</a></td></tr>
+<tr><td>MobileNet</td><td>ImageNet</td><td><a href="https://colab.research.google.com/drive/1HsixqJMIpKyEPhkbB8jy7NwNEFEAUWAf">Colab</a></td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="object-detection"></a><a href="#object-detection" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<table>
+<thead>
+<tr><th>Model</th><th>Dataset</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td>Tiny YOLOv2</td><td>Pascal VOC</td><td><a href="https://colab.research.google.com/drive/11V4I6cRjIJNUv5ZGsEGwqHuoQEie6b1T">Colab</a></td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="nhận-diện-khuôn-mặt-và-cảm-xúc"></a><a href="#nhận-diện-khuôn-mặt-và-cảm-xúc" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
+<table>
+<thead>
+<tr><th>Model</th><th>Dataset</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td>ArcFace</td><td>Refined MS-Celeb-1M</td><td><a href="https://colab.research.google.com/drive/1qanaqUKGIDtifdzEzJOHjEj4kYzA9uJC">Colab</a></td></tr>
+<tr><td>Emotion FerPlus</td><td><a href="https://www.kaggle.com/c/challenges-in-representation-learning-facial-expression-recognition-challenge/data">Facial Expression Recognition Challenge</a></td><td><a href="https://colab.research.google.com/drive/1XHtBQGRhe58PDi4LGYJzYueWBeWbO23r">Colab</a></td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="image-generation"></a><a href="#image-generation" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<table>
+<thead>
+<tr><th>Model</th><th>Dataset</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td>GAN</td><td>MNIST</td><td><a href="https://colab.research.google.com/drive/1f86MNDW47DJqHoIqWD1tOxcyx2MWys8L">Colab</a></td></tr>
+<tr><td>LSGAN</td><td>MNIST</td><td><a href="https://colab.research.google.com/drive/1C6jNRf28vnFOI9JVM4lpkJPqxsnhxdol">Colab</a></td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="machine-comprehension"></a><a href="#machine-comprehension" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
+<table>
+<thead>
+<tr><th>Model</th><th>Dataset</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td>Bert-Squad</td><td><a href="https://rajpurkar.github.io/SQuAD-explorer/explore/1.1/dev/">SQuAD v1.1</a></td><td><a href="https://colab.research.google.com/drive/1kud-lUPjS_u-TkDAzihBTw0Vqr0FjCE-">Colab</a></td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="text-classification"></a><a href="#text-classification" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<table>
+<thead>
+<tr><th>Model</th><th>Dataset</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td>Simple LSTM</td><td>IMDB</td><td><a href="">python</a></td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="text-ranking"></a><a href="#text-ranking" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<table>
+<thead>
+<tr><th>Model</th><th>Dataset</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td>BiLSTM</td><td>InsuranceQA</td><td><a href="">python</a></td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="misc"></a><a href="#misc" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
+<ul>
+<li>Restricted Boltzmann Machine sử dụng dữ liệu MNIST, <a href="">nguồn</a>,
+<a href="https://colab.research.google.com/drive/19996noGu9JyHHkVmp4edBGu7PJSRQKsd">Colab</a>.</li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/software-stack"><span class="arrow-prev">← </span><span>Software Stack</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/device"><span>Device</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#image-classification">Image Classification</a></li><li><a href="#object-detection">Object Detection</a></li> [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/examples/index.html b/content/docs/3.1.0_Viet/examples/index.html
new file mode 100644
index 0000000..3384a56
--- /dev/null
+++ b/content/docs/3.1.0_Viet/examples/index.html
@@ -0,0 +1,168 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Ví Dụ · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright ownership [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/examples.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Ví Dụ</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agr [...]
+<p>Phần này đưa ra một vài ví dụ về việc thực hiện deep learning sử dụng SINGA. Mã nguồn (source code) được cung cấp trong SINGA repo trên
+<a href="https://github.com/apache/singa/tree/master/examples">Github</a>. Có thể tham khảo các ví dụ sử dụng SINGA Python APIs trên CPU hoặc một GPU trên
+<a href="https://colab.research.google.com/">Google Colab</a>. Bạn có thể trực tiếp chạy thử trên
+Google Cloud mà không cần tạo local environment. Đường dẫn tới mỗi ví dụ được cung cấp dưới đây.</p>
+<h2><a class="anchor" aria-hidden="true" id="image-classification"></a><a href="#image-classification" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<table>
+<thead>
+<tr><th>Model</th><th>Dataset</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td>CNN cơ bản</td><td>MNIST, CIFAR10, CIFAR100</td><td><a href="https://colab.research.google.com/drive/1fbGUs1AsoX6bU5F745RwQpohP4bHTktq">Colab</a></td></tr>
+<tr><td>AlexNet</td><td>ImageNet</td><td><a href="">Cpp</a></td></tr>
+<tr><td>VGG</td><td>ImageNet</td><td><a href="">Cpp</a>, <a href="">Python</a>, <a href="https://colab.research.google.com/drive/14kxgRKtbjPCKKsDJVNi3AvTev81Gp_Ds">Colab</a></td></tr>
+<tr><td>XceptionNet</td><td>MNIST, CIFAR10, CIFAR100</td><td><a href="">Python</a></td></tr>
+<tr><td>ResNet</td><td>MNIST, CIFAR10, CIFAR100, CIFAR10</td><td><a href="">Python</a>, <a href="https://colab.research.google.com/drive/1u1RYefSsVbiP4I-5wiBKHjsT9L0FxLm9">Colab</a></td></tr>
+<tr><td>MobileNet</td><td>ImageNet</td><td><a href="https://colab.research.google.com/drive/1HsixqJMIpKyEPhkbB8jy7NwNEFEAUWAf">Colab</a></td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="object-detection"></a><a href="#object-detection" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<table>
+<thead>
+<tr><th>Model</th><th>Dataset</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td>Tiny YOLOv2</td><td>Pascal VOC</td><td><a href="https://colab.research.google.com/drive/11V4I6cRjIJNUv5ZGsEGwqHuoQEie6b1T">Colab</a></td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="nhận-diện-khuôn-mặt-và-cảm-xúc"></a><a href="#nhận-diện-khuôn-mặt-và-cảm-xúc" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
+<table>
+<thead>
+<tr><th>Model</th><th>Dataset</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td>ArcFace</td><td>Refined MS-Celeb-1M</td><td><a href="https://colab.research.google.com/drive/1qanaqUKGIDtifdzEzJOHjEj4kYzA9uJC">Colab</a></td></tr>
+<tr><td>Emotion FerPlus</td><td><a href="https://www.kaggle.com/c/challenges-in-representation-learning-facial-expression-recognition-challenge/data">Facial Expression Recognition Challenge</a></td><td><a href="https://colab.research.google.com/drive/1XHtBQGRhe58PDi4LGYJzYueWBeWbO23r">Colab</a></td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="image-generation"></a><a href="#image-generation" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<table>
+<thead>
+<tr><th>Model</th><th>Dataset</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td>GAN</td><td>MNIST</td><td><a href="https://colab.research.google.com/drive/1f86MNDW47DJqHoIqWD1tOxcyx2MWys8L">Colab</a></td></tr>
+<tr><td>LSGAN</td><td>MNIST</td><td><a href="https://colab.research.google.com/drive/1C6jNRf28vnFOI9JVM4lpkJPqxsnhxdol">Colab</a></td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="machine-comprehension"></a><a href="#machine-comprehension" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
+<table>
+<thead>
+<tr><th>Model</th><th>Dataset</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td>Bert-Squad</td><td><a href="https://rajpurkar.github.io/SQuAD-explorer/explore/1.1/dev/">SQuAD v1.1</a></td><td><a href="https://colab.research.google.com/drive/1kud-lUPjS_u-TkDAzihBTw0Vqr0FjCE-">Colab</a></td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="text-classification"></a><a href="#text-classification" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<table>
+<thead>
+<tr><th>Model</th><th>Dataset</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td>Simple LSTM</td><td>IMDB</td><td><a href="">python</a></td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="text-ranking"></a><a href="#text-ranking" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<table>
+<thead>
+<tr><th>Model</th><th>Dataset</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td>BiLSTM</td><td>InsuranceQA</td><td><a href="">python</a></td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="misc"></a><a href="#misc" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
+<ul>
+<li>Restricted Boltzmann Machine sử dụng dữ liệu MNIST, <a href="">nguồn</a>,
+<a href="https://colab.research.google.com/drive/19996noGu9JyHHkVmp4edBGu7PJSRQKsd">Colab</a>.</li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/software-stack"><span class="arrow-prev">← </span><span>Software Stack</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/device"><span>Device</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#image-classification">Image Classification</a></li><li><a href="#object-detection">Object Detection</a></li> [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/git-workflow.html b/content/docs/3.1.0_Viet/git-workflow.html
new file mode 100644
index 0000000..fe8a8d8
--- /dev/null
+++ b/content/docs/3.1.0_Viet/git-workflow.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Quy Trình Sử Dụng Git · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding cop [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/git-workflow.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Quy Trình Sử Dụng Git</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more con [...]
+<h2><a class="anchor" aria-hidden="true" id="dành-cho-lập-trình-viên"></a><a href="#dành-cho-lập-trình-viên" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
+<ol>
+<li><p>Fork <a href="https://github.com/apache/singa">SINGA Github repository</a> về tài khoản Github của bạn.</p></li>
+<li><p>Clone <strong>repo</strong> (viết tắt của repository) từ tài khoản Github của bạn</p>
+<pre><code class="hljs css language-shell">git clone https://github.com/&lt;Github account&gt;/singa.git
+git remote add upstream https://github.com/apache/singa.git
+</code></pre></li>
+<li><p>Tạo branch mới (vd., <code>feature-foo</code> hoặc <code>fixbug-foo</code>), chỉnh sửa và
+commit code của bạn ở đây .</p>
+<pre><code class="hljs css language-shell">git checkout dev
+git checkout -b feature-foo
+<span class="hljs-meta">#</span><span class="bash"> write your code</span>
+git add &lt;created/updated files&gt;
+git commit
+</code></pre>
+<p>Nội dung lệnh commit nên bao gồm:</p>
+<ul>
+<li>Tiêu đề (Title) mô tả.</li>
+<li>Mô tả chi tiết. Nếu lệnh commit là sửa lỗi (bugs), tốt nhất là nên
+bao gồm việc mô tả ngắn gọn lại vấn đề. Nếu thêm tính năng mới, có thể bao gồm động cơ thúc đẩy/mục đích của
+tính năng mới này.</li>
+</ul>
+<p>Nếu branch của bạn có nhiều commits nhỏ, bạn cần súc tích lại các commits bằng cách</p>
+<pre><code class="hljs css language-shell">git rebase -i &lt;commit id&gt;
+</code></pre>
+<p>Bạn có thể
+<a href="https://help.github.com/en/articles/about-git-rebase">squash và reword</a> các
+commits.</p></li>
+<li><p>Khi bạn đang xử lý các mã code, branch <code>dev</code> của SINGA có thể đang được cập nhật bởi người khác;
+Trong trường hợp này, bạn cần pull dev mới nhất</p>
+<pre><code class="hljs css language-shell">git checkout dev
+git pull upstream dev:dev
+</code></pre></li>
+<li><p><a href="https://git-scm.com/book/en/v2/Git-Branching-Rebasing">Rebase</a> <code>feature-foo</code>
+vào branch <code>dev</code> và push commits vào tài khoản Github của bạn (
+branch mới). Lệnh rebase nhằm giúp cho lịch sử commit của bạn rõ ràng. Các lệnh git dưới đây nên
+được thực hiện sau khi bạn commit các việc làm của mình:</p>
+<pre><code class="hljs css language-shell">git checkout feature-foo
+git rebase dev
+git push origin feature-foo:feature-foo
+</code></pre>
+<p>Lệnh rebase thực hiện các
+<a href="https://git-scm.com/book/en/v2/Git-Branching-Rebasing">bước sau</a>:
+&quot;Lệnh này thực hiện bắt đầu từ hình thái ban đầu của hai branches
+(mà bạn đang sử dụng hoặc bạn đang rebase vào), xác định sự khác nhau
+ở mỗi commit của branch bạn đang sử dụng, lưu các điểm khác nhau vào
+tập tin tạm thời, điều chỉnh branch hiện tại để có cùng commit với
+branch mà bạn đang rebase vào, rồi cuối cùng áp dụng từng thay đổi một theo thứ tự.&quot;
+Bởi vậy, sau khi thực hiện, bạn sẽ vẫn ở feature branch, nhưng commit IDs/hashes
+của bạn được thay đổi do các điểm khác nhau đã được commit trong quá trình rebase;
+và branch của bạn giờ đây chứa bản code cập nhật nhất từ branch dev và branch của bạn.</p></li>
+<li><p>Tạo một pull request (PR) vào branch dev của apache/singa trên website Github.
+Nếu bạn muốn thông báo cho các thành viên khác đang làm việc trên cùng một tập tin,
+bạn có thể tìm tập tin đó trên Github và nhấn vào &quot;Blame&quot; để xem chú thích từng dòng một
+ai đã thay đổi code lần cuối cùng. Sau đó, bạn có thể thêm @username trong mục mô tả PR
+để nhắc họ. Hãy nói rõ rằng những đóng góp này là công sức của bạn và rằng bạn cấp bản quyền
+công sức này cho dự án theo dạng bản quyền dự án mở. Những commits khác (vd., sửa lỗi)
+vào branch mới này sẽ được tự động cập nhật vào pull request của bạn bởi Github.</p></li>
+<li><p>Đợi thành viên xét duyệt PR. Trong quá trình này, dev branch của SINGA có thể được những người khác cập nhật,
+do vậy bạn cần phải <a href="https://docs.fast.ai/dev/git.html#how-to-keep-your-feature-branch-up-to-date">merge the latest dev</a>
+để xử lý các conflicts. Một số người
+<a href="https://github.com/edx/edx-platform/wiki/How-to-Rebase-a-Pull-Request">rebase PR vào branch dev mới nhất</a>
+thay vì merging. Tuy nhiên, nếu các thành viên khác fetch PR này để thêm các tính năng mới rồi gửi PR, việc rebase sẽ gây ra <strong>duplicate commits</strong> (với hash khác) ở PR mới. Xem
+<a href="https://www.atlassian.com/git/tutorials/merging-vs-rebasing">Nguyên tắc vàng để Rebasing</a>
+để biết thêm chi tiết khi nào cần tránh rebase. Một giải pháp đơn giản để cập nhật PR (nhằm xử lý conflicts hay lỗi commit) là checkout một branch mới từ branch dev cập nhật nhất của Apache SINGAS repo; copy và paste các mã code được cập nhật/thêm vào; commit và gửi một PR mới.</p></li>
+</ol>
+<h2><a class="anchor" aria-hidden="true" id="dành-cho-commiters"></a><a href="#dành-cho-commiters" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<p>Commiters có thể merge pull requests (PRs) vào dev branch của repo upstream.
+Trước khi merge mỗi PR, committer nên</p>
+<ul>
+<li>kiểm tra thông điệp commit (nội dung và định dạng)</li>
+<li>kiểm tra những thay đổi so với code hiện tại. Thay đổi về API nên được ghi lại.</li>
+<li>kiểm tra kết quả Travis testing cho định dạng mã code/tài liệu và unit tests</li>
+</ul>
+<p>Có hai cách để merge một pull request:</p>
+<ul>
+<li><p>Trên Github. Làm theo <a href="https://gitbox.apache.org/setup/">hướng dẫn</a> để
+kết nối tài khoản Apache với tài khoản Github của bạn. Sau đó bạn có thể trực tiếp
+merge PRs trên GitHub.</p></li>
+<li><p>Để merge pull request <a href="https://github.com/apache/singa/pull/xxx">https://github.com/apache/singa/pull/xxx</a> qua command
+line, thực hiện theo hướng dẫn sau:</p>
+<pre><code class="hljs css language-shell">git clone https://github.com/apache/singa.git
+git remote add asf https://gitbox.apache.org/repos/asf/singa.git
+git fetch origin pull/xxx/head:prxxx
+git checkout dev
+git merge --no-ff prxxx
+git push asf dev:dev
+</code></pre>
+<p>Không sử dụng rebase để merge PR; và vô hiệu hoá fast forward.</p></li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/how-to-release"><span class="arrow-prev">← </span><span>How to Prepare a Release</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#dành-cho-lập-trình-viên">Dành cho Lập Trình Viên</a></li><li><a href="#dành-cho-commiters">Dành cho commiters</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" cla [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/git-workflow/index.html b/content/docs/3.1.0_Viet/git-workflow/index.html
new file mode 100644
index 0000000..fe8a8d8
--- /dev/null
+++ b/content/docs/3.1.0_Viet/git-workflow/index.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Quy Trình Sử Dụng Git · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding cop [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/git-workflow.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Quy Trình Sử Dụng Git</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more con [...]
+<h2><a class="anchor" aria-hidden="true" id="dành-cho-lập-trình-viên"></a><a href="#dành-cho-lập-trình-viên" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
+<ol>
+<li><p>Fork <a href="https://github.com/apache/singa">SINGA Github repository</a> về tài khoản Github của bạn.</p></li>
+<li><p>Clone <strong>repo</strong> (viết tắt của repository) từ tài khoản Github của bạn</p>
+<pre><code class="hljs css language-shell">git clone https://github.com/&lt;Github account&gt;/singa.git
+git remote add upstream https://github.com/apache/singa.git
+</code></pre></li>
+<li><p>Tạo branch mới (vd., <code>feature-foo</code> hoặc <code>fixbug-foo</code>), chỉnh sửa và
+commit code của bạn ở đây .</p>
+<pre><code class="hljs css language-shell">git checkout dev
+git checkout -b feature-foo
+<span class="hljs-meta">#</span><span class="bash"> write your code</span>
+git add &lt;created/updated files&gt;
+git commit
+</code></pre>
+<p>Nội dung lệnh commit nên bao gồm:</p>
+<ul>
+<li>Tiêu đề (Title) mô tả.</li>
+<li>Mô tả chi tiết. Nếu lệnh commit là sửa lỗi (bugs), tốt nhất là nên
+bao gồm việc mô tả ngắn gọn lại vấn đề. Nếu thêm tính năng mới, có thể bao gồm động cơ thúc đẩy/mục đích của
+tính năng mới này.</li>
+</ul>
+<p>Nếu branch của bạn có nhiều commits nhỏ, bạn cần súc tích lại các commits bằng cách</p>
+<pre><code class="hljs css language-shell">git rebase -i &lt;commit id&gt;
+</code></pre>
+<p>Bạn có thể
+<a href="https://help.github.com/en/articles/about-git-rebase">squash và reword</a> các
+commits.</p></li>
+<li><p>Khi bạn đang xử lý các mã code, branch <code>dev</code> của SINGA có thể đang được cập nhật bởi người khác;
+Trong trường hợp này, bạn cần pull dev mới nhất</p>
+<pre><code class="hljs css language-shell">git checkout dev
+git pull upstream dev:dev
+</code></pre></li>
+<li><p><a href="https://git-scm.com/book/en/v2/Git-Branching-Rebasing">Rebase</a> <code>feature-foo</code>
+vào branch <code>dev</code> và push commits vào tài khoản Github của bạn (
+branch mới). Lệnh rebase nhằm giúp cho lịch sử commit của bạn rõ ràng. Các lệnh git dưới đây nên
+được thực hiện sau khi bạn commit các việc làm của mình:</p>
+<pre><code class="hljs css language-shell">git checkout feature-foo
+git rebase dev
+git push origin feature-foo:feature-foo
+</code></pre>
+<p>Lệnh rebase thực hiện các
+<a href="https://git-scm.com/book/en/v2/Git-Branching-Rebasing">bước sau</a>:
+&quot;Lệnh này thực hiện bắt đầu từ hình thái ban đầu của hai branches
+(mà bạn đang sử dụng hoặc bạn đang rebase vào), xác định sự khác nhau
+ở mỗi commit của branch bạn đang sử dụng, lưu các điểm khác nhau vào
+tập tin tạm thời, điều chỉnh branch hiện tại để có cùng commit với
+branch mà bạn đang rebase vào, rồi cuối cùng áp dụng từng thay đổi một theo thứ tự.&quot;
+Bởi vậy, sau khi thực hiện, bạn sẽ vẫn ở feature branch, nhưng commit IDs/hashes
+của bạn được thay đổi do các điểm khác nhau đã được commit trong quá trình rebase;
+và branch của bạn giờ đây chứa bản code cập nhật nhất từ branch dev và branch của bạn.</p></li>
+<li><p>Tạo một pull request (PR) vào branch dev của apache/singa trên website Github.
+Nếu bạn muốn thông báo cho các thành viên khác đang làm việc trên cùng một tập tin,
+bạn có thể tìm tập tin đó trên Github và nhấn vào &quot;Blame&quot; để xem chú thích từng dòng một
+ai đã thay đổi code lần cuối cùng. Sau đó, bạn có thể thêm @username trong mục mô tả PR
+để nhắc họ. Hãy nói rõ rằng những đóng góp này là công sức của bạn và rằng bạn cấp bản quyền
+công sức này cho dự án theo dạng bản quyền dự án mở. Những commits khác (vd., sửa lỗi)
+vào branch mới này sẽ được tự động cập nhật vào pull request của bạn bởi Github.</p></li>
+<li><p>Đợi thành viên xét duyệt PR. Trong quá trình này, dev branch của SINGA có thể được những người khác cập nhật,
+do vậy bạn cần phải <a href="https://docs.fast.ai/dev/git.html#how-to-keep-your-feature-branch-up-to-date">merge the latest dev</a>
+để xử lý các conflicts. Một số người
+<a href="https://github.com/edx/edx-platform/wiki/How-to-Rebase-a-Pull-Request">rebase PR vào branch dev mới nhất</a>
+thay vì merging. Tuy nhiên, nếu các thành viên khác fetch PR này để thêm các tính năng mới rồi gửi PR, việc rebase sẽ gây ra <strong>duplicate commits</strong> (với hash khác) ở PR mới. Xem
+<a href="https://www.atlassian.com/git/tutorials/merging-vs-rebasing">Nguyên tắc vàng để Rebasing</a>
+để biết thêm chi tiết khi nào cần tránh rebase. Một giải pháp đơn giản để cập nhật PR (nhằm xử lý conflicts hay lỗi commit) là checkout một branch mới từ branch dev cập nhật nhất của Apache SINGAS repo; copy và paste các mã code được cập nhật/thêm vào; commit và gửi một PR mới.</p></li>
+</ol>
+<h2><a class="anchor" aria-hidden="true" id="dành-cho-commiters"></a><a href="#dành-cho-commiters" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<p>Commiters có thể merge pull requests (PRs) vào dev branch của repo upstream.
+Trước khi merge mỗi PR, committer nên</p>
+<ul>
+<li>kiểm tra thông điệp commit (nội dung và định dạng)</li>
+<li>kiểm tra những thay đổi so với code hiện tại. Thay đổi về API nên được ghi lại.</li>
+<li>kiểm tra kết quả Travis testing cho định dạng mã code/tài liệu và unit tests</li>
+</ul>
+<p>Có hai cách để merge một pull request:</p>
+<ul>
+<li><p>Trên Github. Làm theo <a href="https://gitbox.apache.org/setup/">hướng dẫn</a> để
+kết nối tài khoản Apache với tài khoản Github của bạn. Sau đó bạn có thể trực tiếp
+merge PRs trên GitHub.</p></li>
+<li><p>Để merge pull request <a href="https://github.com/apache/singa/pull/xxx">https://github.com/apache/singa/pull/xxx</a> qua command
+line, thực hiện theo hướng dẫn sau:</p>
+<pre><code class="hljs css language-shell">git clone https://github.com/apache/singa.git
+git remote add asf https://gitbox.apache.org/repos/asf/singa.git
+git fetch origin pull/xxx/head:prxxx
+git checkout dev
+git merge --no-ff prxxx
+git push asf dev:dev
+</code></pre>
+<p>Không sử dụng rebase để merge PR; và vô hiệu hoá fast forward.</p></li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/how-to-release"><span class="arrow-prev">← </span><span>How to Prepare a Release</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#dành-cho-lập-trình-viên">Dành cho Lập Trình Viên</a></li><li><a href="#dành-cho-commiters">Dành cho commiters</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" cla [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/graph.html b/content/docs/3.1.0_Viet/graph.html
new file mode 100644
index 0000000..ff46756
--- /dev/null
+++ b/content/docs/3.1.0_Viet/graph.html
@@ -0,0 +1,550 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Model · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright ownership. [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/graph.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Model</h1></header><article><div><span><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreeme [...]
+<p>Forward và backward propagation trong mạng thần kinh nhân tạo (neural network) có thể sử dụng
+một tập hợp các hàm như convolution và pooling. Mỗi hàm nhận một vài input <a href="./tensor">tensors</a> và áp dụng một <a href="./autograd">operator</a> để tạo output tensors.
+Bằng việc thể hiện mỗi operator là một node và mỗi tensor là một
+edge, tất cả dạng hàm tạo thành một computational graph. Với computational graph, tối
+ưu hoá tốc độ và bộ nhớ có thể được tiến hành bởi việc đưa vào thực hiện việc phân bổ/giải phóng bộ nhớ và thao tác
+một cách hợp lý.  Trong SINGA, người dùng chỉ cần xác định neural network model sử dụng API của hàm
+<a href="https://github.com/apache/singa/blob/master/python/singa/model.py">Model</a>.
+Graph được xây dựng và tối ưu hoá ở C++ phía sau một cách tự động.</p>
+<p>Theo đó, một mặt người dùng thực hiện network sử dụng API của hàm
+<a href="./graph">Model</a> tuân theo phong cách lập trình bắt buộc như PyTorch.
+Có điều khác với PyTorch phải tái tạo lại các thao tác ở mỗi vòng lặp, SINGA
+buffer các thao tác để tạo computational graph một cách đầy đủ (khi tính năng này được kích hoạt) sau vòng lặp đầu tiên. Do đó, mặt khác, SINGA có computational graph giống như được tạo bởi các libraries sử dụng lập trình khai báo
+(declarative programming), như TensorFlow. Nên nó được tối ưu hoá qua graph.</p>
+<h2><a class="anchor" aria-hidden="true" id="ví-dụ"></a><a href="#ví-dụ" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
+<p>Mã code sau mô phỏng việc sử dụng API của hàm <code>Model</code>.</p>
+<ol>
+<li>Áp dụng model mới như một tập con của Model class.</li>
+</ol>
+<pre><code class="hljs css language-Python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CNN</span><span class="hljs-params">(model.Model)</span>:</span>
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, num_classes=<span class="hljs-number">10</span>, num_channels=<span class="hljs-number">1</span>)</span>:</span>
+        super(CNN, self).__init__()
+        self.conv1 = layer.Conv2d(num_channels, <span class="hljs-number">20</span>, <span class="hljs-number">5</span>, padding=<span class="hljs-number">0</span>, activation=<span class="hljs-string">"RELU"</span>)
+        self.conv2 = layer.Conv2d(<span class="hljs-number">20</span>, <span class="hljs-number">50</span>, <span class="hljs-number">5</span>, padding=<span class="hljs-number">0</span>, activation=<span class="hljs-string">"RELU"</span>)
+        self.linear1 = layer.Linear(<span class="hljs-number">500</span>)
+        self.linear2 = layer.Linear(num_classes)
+        self.pooling1 = layer.MaxPool2d(<span class="hljs-number">2</span>, <span class="hljs-number">2</span>, padding=<span class="hljs-number">0</span>)
+        self.pooling2 = layer.MaxPool2d(<span class="hljs-number">2</span>, <span class="hljs-number">2</span>, padding=<span class="hljs-number">0</span>)
+        self.relu = layer.ReLU()
+        self.flatten = layer.Flatten()
+        self.softmax_cross_entropy = layer.SoftMaxCrossEntropy()
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(self, x)</span>:</span>
+        y = self.conv1(x)
+        y = self.pooling1(y)
+        y = self.conv2(y)
+        y = self.pooling2(y)
+        y = self.flatten(y)
+        y = self.linear1(y)
+        y = self.relu(y)
+        y = self.linear2(y)
+        <span class="hljs-keyword">return</span> y
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">train_one_batch</span><span class="hljs-params">(self, x, y)</span>:</span>
+        out = self.forward(x)
+        loss = self.softmax_cross_entropy(out, y)
+        self.optimizer(loss)
+        <span class="hljs-keyword">return</span> out, loss
+</code></pre>
+<ol start="2">
+<li>Tạo một instance cho model, optimizer, device, v.v. Compile model đó</li>
+</ol>
+<pre><code class="hljs css language-python">model = CNN()
+
+<span class="hljs-comment"># khởi tạo optimizer và đính nó vào model</span>
+sgd = opt.SGD(lr=<span class="hljs-number">0.005</span>, momentum=<span class="hljs-number">0.9</span>, weight_decay=<span class="hljs-number">1e-5</span>)
+model.set_optimizer(sgd)
+
+<span class="hljs-comment"># khởi tạo device</span>
+dev = device.create_cuda_gpu()
+
+<span class="hljs-comment"># input và target placeholders cho model</span>
+tx = tensor.Tensor((batch_size, <span class="hljs-number">1</span>, IMG_SIZE, IMG_SIZE), dev, tensor.float32)
+ty = tensor.Tensor((batch_size, num_classes), dev, tensor.int32)
+
+<span class="hljs-comment"># compile model trước khi training</span>
+model.compile([tx], is_train=<span class="hljs-literal">True</span>, use_graph=<span class="hljs-literal">True</span>, sequential=<span class="hljs-literal">False</span>)
+</code></pre>
+<ol start="3">
+<li>Train model theo vòng lặp</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">for</span> b <span class="hljs-keyword">in</span> range(num_train_batch):
+    <span class="hljs-comment"># tạo mini-batch tiếp theo</span>
+    x, y = ...
+
+    <span class="hljs-comment"># Copy dữ liệu vào input tensors</span>
+    tx.copy_from_numpy(x)
+    ty.copy_from_numpy(y)
+
+    <span class="hljs-comment"># Training với một batch</span>
+    out, loss = model(tx, ty)
+</code></pre>
+<p>Ví dụ này có trên Google Colab notebook
+<a href="https://colab.research.google.com/drive/1fbGUs1AsoX6bU5F745RwQpohP4bHTktq">tại đây</a>.</p>
+<p>Các ví dụ khác:</p>
+<ul>
+<li><a href="https://github.com/apache/singa/blob/master/examples/mlp/model.py">MLP</a></li>
+<li><a href="https://github.com/apache/singa/blob/master/examples/cnn/model/cnn.py">CNN</a></li>
+<li><a href="https://github.com/apache/singa/blob/master/examples/cnn/model/resnet.py">ResNet</a></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="thực-hiện"></a><a href="#thực-hiện" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
+<h3><a class="anchor" aria-hidden="true" id="xây-dựng-graph"></a><a href="#xây-dựng-graph" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>SINGA tạo computational graph qua 3 bước:</p>
+<ol>
+<li>Buffer các thao tác</li>
+<li>Phân tích hoạt động các thư viện sử dụng trong dự án (dependencies)</li>
+<li>Tạo nodes và edges dựa trên dependencies</li>
+</ol>
+<p>Sử dụng phép nhân ma trận từ dense layer của
+<a href="https://github.com/apache/singa/blob/master/examples/mlp/model.py">MLP model</a>
+làm ví dụ. Quá trình này gọi là hàm <code>forward</code> function của class MLP</p>
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MLP</span><span class="hljs-params">(model.Model)</span>:</span>
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, data_size=<span class="hljs-number">10</span>, perceptron_size=<span class="hljs-number">100</span>, num_classes=<span class="hljs-number">10</span>)</span>:</span>
+        super(MLP, self).__init__()
+        self.linear1 = layer.Linear(perceptron_size)
+        ...
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(self, inputs)</span>:</span>
+        y = self.linear1(inputs)
+        ...
+</code></pre>
+<p>Layer <code>Linear</code> tạo thành từ phép tính <code>mutmul</code>. <code>autograd</code> áp dụng phép <code>matmul</code> bằng cách gọi hàm <code>Mult</code> được lấy từ CPP qua SWIG.</p>
+<pre><code class="hljs css language-python"><span class="hljs-comment"># áp dụng matmul()</span>
+singa.Mult(inputs, w)
+</code></pre>
+<p>Từ phía sau, hàm <code>Mult</code> function được áp dụng bằng cách gọi <code>GEMV</code>, là một hàm CBLAS. thay vì gọi hàm <code>GEMV</code> trực tiếp, <code>Mult</code> gửi đi <code>GEMV</code> và đối số (argument) tới thiết bị (device) như sau,</p>
+<pre><code class="hljs css language-c++"><span class="hljs-comment">// Áp dụng Mult()</span>
+C-&gt;device()-&gt;Exec(
+    [a, A, b, B, CRef](Context *ctx) <span class="hljs-keyword">mutable</span> {
+        GEMV&lt;DType, Lang&gt;(a, A, B, b, &amp;CRef, ctx);
+    },
+    read_blocks, {C-&gt;block()});
+</code></pre>
+<p>Hàm <code>Exec</code> function của <code>Device</code> buffer hàm này và các đối số của nó. Thêm vào đó, nó cũng có thông tin về các block (một block là một đoạn bộ nhớ cho một tensor) để đọc và viết bởi hàm này.</p>
+<p>Sau khi <code>Model.forward()</code> được thực hiện xong một lần, tất cả quá trình được buffer bởi
+<code>Device</code>. Tiếp theo, thông tin đọc/viết của tất cả quá trình sẽ được phân tích để tạo computational graph.
+Ví dụ, nếu một block <code>b</code> được viết bởi quá trình 01 và sau đó được đọc bởi quá trình 02 khác, chúng ta sẽ biết 02 là dựa vào 01 và có edge trực tiếp từ A sang B, thể hiện qua block <code>b</code> (hoặc tensor của nó). Sau đó một graph không tuần hoàn sẽ được tạo ra như dưới đây.
+Graph chỉ được tạo ra một lần.</p>
+<p><img src="/docs/assets/GraphOfMLP.png" alt="Computational graph của MLP"></p>
+<p><br/><strong>Sơ đồ 1 - Ví dụ Computational graph của MLP.</strong></p>
+<h3><a class="anchor" aria-hidden="true" id="tối-ưu-hoá"></a><a href="#tối-ưu-hoá" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>Hiện nay, các tối ưu hoá sau được thực hiện dựa trên computational graph.</p>
+<p><strong>Phân bổ thụ động (Lazy allocation)</strong> Khi tensor/blocks được tạo ra, các thiết bị (devices) không phân bổ bộ nhớ cho chúng ngay lập tức. Thay vào đó, khi block được tiếp cận lần đầu tiên, bộ nhớ sẽ được phân bổ.</p>
+<p><strong>Tự động tái sử dụng (Automatic recycling)</strong> Đếm số của mỗi tensor/block được tính dựa trên graph. Trước khi thực hiện quá trình nào, đếm số là số lượng hàm đọc block này. Trong quá trình thực hiện, khi một hàm nào được tiến hành, đếm số của mỗi block đầu vào bị trừ đi 1. Nếu đếm số của một block bằng 0, thì block này sẽ không được đọc lại nữa trong toàn bộ quá trình còn lại. Bởi vậy, bộ nhớ của nó được giải phóng một cách an toàn. Thêm vào đó, SINGA theo dõi việc sử dụn [...]
+<p><strong>Chia sẻ bộ nhớ</strong> SINGA sử dụng memory pool, như là
+<a href="https://github.com/NVIDIA/cnmem">CnMem</a> để quản lý bộ nhớ CUDA. Với <em>Automatic
+recycling</em> và memory pool, SINGA có thể chia sẻ bộ nhớ giữa các tensor. Xem xét hai hàm <code>c = a + b</code> và <code>d=2xc</code>. Trước khi thực hiện hàm thứ hai, theo như <em>Lazy allocation</em> thì bộ nhớ của d nên được sử dụng. Cũng như <code>a</code>
+không được sử dụng ở toàn bộ quá trình còn lại. Theo Tự động sử dụng (Automatic recycling), block
+của <code>a</code> sẽ được giải phóng sau hàm đầu tiên. Vì thế, SINGA sẽ đề xuất bốn hàm tới CUDA stream: addition, free <code>a</code>, malloc <code>b</code>, và
+multiplication. Memory pool sau đó có thể chia sẻ bộ nhớ được <code>a</code>
+với <code>b</code> giải phóng thay vì yêu cầu GPU thực hiện real malloc cho <code>b</code>.</p>
+<p>Các kĩ thuật tối ưu hoá khác, ví dụ từ compliers, như common
+sub-expression elimination và parallelizing operations trên CUDA
+streams khác nhau cũng có thể được áp dụng.</p>
+<h2><a class="anchor" aria-hidden="true" id="toán-tử-operator-mới"></a><a href="#toán-tử-operator-mới" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<p>Mỗi toán tử được định nghĩa trong <code>autograd</code> module áp dụng hai hàm: forward và
+backward, được thực hiện bằng cách gọi toán tử (operator) từ backend. Để thêm một toán tử mới vào hàm <code>autograd</code>, bạn cần thêm nhiều toán tử ở backend.</p>
+<p>Lấy toán tử
+<a href="https://github.com/apache/singa/blob/master/python/singa/autograd.py">Conv2d</a>
+làm ví dụ, từ phía Python, hàm forward và backward được thực hiện bằng cách gọi các toán tử từ backend dựa trên loại
+device.</p>
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">_Conv2d</span><span class="hljs-params">(Operation)</span>:</span>
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(self, x, W, b=None)</span>:</span>
+        ......
+        <span class="hljs-keyword">if</span> training:
+            <span class="hljs-keyword">if</span> self.handle.bias_term:
+                self.inputs = (x, W, b) <span class="hljs-comment"># ghi chép x, W, b</span>
+            <span class="hljs-keyword">else</span>:
+                self.inputs = (x, W)
+
+        <span class="hljs-keyword">if</span> (type(self.handle) != singa.ConvHandle):
+            <span class="hljs-keyword">return</span> singa.GpuConvForward(x, W, b, self.handle)
+        <span class="hljs-keyword">else</span>:
+            <span class="hljs-keyword">return</span> singa.CpuConvForward(x, W, b, self.handle)
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">backward</span><span class="hljs-params">(self, dy)</span>:</span>
+        <span class="hljs-keyword">if</span> (type(self.handle) != singa.ConvHandle):
+            dx = singa.GpuConvBackwardx(dy, self.inputs[<span class="hljs-number">1</span>], self.inputs[<span class="hljs-number">0</span>],
+                                        self.handle)
+            dW = singa.GpuConvBackwardW(dy, self.inputs[<span class="hljs-number">0</span>], self.inputs[<span class="hljs-number">1</span>],
+                                        self.handle)
+            db = singa.GpuConvBackwardb(
+                dy, self.inputs[<span class="hljs-number">2</span>],
+                self.handle) <span class="hljs-keyword">if</span> self.handle.bias_term <span class="hljs-keyword">else</span> <span class="hljs-literal">None</span>
+        <span class="hljs-keyword">else</span>:
+            dx = singa.CpuConvBackwardx(dy, self.inputs[<span class="hljs-number">1</span>], self.inputs[<span class="hljs-number">0</span>],
+                                        self.handle)
+            dW = singa.CpuConvBackwardW(dy, self.inputs[<span class="hljs-number">0</span>], self.inputs[<span class="hljs-number">1</span>],
+                                        self.handle)
+            db = singa.CpuConvBackwardb(
+                dy, self.inputs[<span class="hljs-number">2</span>],
+                self.handle) <span class="hljs-keyword">if</span> self.handle.bias_term <span class="hljs-keyword">else</span> <span class="hljs-literal">None</span>
+        <span class="hljs-keyword">if</span> db:
+            <span class="hljs-keyword">return</span> dx, dW, db
+        <span class="hljs-keyword">else</span>:
+            <span class="hljs-keyword">return</span> dx, dW
+</code></pre>
+<p>Mỗi toán tử ở backend nên được thực hiện theo cách sau:</p>
+<ul>
+<li><p>Giả dụ toán từ là <code>foo()</code>; khi được thực hiện nên được gói vào trong một hàm khác, như <code>_foo()</code>. <code>foo()</code>
+chuyển <code>_foo</code> cùng với các đối số như một hàm lambda tới hàm <code>Device</code>'s <code>Exec</code> để buffer.
+Block để đọc và viết cũng được chuyển cho <code>Exec</code>.</p></li>
+<li><p>Tất cả đối số được sử dụng trong hàm lambda expression cần phải được thu thập dựa trên các nguyên tắc sau.</p>
+<ul>
+<li><p><code>thu thập bằng giá trị</code>: Nếu biến đối số (argument variable) là biến local hoặc sẽ được giải phóng ngay
+(như intermediate tensors). Hoặc, những biến số này sẽ bị loại bỏ khi <code>foo()</code> tồn tại.</p></li>
+<li><p><code>thu thập theo tham khảo</code>:Nếu biến số được ghi lại từ phía python hoặc một biến bất biến
+(như tham số W và ConvHand trong Conv2d class).</p></li>
+<li><p><code>mutable</code>: Biểu thức lambda expression nên có biến thẻ (mutable tag) nếu một biến được thu thập theo giá trị bị thay đổi trong hàm <code>_foo()</code></p></li>
+</ul></li>
+</ul>
+<p>Đây là một
+<a href="https://github.com/apache/singa/blob/master/src/model/operation/convolution.cc">ví dụ</a>
+về operator được áp dụng ở backend.</p>
+<pre><code class="hljs css language-c++"><span class="hljs-function">Tensor <span class="hljs-title">GpuConvBackwardx</span><span class="hljs-params">(<span class="hljs-keyword">const</span> Tensor &amp;dy, <span class="hljs-keyword">const</span> Tensor &amp;W, <span class="hljs-keyword">const</span> Tensor &amp;x,
+                        <span class="hljs-keyword">const</span> CudnnConvHandle &amp;cch)</span> </span>{
+  CHECK_EQ(dy.device()-&gt;lang(), kCuda);
+
+  Tensor dx;
+  dx.ResetLike(x);
+
+  dy.device()-&gt;Exec(
+      <span class="hljs-comment">/*
+       * dx is a local variable so it's captured by value
+       * dy is an intermediate tensor and isn't recorded on the python side
+       * W is an intermediate tensor but it's recorded on the python side
+       * chh is a variable and it's recorded on the python side
+       */</span>
+      [dx, dy, &amp;W, &amp;cch](Context *ctx) <span class="hljs-keyword">mutable</span> {
+        Block *wblock = W.block(), *dyblock = dy.block(), *dxblock = dx.block();
+        <span class="hljs-keyword">float</span> alpha = <span class="hljs-number">1.f</span>, beta = <span class="hljs-number">0.f</span>;
+        cudnnConvolutionBackwardData(
+            ctx-&gt;cudnn_handle, &amp;alpha, cch.filter_desc, wblock-&gt;data(),
+            cch.y_desc, dyblock-&gt;data(), cch.conv_desc, cch.bp_data_alg,
+            cch.workspace.block()-&gt;mutable_data(),
+            cch.workspace_count * <span class="hljs-keyword">sizeof</span>(<span class="hljs-keyword">float</span>), &amp;beta, cch.x_desc,
+            dxblock-&gt;mutable_data());
+      },
+      {dy.block(), W.block()}, {dx.block(), cch.workspace.block()});
+      <span class="hljs-comment">/* the lambda expression reads the blocks of tensor dy and w
+       * and writes the blocks of tensor dx and chh.workspace
+       */</span>
+
+  <span class="hljs-keyword">return</span> dx;
+}
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="điểm-chuẩn-benchmark"></a><a href="#điểm-chuẩn-benchmark" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<h3><a class="anchor" aria-hidden="true" id="trên-một-node"></a><a href="#trên-một-node" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<ul>
+<li>Thiết lập thí nghiệm
+<ul>
+<li>Model
+<ul>
+<li>Sử dụng layer: ResNet50 trong
+<a href="https://github.com/apache/singa/blob/master/examples/cnn/autograd/resnet_cifar10.py">resnet.py</a></li>
+<li>Sử dụng model: ResNet50 trong
+<a href="https://github.com/apache/singa/blob/master/examples/cnn/model/resnet.py">resnet.py</a></li>
+</ul></li>
+<li>GPU: NVIDIA RTX 2080Ti</li>
+</ul></li>
+<li>Kí hiệu
+<ul>
+<li><code>s</code> :giây (second)</li>
+<li><code>it</code> : vòng lặp (iteration)</li>
+<li><code>Mem</code>:sử dụng bộ nhớ tối đa trong một GPU</li>
+<li><code>Throughout</code>:số lượng hình ảnh được xử lý mỗi giây</li>
+<li><code>Time</code>:tổng thời gian</li>
+<li><code>Speed</code>:vòng lặp mỗi giây</li>
+<li><code>Reduction</code>:tốc độ giảm bộ nhớ sử dụng so với sử dụng layer</li>
+<li><code>Speedup</code>: tốc độ tăng tốc so với dev branch</li>
+</ul></li>
+<li>Kết quả
+  <table style="text-align: center">
+      <tr>
+          <th style="text-align: center">Batchsize</th>
+          <th style="text-align: center">Cases</th>
+          <th style="text-align: center">Mem(MB)</th>
+          <th style="text-align: center">Time(s)</th>
+          <th style="text-align: center">Speed(it/s)</th>
+          <th style="text-align: center">Throughput</th>
+          <th style="text-align: center">Reduction</th>
+          <th style="text-align: center">Speedup</th>
+      </tr>
+      <tr>
+          <td rowspan="4">16</td>
+          <td nowrap>layer</td>
+          <td>4975</td>
+          <td>14.1952</td>
+          <td>14.0893</td>
+          <td>225.4285</td>
+          <td>0.00%</td>
+          <td>1.0000</td>
+      </tr>
+      <tr>
+          <td nowrap>model:disable graph</td>
+          <td>4995</td>
+          <td>14.1264</td>
+          <td>14.1579</td>
+          <td>226.5261</td>
+          <td>-0.40%</td>
+          <td>1.0049</td>
+      </tr>
+      <tr>
+          <td nowrap>model:enable graph, bfs</td>
+          <td>3283</td>
+          <td>13.7438</td>
+          <td>14.5520</td>
+          <td>232.8318</td>
+          <td>34.01%</td>
+          <td>1.0328</td>
+      </tr>
+      <tr>
+          <td nowrap>model:enable graph, serial</td>
+          <td>3265</td>
+          <td>13.7420</td>
+          <td>14.5540</td>
+          <td>232.8635</td>
+          <td>34.37%</td>
+          <td>1.0330</td>
+      </tr>
+      <tr>
+          <td rowspan="4">32</td>
+          <td nowrap>layer</td>
+          <td>10119</td>
+          <td>13.4587</td>
+          <td>7.4302</td>
+          <td>237.7649</td>
+          <td>0.00%</td>
+          <td>1.0000</td>
+      </tr>
+      <tr>
+          <td nowrap>model:disable graph</td>
+          <td>10109</td>
+          <td>13.2952</td>
+          <td>7.5315</td>
+          <td>240.6875</td>
+          <td>0.10%</td>
+          <td>1.0123</td>
+      </tr>
+      <tr>
+          <td nowrap>model:enable graph, bfs</td>
+          <td>6839</td>
+          <td>13.1059</td>
+          <td>7.6302</td>
+          <td>244.1648</td>
+          <td>32.41%</td>
+          <td>1.0269</td>
+      </tr>
+      <tr>
+          <td nowrap>model:enable graph, serial</td>
+          <td>6845</td>
+          <td>13.0489</td>
+          <td>7.6635</td>
+          <td>245.2312</td>
+          <td>32.35%</td>
+          <td>1.0314</td>
+      </tr>
+  </table>
+</li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="đa-quá-trình-multi-processes"></a><a href="#đa-quá-trình-multi-processes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 [...]
+<ul>
+<li>Thiết lập thí nghiệm
+<ul>
+<li>API
+<ul>
+<li>Sử dụng Layer: ResNet50 trong
+<a href="https://github.com/apache/singa/blob/master/examples/cnn/autograd/resnet_dist.py">resnet_dist.py</a></li>
+<li>Sử dụng Model: ResNet50 trong
+<a href="https://github.com/apache/singa/blob/master/examples/cnn/model/resnet.py">resnet.py</a></li>
+</ul></li>
+<li>GPU: NVIDIA RTX 2080Ti * 2</li>
+<li>MPI: hai quá trình MPI trên một node</li>
+</ul></li>
+<li>Kí hiệu: như trên</li>
+<li>kết quả
+  <table style="text-align: center">
+      <tr>
+          <th style="text-align: center">Batchsize</th>
+          <th style="text-align: center">Cases</th>
+          <th style="text-align: center">Mem(MB)</th>
+          <th style="text-align: center">Time(s)</th>
+          <th style="text-align: center">Speed(it/s)</th>
+          <th style="text-align: center">Throughput</th>
+          <th style="text-align: center">Reduction</th>
+          <th style="text-align: center">Speedup</th>
+      </tr>
+      <tr>
+          <td rowspan="4">16</td>
+          <td nowrap>layer</td>
+          <td>5439</td>
+          <td>17.3323</td>
+          <td>11.5391</td>
+          <td>369.2522</td>
+          <td>0.00%</td>
+          <td>1.0000</td>
+      </tr>
+      <tr>
+          <td nowrap>model:disable graph</td>
+          <td>5427</td>
+          <td>17.8232</td>
+          <td>11.2213</td>
+          <td>359.0831</td>
+          <td>0.22%</td>
+          <td>0.9725</td>
+      </tr>
+      <tr>
+          <td nowrap>model:enable graph, bfs</td>
+          <td>3389</td>
+          <td>18.2310</td>
+          <td>10.9703</td>
+          <td>351.0504</td>
+          <td>37.69%</td>
+          <td>0.9507</td>
+      </tr>
+      <tr>
+          <td nowrap>model:enable graph, serial</td>
+          <td>3437</td>
+          <td>17.0389</td>
+          <td>11.7378</td>
+          <td>375.6103</td>
+          <td>36.81%</td>
+          <td>1.0172</td>
+      </tr>
+      <tr>
+          <td rowspan="4">32</td>
+          <td nowrap>layer</td>
+          <td>10547</td>
+          <td>14.8635</td>
+          <td>6.7279</td>
+          <td>430.5858</td>
+          <td>0.00%</td>
+          <td>1.0000</td>
+      </tr>
+      <tr>
+          <td nowrap>model:disable graph</td>
+          <td>10503</td>
+          <td>14.7746</td>
+          <td>6.7684</td>
+          <td>433.1748</td>
+          <td>0.42%</td>
+          <td>1.0060</td>
+      </tr>
+      <tr>
+          <td nowrap>model:enable graph, bfs</td>
+          <td>6935</td>
+          <td>14.8553</td>
+          <td>6.7316</td>
+          <td>430.8231</td>
+          <td>34.25%</td>
+          <td>1.0006</td>
+      </tr>
+      <tr>
+          <td nowrap>model:enable graph, serial</td>
+          <td>7027</td>
+          <td>14.3271</td>
+          <td>6.9798</td>
+          <td>446.7074</td>
+          <td>33.37%</td>
+          <td>1.0374</td>
+      </tr>
+  </table>
+</li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="kết-luận"></a><a href="#kết-luận" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<ul>
+<li>Training với computational graph giúp giảm đáng kể khối bộ nhớ.</li>
+<li>Hiện tại, tốc độ có cải thiện một chút. Nhiều tối ưu hoá có thể được thực hiện giúp tăng hiệu quả.</li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/optimizer"><span class="arrow-prev">← </span><span>Optimizer</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/onnx"><span>ONNX</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#ví-dụ">Ví Dụ</a></li><li><a href="#thực-hiện">Thực Hiện</a><ul class="toc-headings"><li><a href="#xây-dựng-graph">Xây Dựng [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/graph/index.html b/content/docs/3.1.0_Viet/graph/index.html
new file mode 100644
index 0000000..ff46756
--- /dev/null
+++ b/content/docs/3.1.0_Viet/graph/index.html
@@ -0,0 +1,550 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Model · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright ownership. [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/graph.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Model</h1></header><article><div><span><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreeme [...]
+<p>Forward và backward propagation trong mạng thần kinh nhân tạo (neural network) có thể sử dụng
+một tập hợp các hàm như convolution và pooling. Mỗi hàm nhận một vài input <a href="./tensor">tensors</a> và áp dụng một <a href="./autograd">operator</a> để tạo output tensors.
+Bằng việc thể hiện mỗi operator là một node và mỗi tensor là một
+edge, tất cả dạng hàm tạo thành một computational graph. Với computational graph, tối
+ưu hoá tốc độ và bộ nhớ có thể được tiến hành bởi việc đưa vào thực hiện việc phân bổ/giải phóng bộ nhớ và thao tác
+một cách hợp lý.  Trong SINGA, người dùng chỉ cần xác định neural network model sử dụng API của hàm
+<a href="https://github.com/apache/singa/blob/master/python/singa/model.py">Model</a>.
+Graph được xây dựng và tối ưu hoá ở C++ phía sau một cách tự động.</p>
+<p>Theo đó, một mặt người dùng thực hiện network sử dụng API của hàm
+<a href="./graph">Model</a> tuân theo phong cách lập trình bắt buộc như PyTorch.
+Có điều khác với PyTorch phải tái tạo lại các thao tác ở mỗi vòng lặp, SINGA
+buffer các thao tác để tạo computational graph một cách đầy đủ (khi tính năng này được kích hoạt) sau vòng lặp đầu tiên. Do đó, mặt khác, SINGA có computational graph giống như được tạo bởi các libraries sử dụng lập trình khai báo
+(declarative programming), như TensorFlow. Nên nó được tối ưu hoá qua graph.</p>
+<h2><a class="anchor" aria-hidden="true" id="ví-dụ"></a><a href="#ví-dụ" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
+<p>Mã code sau mô phỏng việc sử dụng API của hàm <code>Model</code>.</p>
+<ol>
+<li>Áp dụng model mới như một tập con của Model class.</li>
+</ol>
+<pre><code class="hljs css language-Python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CNN</span><span class="hljs-params">(model.Model)</span>:</span>
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, num_classes=<span class="hljs-number">10</span>, num_channels=<span class="hljs-number">1</span>)</span>:</span>
+        super(CNN, self).__init__()
+        self.conv1 = layer.Conv2d(num_channels, <span class="hljs-number">20</span>, <span class="hljs-number">5</span>, padding=<span class="hljs-number">0</span>, activation=<span class="hljs-string">"RELU"</span>)
+        self.conv2 = layer.Conv2d(<span class="hljs-number">20</span>, <span class="hljs-number">50</span>, <span class="hljs-number">5</span>, padding=<span class="hljs-number">0</span>, activation=<span class="hljs-string">"RELU"</span>)
+        self.linear1 = layer.Linear(<span class="hljs-number">500</span>)
+        self.linear2 = layer.Linear(num_classes)
+        self.pooling1 = layer.MaxPool2d(<span class="hljs-number">2</span>, <span class="hljs-number">2</span>, padding=<span class="hljs-number">0</span>)
+        self.pooling2 = layer.MaxPool2d(<span class="hljs-number">2</span>, <span class="hljs-number">2</span>, padding=<span class="hljs-number">0</span>)
+        self.relu = layer.ReLU()
+        self.flatten = layer.Flatten()
+        self.softmax_cross_entropy = layer.SoftMaxCrossEntropy()
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(self, x)</span>:</span>
+        y = self.conv1(x)
+        y = self.pooling1(y)
+        y = self.conv2(y)
+        y = self.pooling2(y)
+        y = self.flatten(y)
+        y = self.linear1(y)
+        y = self.relu(y)
+        y = self.linear2(y)
+        <span class="hljs-keyword">return</span> y
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">train_one_batch</span><span class="hljs-params">(self, x, y)</span>:</span>
+        out = self.forward(x)
+        loss = self.softmax_cross_entropy(out, y)
+        self.optimizer(loss)
+        <span class="hljs-keyword">return</span> out, loss
+</code></pre>
+<ol start="2">
+<li>Tạo một instance cho model, optimizer, device, v.v. Compile model đó</li>
+</ol>
+<pre><code class="hljs css language-python">model = CNN()
+
+<span class="hljs-comment"># khởi tạo optimizer và đính nó vào model</span>
+sgd = opt.SGD(lr=<span class="hljs-number">0.005</span>, momentum=<span class="hljs-number">0.9</span>, weight_decay=<span class="hljs-number">1e-5</span>)
+model.set_optimizer(sgd)
+
+<span class="hljs-comment"># khởi tạo device</span>
+dev = device.create_cuda_gpu()
+
+<span class="hljs-comment"># input và target placeholders cho model</span>
+tx = tensor.Tensor((batch_size, <span class="hljs-number">1</span>, IMG_SIZE, IMG_SIZE), dev, tensor.float32)
+ty = tensor.Tensor((batch_size, num_classes), dev, tensor.int32)
+
+<span class="hljs-comment"># compile model trước khi training</span>
+model.compile([tx], is_train=<span class="hljs-literal">True</span>, use_graph=<span class="hljs-literal">True</span>, sequential=<span class="hljs-literal">False</span>)
+</code></pre>
+<ol start="3">
+<li>Train model theo vòng lặp</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">for</span> b <span class="hljs-keyword">in</span> range(num_train_batch):
+    <span class="hljs-comment"># tạo mini-batch tiếp theo</span>
+    x, y = ...
+
+    <span class="hljs-comment"># Copy dữ liệu vào input tensors</span>
+    tx.copy_from_numpy(x)
+    ty.copy_from_numpy(y)
+
+    <span class="hljs-comment"># Training với một batch</span>
+    out, loss = model(tx, ty)
+</code></pre>
+<p>Ví dụ này có trên Google Colab notebook
+<a href="https://colab.research.google.com/drive/1fbGUs1AsoX6bU5F745RwQpohP4bHTktq">tại đây</a>.</p>
+<p>Các ví dụ khác:</p>
+<ul>
+<li><a href="https://github.com/apache/singa/blob/master/examples/mlp/model.py">MLP</a></li>
+<li><a href="https://github.com/apache/singa/blob/master/examples/cnn/model/cnn.py">CNN</a></li>
+<li><a href="https://github.com/apache/singa/blob/master/examples/cnn/model/resnet.py">ResNet</a></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="thực-hiện"></a><a href="#thực-hiện" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
+<h3><a class="anchor" aria-hidden="true" id="xây-dựng-graph"></a><a href="#xây-dựng-graph" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>SINGA tạo computational graph qua 3 bước:</p>
+<ol>
+<li>Buffer các thao tác</li>
+<li>Phân tích hoạt động các thư viện sử dụng trong dự án (dependencies)</li>
+<li>Tạo nodes và edges dựa trên dependencies</li>
+</ol>
+<p>Sử dụng phép nhân ma trận từ dense layer của
+<a href="https://github.com/apache/singa/blob/master/examples/mlp/model.py">MLP model</a>
+làm ví dụ. Quá trình này gọi là hàm <code>forward</code> function của class MLP</p>
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MLP</span><span class="hljs-params">(model.Model)</span>:</span>
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, data_size=<span class="hljs-number">10</span>, perceptron_size=<span class="hljs-number">100</span>, num_classes=<span class="hljs-number">10</span>)</span>:</span>
+        super(MLP, self).__init__()
+        self.linear1 = layer.Linear(perceptron_size)
+        ...
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(self, inputs)</span>:</span>
+        y = self.linear1(inputs)
+        ...
+</code></pre>
+<p>Layer <code>Linear</code> tạo thành từ phép tính <code>mutmul</code>. <code>autograd</code> áp dụng phép <code>matmul</code> bằng cách gọi hàm <code>Mult</code> được lấy từ CPP qua SWIG.</p>
+<pre><code class="hljs css language-python"><span class="hljs-comment"># áp dụng matmul()</span>
+singa.Mult(inputs, w)
+</code></pre>
+<p>Từ phía sau, hàm <code>Mult</code> function được áp dụng bằng cách gọi <code>GEMV</code>, là một hàm CBLAS. thay vì gọi hàm <code>GEMV</code> trực tiếp, <code>Mult</code> gửi đi <code>GEMV</code> và đối số (argument) tới thiết bị (device) như sau,</p>
+<pre><code class="hljs css language-c++"><span class="hljs-comment">// Áp dụng Mult()</span>
+C-&gt;device()-&gt;Exec(
+    [a, A, b, B, CRef](Context *ctx) <span class="hljs-keyword">mutable</span> {
+        GEMV&lt;DType, Lang&gt;(a, A, B, b, &amp;CRef, ctx);
+    },
+    read_blocks, {C-&gt;block()});
+</code></pre>
+<p>Hàm <code>Exec</code> function của <code>Device</code> buffer hàm này và các đối số của nó. Thêm vào đó, nó cũng có thông tin về các block (một block là một đoạn bộ nhớ cho một tensor) để đọc và viết bởi hàm này.</p>
+<p>Sau khi <code>Model.forward()</code> được thực hiện xong một lần, tất cả quá trình được buffer bởi
+<code>Device</code>. Tiếp theo, thông tin đọc/viết của tất cả quá trình sẽ được phân tích để tạo computational graph.
+Ví dụ, nếu một block <code>b</code> được viết bởi quá trình 01 và sau đó được đọc bởi quá trình 02 khác, chúng ta sẽ biết 02 là dựa vào 01 và có edge trực tiếp từ A sang B, thể hiện qua block <code>b</code> (hoặc tensor của nó). Sau đó một graph không tuần hoàn sẽ được tạo ra như dưới đây.
+Graph chỉ được tạo ra một lần.</p>
+<p><img src="/docs/assets/GraphOfMLP.png" alt="Computational graph của MLP"></p>
+<p><br/><strong>Sơ đồ 1 - Ví dụ Computational graph của MLP.</strong></p>
+<h3><a class="anchor" aria-hidden="true" id="tối-ưu-hoá"></a><a href="#tối-ưu-hoá" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>Hiện nay, các tối ưu hoá sau được thực hiện dựa trên computational graph.</p>
+<p><strong>Phân bổ thụ động (Lazy allocation)</strong> Khi tensor/blocks được tạo ra, các thiết bị (devices) không phân bổ bộ nhớ cho chúng ngay lập tức. Thay vào đó, khi block được tiếp cận lần đầu tiên, bộ nhớ sẽ được phân bổ.</p>
+<p><strong>Tự động tái sử dụng (Automatic recycling)</strong> Đếm số của mỗi tensor/block được tính dựa trên graph. Trước khi thực hiện quá trình nào, đếm số là số lượng hàm đọc block này. Trong quá trình thực hiện, khi một hàm nào được tiến hành, đếm số của mỗi block đầu vào bị trừ đi 1. Nếu đếm số của một block bằng 0, thì block này sẽ không được đọc lại nữa trong toàn bộ quá trình còn lại. Bởi vậy, bộ nhớ của nó được giải phóng một cách an toàn. Thêm vào đó, SINGA theo dõi việc sử dụn [...]
+<p><strong>Chia sẻ bộ nhớ</strong> SINGA sử dụng memory pool, như là
+<a href="https://github.com/NVIDIA/cnmem">CnMem</a> để quản lý bộ nhớ CUDA. Với <em>Automatic
+recycling</em> và memory pool, SINGA có thể chia sẻ bộ nhớ giữa các tensor. Xem xét hai hàm <code>c = a + b</code> và <code>d=2xc</code>. Trước khi thực hiện hàm thứ hai, theo như <em>Lazy allocation</em> thì bộ nhớ của d nên được sử dụng. Cũng như <code>a</code>
+không được sử dụng ở toàn bộ quá trình còn lại. Theo Tự động sử dụng (Automatic recycling), block
+của <code>a</code> sẽ được giải phóng sau hàm đầu tiên. Vì thế, SINGA sẽ đề xuất bốn hàm tới CUDA stream: addition, free <code>a</code>, malloc <code>b</code>, và
+multiplication. Memory pool sau đó có thể chia sẻ bộ nhớ được <code>a</code>
+với <code>b</code> giải phóng thay vì yêu cầu GPU thực hiện real malloc cho <code>b</code>.</p>
+<p>Các kĩ thuật tối ưu hoá khác, ví dụ từ compliers, như common
+sub-expression elimination và parallelizing operations trên CUDA
+streams khác nhau cũng có thể được áp dụng.</p>
+<h2><a class="anchor" aria-hidden="true" id="toán-tử-operator-mới"></a><a href="#toán-tử-operator-mới" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<p>Mỗi toán tử được định nghĩa trong <code>autograd</code> module áp dụng hai hàm: forward và
+backward, được thực hiện bằng cách gọi toán tử (operator) từ backend. Để thêm một toán tử mới vào hàm <code>autograd</code>, bạn cần thêm nhiều toán tử ở backend.</p>
+<p>Lấy toán tử
+<a href="https://github.com/apache/singa/blob/master/python/singa/autograd.py">Conv2d</a>
+làm ví dụ, từ phía Python, hàm forward và backward được thực hiện bằng cách gọi các toán tử từ backend dựa trên loại
+device.</p>
+<pre><code class="hljs css language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">_Conv2d</span><span class="hljs-params">(Operation)</span>:</span>
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(self, x, W, b=None)</span>:</span>
+        ......
+        <span class="hljs-keyword">if</span> training:
+            <span class="hljs-keyword">if</span> self.handle.bias_term:
+                self.inputs = (x, W, b) <span class="hljs-comment"># ghi chép x, W, b</span>
+            <span class="hljs-keyword">else</span>:
+                self.inputs = (x, W)
+
+        <span class="hljs-keyword">if</span> (type(self.handle) != singa.ConvHandle):
+            <span class="hljs-keyword">return</span> singa.GpuConvForward(x, W, b, self.handle)
+        <span class="hljs-keyword">else</span>:
+            <span class="hljs-keyword">return</span> singa.CpuConvForward(x, W, b, self.handle)
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">backward</span><span class="hljs-params">(self, dy)</span>:</span>
+        <span class="hljs-keyword">if</span> (type(self.handle) != singa.ConvHandle):
+            dx = singa.GpuConvBackwardx(dy, self.inputs[<span class="hljs-number">1</span>], self.inputs[<span class="hljs-number">0</span>],
+                                        self.handle)
+            dW = singa.GpuConvBackwardW(dy, self.inputs[<span class="hljs-number">0</span>], self.inputs[<span class="hljs-number">1</span>],
+                                        self.handle)
+            db = singa.GpuConvBackwardb(
+                dy, self.inputs[<span class="hljs-number">2</span>],
+                self.handle) <span class="hljs-keyword">if</span> self.handle.bias_term <span class="hljs-keyword">else</span> <span class="hljs-literal">None</span>
+        <span class="hljs-keyword">else</span>:
+            dx = singa.CpuConvBackwardx(dy, self.inputs[<span class="hljs-number">1</span>], self.inputs[<span class="hljs-number">0</span>],
+                                        self.handle)
+            dW = singa.CpuConvBackwardW(dy, self.inputs[<span class="hljs-number">0</span>], self.inputs[<span class="hljs-number">1</span>],
+                                        self.handle)
+            db = singa.CpuConvBackwardb(
+                dy, self.inputs[<span class="hljs-number">2</span>],
+                self.handle) <span class="hljs-keyword">if</span> self.handle.bias_term <span class="hljs-keyword">else</span> <span class="hljs-literal">None</span>
+        <span class="hljs-keyword">if</span> db:
+            <span class="hljs-keyword">return</span> dx, dW, db
+        <span class="hljs-keyword">else</span>:
+            <span class="hljs-keyword">return</span> dx, dW
+</code></pre>
+<p>Mỗi toán tử ở backend nên được thực hiện theo cách sau:</p>
+<ul>
+<li><p>Giả dụ toán từ là <code>foo()</code>; khi được thực hiện nên được gói vào trong một hàm khác, như <code>_foo()</code>. <code>foo()</code>
+chuyển <code>_foo</code> cùng với các đối số như một hàm lambda tới hàm <code>Device</code>'s <code>Exec</code> để buffer.
+Block để đọc và viết cũng được chuyển cho <code>Exec</code>.</p></li>
+<li><p>Tất cả đối số được sử dụng trong hàm lambda expression cần phải được thu thập dựa trên các nguyên tắc sau.</p>
+<ul>
+<li><p><code>thu thập bằng giá trị</code>: Nếu biến đối số (argument variable) là biến local hoặc sẽ được giải phóng ngay
+(như intermediate tensors). Hoặc, những biến số này sẽ bị loại bỏ khi <code>foo()</code> tồn tại.</p></li>
+<li><p><code>thu thập theo tham khảo</code>:Nếu biến số được ghi lại từ phía python hoặc một biến bất biến
+(như tham số W và ConvHand trong Conv2d class).</p></li>
+<li><p><code>mutable</code>: Biểu thức lambda expression nên có biến thẻ (mutable tag) nếu một biến được thu thập theo giá trị bị thay đổi trong hàm <code>_foo()</code></p></li>
+</ul></li>
+</ul>
+<p>Đây là một
+<a href="https://github.com/apache/singa/blob/master/src/model/operation/convolution.cc">ví dụ</a>
+về operator được áp dụng ở backend.</p>
+<pre><code class="hljs css language-c++"><span class="hljs-function">Tensor <span class="hljs-title">GpuConvBackwardx</span><span class="hljs-params">(<span class="hljs-keyword">const</span> Tensor &amp;dy, <span class="hljs-keyword">const</span> Tensor &amp;W, <span class="hljs-keyword">const</span> Tensor &amp;x,
+                        <span class="hljs-keyword">const</span> CudnnConvHandle &amp;cch)</span> </span>{
+  CHECK_EQ(dy.device()-&gt;lang(), kCuda);
+
+  Tensor dx;
+  dx.ResetLike(x);
+
+  dy.device()-&gt;Exec(
+      <span class="hljs-comment">/*
+       * dx is a local variable so it's captured by value
+       * dy is an intermediate tensor and isn't recorded on the python side
+       * W is an intermediate tensor but it's recorded on the python side
+       * chh is a variable and it's recorded on the python side
+       */</span>
+      [dx, dy, &amp;W, &amp;cch](Context *ctx) <span class="hljs-keyword">mutable</span> {
+        Block *wblock = W.block(), *dyblock = dy.block(), *dxblock = dx.block();
+        <span class="hljs-keyword">float</span> alpha = <span class="hljs-number">1.f</span>, beta = <span class="hljs-number">0.f</span>;
+        cudnnConvolutionBackwardData(
+            ctx-&gt;cudnn_handle, &amp;alpha, cch.filter_desc, wblock-&gt;data(),
+            cch.y_desc, dyblock-&gt;data(), cch.conv_desc, cch.bp_data_alg,
+            cch.workspace.block()-&gt;mutable_data(),
+            cch.workspace_count * <span class="hljs-keyword">sizeof</span>(<span class="hljs-keyword">float</span>), &amp;beta, cch.x_desc,
+            dxblock-&gt;mutable_data());
+      },
+      {dy.block(), W.block()}, {dx.block(), cch.workspace.block()});
+      <span class="hljs-comment">/* the lambda expression reads the blocks of tensor dy and w
+       * and writes the blocks of tensor dx and chh.workspace
+       */</span>
+
+  <span class="hljs-keyword">return</span> dx;
+}
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="điểm-chuẩn-benchmark"></a><a href="#điểm-chuẩn-benchmark" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<h3><a class="anchor" aria-hidden="true" id="trên-một-node"></a><a href="#trên-một-node" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<ul>
+<li>Thiết lập thí nghiệm
+<ul>
+<li>Model
+<ul>
+<li>Sử dụng layer: ResNet50 trong
+<a href="https://github.com/apache/singa/blob/master/examples/cnn/autograd/resnet_cifar10.py">resnet.py</a></li>
+<li>Sử dụng model: ResNet50 trong
+<a href="https://github.com/apache/singa/blob/master/examples/cnn/model/resnet.py">resnet.py</a></li>
+</ul></li>
+<li>GPU: NVIDIA RTX 2080Ti</li>
+</ul></li>
+<li>Kí hiệu
+<ul>
+<li><code>s</code> :giây (second)</li>
+<li><code>it</code> : vòng lặp (iteration)</li>
+<li><code>Mem</code>:sử dụng bộ nhớ tối đa trong một GPU</li>
+<li><code>Throughout</code>:số lượng hình ảnh được xử lý mỗi giây</li>
+<li><code>Time</code>:tổng thời gian</li>
+<li><code>Speed</code>:vòng lặp mỗi giây</li>
+<li><code>Reduction</code>:tốc độ giảm bộ nhớ sử dụng so với sử dụng layer</li>
+<li><code>Speedup</code>: tốc độ tăng tốc so với dev branch</li>
+</ul></li>
+<li>Kết quả
+  <table style="text-align: center">
+      <tr>
+          <th style="text-align: center">Batchsize</th>
+          <th style="text-align: center">Cases</th>
+          <th style="text-align: center">Mem(MB)</th>
+          <th style="text-align: center">Time(s)</th>
+          <th style="text-align: center">Speed(it/s)</th>
+          <th style="text-align: center">Throughput</th>
+          <th style="text-align: center">Reduction</th>
+          <th style="text-align: center">Speedup</th>
+      </tr>
+      <tr>
+          <td rowspan="4">16</td>
+          <td nowrap>layer</td>
+          <td>4975</td>
+          <td>14.1952</td>
+          <td>14.0893</td>
+          <td>225.4285</td>
+          <td>0.00%</td>
+          <td>1.0000</td>
+      </tr>
+      <tr>
+          <td nowrap>model:disable graph</td>
+          <td>4995</td>
+          <td>14.1264</td>
+          <td>14.1579</td>
+          <td>226.5261</td>
+          <td>-0.40%</td>
+          <td>1.0049</td>
+      </tr>
+      <tr>
+          <td nowrap>model:enable graph, bfs</td>
+          <td>3283</td>
+          <td>13.7438</td>
+          <td>14.5520</td>
+          <td>232.8318</td>
+          <td>34.01%</td>
+          <td>1.0328</td>
+      </tr>
+      <tr>
+          <td nowrap>model:enable graph, serial</td>
+          <td>3265</td>
+          <td>13.7420</td>
+          <td>14.5540</td>
+          <td>232.8635</td>
+          <td>34.37%</td>
+          <td>1.0330</td>
+      </tr>
+      <tr>
+          <td rowspan="4">32</td>
+          <td nowrap>layer</td>
+          <td>10119</td>
+          <td>13.4587</td>
+          <td>7.4302</td>
+          <td>237.7649</td>
+          <td>0.00%</td>
+          <td>1.0000</td>
+      </tr>
+      <tr>
+          <td nowrap>model:disable graph</td>
+          <td>10109</td>
+          <td>13.2952</td>
+          <td>7.5315</td>
+          <td>240.6875</td>
+          <td>0.10%</td>
+          <td>1.0123</td>
+      </tr>
+      <tr>
+          <td nowrap>model:enable graph, bfs</td>
+          <td>6839</td>
+          <td>13.1059</td>
+          <td>7.6302</td>
+          <td>244.1648</td>
+          <td>32.41%</td>
+          <td>1.0269</td>
+      </tr>
+      <tr>
+          <td nowrap>model:enable graph, serial</td>
+          <td>6845</td>
+          <td>13.0489</td>
+          <td>7.6635</td>
+          <td>245.2312</td>
+          <td>32.35%</td>
+          <td>1.0314</td>
+      </tr>
+  </table>
+</li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="đa-quá-trình-multi-processes"></a><a href="#đa-quá-trình-multi-processes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 [...]
+<ul>
+<li>Thiết lập thí nghiệm
+<ul>
+<li>API
+<ul>
+<li>Sử dụng Layer: ResNet50 trong
+<a href="https://github.com/apache/singa/blob/master/examples/cnn/autograd/resnet_dist.py">resnet_dist.py</a></li>
+<li>Sử dụng Model: ResNet50 trong
+<a href="https://github.com/apache/singa/blob/master/examples/cnn/model/resnet.py">resnet.py</a></li>
+</ul></li>
+<li>GPU: NVIDIA RTX 2080Ti * 2</li>
+<li>MPI: hai quá trình MPI trên một node</li>
+</ul></li>
+<li>Kí hiệu: như trên</li>
+<li>kết quả
+  <table style="text-align: center">
+      <tr>
+          <th style="text-align: center">Batchsize</th>
+          <th style="text-align: center">Cases</th>
+          <th style="text-align: center">Mem(MB)</th>
+          <th style="text-align: center">Time(s)</th>
+          <th style="text-align: center">Speed(it/s)</th>
+          <th style="text-align: center">Throughput</th>
+          <th style="text-align: center">Reduction</th>
+          <th style="text-align: center">Speedup</th>
+      </tr>
+      <tr>
+          <td rowspan="4">16</td>
+          <td nowrap>layer</td>
+          <td>5439</td>
+          <td>17.3323</td>
+          <td>11.5391</td>
+          <td>369.2522</td>
+          <td>0.00%</td>
+          <td>1.0000</td>
+      </tr>
+      <tr>
+          <td nowrap>model:disable graph</td>
+          <td>5427</td>
+          <td>17.8232</td>
+          <td>11.2213</td>
+          <td>359.0831</td>
+          <td>0.22%</td>
+          <td>0.9725</td>
+      </tr>
+      <tr>
+          <td nowrap>model:enable graph, bfs</td>
+          <td>3389</td>
+          <td>18.2310</td>
+          <td>10.9703</td>
+          <td>351.0504</td>
+          <td>37.69%</td>
+          <td>0.9507</td>
+      </tr>
+      <tr>
+          <td nowrap>model:enable graph, serial</td>
+          <td>3437</td>
+          <td>17.0389</td>
+          <td>11.7378</td>
+          <td>375.6103</td>
+          <td>36.81%</td>
+          <td>1.0172</td>
+      </tr>
+      <tr>
+          <td rowspan="4">32</td>
+          <td nowrap>layer</td>
+          <td>10547</td>
+          <td>14.8635</td>
+          <td>6.7279</td>
+          <td>430.5858</td>
+          <td>0.00%</td>
+          <td>1.0000</td>
+      </tr>
+      <tr>
+          <td nowrap>model:disable graph</td>
+          <td>10503</td>
+          <td>14.7746</td>
+          <td>6.7684</td>
+          <td>433.1748</td>
+          <td>0.42%</td>
+          <td>1.0060</td>
+      </tr>
+      <tr>
+          <td nowrap>model:enable graph, bfs</td>
+          <td>6935</td>
+          <td>14.8553</td>
+          <td>6.7316</td>
+          <td>430.8231</td>
+          <td>34.25%</td>
+          <td>1.0006</td>
+      </tr>
+      <tr>
+          <td nowrap>model:enable graph, serial</td>
+          <td>7027</td>
+          <td>14.3271</td>
+          <td>6.9798</td>
+          <td>446.7074</td>
+          <td>33.37%</td>
+          <td>1.0374</td>
+      </tr>
+  </table>
+</li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="kết-luận"></a><a href="#kết-luận" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<ul>
+<li>Training với computational graph giúp giảm đáng kể khối bộ nhớ.</li>
+<li>Hiện tại, tốc độ có cải thiện một chút. Nhiều tối ưu hoá có thể được thực hiện giúp tăng hiệu quả.</li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/optimizer"><span class="arrow-prev">← </span><span>Optimizer</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/onnx"><span>ONNX</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#ví-dụ">Ví Dụ</a></li><li><a href="#thực-hiện">Thực Hiện</a><ul class="toc-headings"><li><a href="#xây-dựng-graph">Xây Dựng [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/history-singa.html b/content/docs/3.1.0_Viet/history-singa.html
new file mode 100644
index 0000000..bdfb88c
--- /dev/null
+++ b/content/docs/3.1.0_Viet/history-singa.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Lịch Sử Phát Triển SINGA · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding  [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/history-singa.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Lịch Sử Phát Triển SINGA</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more [...]
+<h2><a class="anchor" aria-hidden="true" id="lịch-sử-phát-triển"></a><a href="#lịch-sử-phát-triển" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<p>SINGA được phát triển bởi DB System Group tại ĐH Quốc Gia Singapore (NUS) vào năm 2014, hợp tác với nhóm nghiên cứu cơ sở dữ liệu của ĐH Chiết Giang. Vui lòng cite các báo cáo khoa học dưới đây nếu bạn muốn sử dụng SINGA trong nghiên cứu của mình:</p>
+<ul>
+<li><p>B.C. Ooi, K.-L. Tan, S. Wang, W. Wang, Q. Cai, G. Chen, J. Gao, Z. Luo, A. K.
+H. Tung, Y. Wang, Z. Xie, M. Zhang, and K. Zheng.
+<a href="http://www.comp.nus.edu.sg/~ooibc/singaopen-mm15.pdf">SINGA: A distributed deep learning platform</a>.
+ACM Multimedia (Open Source Software Competition) 2015</p></li>
+<li><p>W. Wang, G. Chen, T. T. A. Dinh, B. C. Ooi, K.-L.Tan, J. Gao, and S. Wang.
+<a href="http://www.comp.nus.edu.sg/~ooibc/singa-mm15.pdf">SINGA: putting deep learning in the hands of multimedia users</a>.
+ACM Multimedia 2015.</p></li>
+</ul>
+<p>Rafiki là một mô-đun của SINGA. Vui lòng cite các báo cáo khoa học dưới đây nếu bạn muốn sử dụng Rafiki trong nghiên cứu của mình:</p>
+<ul>
+<li>Wei Wang, Jinyang Gao, Meihui Zhang, Sheng Wang, Gang Chen, Teck Khim Ng, Beng
+Chin Ooi, Jie Shao, Moaz Reyad.
+<a href="http://www.vldb.org/pvldb/vol12/p128-wang.pdf">Rafiki: Machine Learning as an Analytics Service System</a>.
+<a href="http://vldb.org/2019/">VLDB 2019</a>
+(<a href="https://dblp.org/rec/bib2/journals/pvldb/WangWGZCNOS18.bib">BibTex</a>).</li>
+</ul>
+<p>Các công ty như <a href="http://tech.163.com/17/0602/17/CLUL016I00098GJ5.html">NetEase</a>,
+<a href="http://www.yzbigdata.com/en/index.html">yzBigData</a>,
+<a href="https://shentilium.com/">Shentilium</a>, <a href="http://www.foodlg.com/">Foodlg</a> and
+<a href="https://medilot.com/technologies">Medilot</a> đang sử dụng SINGA cho các ứng dụng của họ.</p>
+<h2><a class="anchor" aria-hidden="true" id="bản-quyền"></a><a href="#bản-quyền" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
+<p>SINGA được phát hành bởi
+<a href="http://www.apache.org/licenses/LICENSE-2.0">Bản Quyền Apache phiên bản 2.0</a></p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/team-list"><span class="arrow-prev">← </span><span>The SINGA Team</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/wheel-cpu"><span>CPU only</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#lịch-sử-phát-triển">Lịch Sử Phát Triển</a></li><li><a href="#bản-quyền">Bản Quyền</a></li></ul></nav></div>< [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/history-singa/index.html b/content/docs/3.1.0_Viet/history-singa/index.html
new file mode 100644
index 0000000..bdfb88c
--- /dev/null
+++ b/content/docs/3.1.0_Viet/history-singa/index.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Lịch Sử Phát Triển SINGA · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding  [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/history-singa.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Lịch Sử Phát Triển SINGA</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more [...]
+<h2><a class="anchor" aria-hidden="true" id="lịch-sử-phát-triển"></a><a href="#lịch-sử-phát-triển" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<p>SINGA được phát triển bởi DB System Group tại ĐH Quốc Gia Singapore (NUS) vào năm 2014, hợp tác với nhóm nghiên cứu cơ sở dữ liệu của ĐH Chiết Giang. Vui lòng cite các báo cáo khoa học dưới đây nếu bạn muốn sử dụng SINGA trong nghiên cứu của mình:</p>
+<ul>
+<li><p>B.C. Ooi, K.-L. Tan, S. Wang, W. Wang, Q. Cai, G. Chen, J. Gao, Z. Luo, A. K.
+H. Tung, Y. Wang, Z. Xie, M. Zhang, and K. Zheng.
+<a href="http://www.comp.nus.edu.sg/~ooibc/singaopen-mm15.pdf">SINGA: A distributed deep learning platform</a>.
+ACM Multimedia (Open Source Software Competition) 2015</p></li>
+<li><p>W. Wang, G. Chen, T. T. A. Dinh, B. C. Ooi, K.-L.Tan, J. Gao, and S. Wang.
+<a href="http://www.comp.nus.edu.sg/~ooibc/singa-mm15.pdf">SINGA: putting deep learning in the hands of multimedia users</a>.
+ACM Multimedia 2015.</p></li>
+</ul>
+<p>Rafiki là một mô-đun của SINGA. Vui lòng cite các báo cáo khoa học dưới đây nếu bạn muốn sử dụng Rafiki trong nghiên cứu của mình:</p>
+<ul>
+<li>Wei Wang, Jinyang Gao, Meihui Zhang, Sheng Wang, Gang Chen, Teck Khim Ng, Beng
+Chin Ooi, Jie Shao, Moaz Reyad.
+<a href="http://www.vldb.org/pvldb/vol12/p128-wang.pdf">Rafiki: Machine Learning as an Analytics Service System</a>.
+<a href="http://vldb.org/2019/">VLDB 2019</a>
+(<a href="https://dblp.org/rec/bib2/journals/pvldb/WangWGZCNOS18.bib">BibTex</a>).</li>
+</ul>
+<p>Các công ty như <a href="http://tech.163.com/17/0602/17/CLUL016I00098GJ5.html">NetEase</a>,
+<a href="http://www.yzbigdata.com/en/index.html">yzBigData</a>,
+<a href="https://shentilium.com/">Shentilium</a>, <a href="http://www.foodlg.com/">Foodlg</a> and
+<a href="https://medilot.com/technologies">Medilot</a> đang sử dụng SINGA cho các ứng dụng của họ.</p>
+<h2><a class="anchor" aria-hidden="true" id="bản-quyền"></a><a href="#bản-quyền" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
+<p>SINGA được phát hành bởi
+<a href="http://www.apache.org/licenses/LICENSE-2.0">Bản Quyền Apache phiên bản 2.0</a></p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/team-list"><span class="arrow-prev">← </span><span>The SINGA Team</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/wheel-cpu"><span>CPU only</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#lịch-sử-phát-triển">Lịch Sử Phát Triển</a></li><li><a href="#bản-quyền">Bản Quyền</a></li></ul></nav></div>< [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/how-to-release.html b/content/docs/3.1.0_Viet/how-to-release.html
new file mode 100644
index 0000000..1486d17
--- /dev/null
+++ b/content/docs/3.1.0_Viet/how-to-release.html
@@ -0,0 +1,254 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Chuẩn bị trước khi phát hành · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regard [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/how-to-release.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Chuẩn bị trước khi phát hành</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or [...]
+<p>Đây là hướng dẫn chuẩn bị cho việc phát hành
+<a href="http://www.apache.org/dev/release-publishing.html">quá trình chuẩn bị trước khi phát hành</a>
+SINGA.</p>
+<ol>
+<li><p>Lựa chọn người quản lý cho việc phát hành. Người quản lý chịu trách nhiệm
+điều phối quá trình phát hành. Chữ ký của người quản lý (.asc) sẽ được tải lên cùng với
+bản phát hành. Nggười quản lý tạo KEY (RSA 4096-bit) và tải nó lên
+public key server. Để được tin cậy kết nối trên web, người quản lý cần các người dùng Apache khác
+chứng thực (signed) Key của mình. Anh ta trước tiên cần yêu cầu mentor giúp chứng thực key.
+<a href="http://www.apache.org/dev/release-signing.html">Cách tạo Key</a>?</p></li>
+<li><p>Kiểm tra bản quyền. <a href="https://www.apache.org/legal/src-headers.html#faq-docs">FAQ</a>;
+<a href="https://issues.apache.org/jira/projects/SINGA/issues/SINGA-447">Các bản SINGA đã phát hành</a></p>
+<ul>
+<li>Nền tảng code không bao gồm code của bên thứ 3 mà không tương thích với
+APL;</li>
+<li>Các chương trình dependencies phải tương thích với APL. Các licenses giống với GNU là không tương thích;</li>
+<li>Các tệp tin nguồn viết bởi chúng tôi PHẢI bao gồm license header của Apache:
+<a href="http://www.apache.org/legal/src-headers.html">http://www.apache.org/legal/src-headers.html</a>. Chúng tôi cung cấp script để chạy header trên tất cả các tệp tin.</li>
+<li>Cập nhật tệp tin LICENSE. Nếu code có chứa mã code của một bên thứ 3 trong bản phát hành mà không phải APL, phải nêu rõ ở phần cuối của tập tin THÔNG BÁO.</li>
+</ul></li>
+<li><p>Nâng cấp phiên bản. Kiểm tra mã code và Tài liệu hướng dẫn</p>
+<ul>
+<li>Quá trình cài đặt không bị lỗi nào.</li>
+<li>Bao gồm tests cho những mục nhỏ (nhiều nhất có thể)</li>
+<li>Gói chương trình Conda chạy không bị lỗi.</li>
+<li>Tài liệu hướng dẫn trực tuyến trên trang web Apache là mới nhất.</li>
+</ul></li>
+<li><p>Chuẩn bị tệp tin RELEASE_NOTES (Lưu ý phát hành). Bao gồm các mục, Giới thiệu, Tính năng nổi bật, Lỗi Bugs, (đường dẫn tới JIRA hoặc Github PR), Những thay đổi, Danh sách thư viện Dependency, Các vấn đề không tương thích. Làm theo
+<a href="http://commons.apache.org/proper/commons-digester/commons-digester-3.0/RELEASE-NOTES.txt">ví dụ</a>.</p></li>
+<li><p>Gói các phiên bản phát hành. Bản phát hành cần được gói gọn thành:
+apache-singa-VERSION.tar.gz. Trong bản phát hành không nên chứa bất kì tệp tin dạng binary nào, bao gồm cả các tệp tin git. Tuy nhiên, các tệp CMake compilation dựa vào git tag để tạo số phiên bản; để bỏ qua dependency này, bạn cần cập nhật tệp tin CMakeLists.txt theo cách thủ công để tạo số phiên bản.</p>
+<pre><code class="hljs"># xoá các dòng sau 
+include(GetGitRevisionDescription)
+git_describe(VERSION --tags --dirty=-d)
+<span class="hljs-type">string</span>(REGEX REPLACE <span class="hljs-string">"^([0-9]+)<span class="hljs-subst">\\</span>..*"</span> <span class="hljs-string">"<span class="hljs-subst">\\</span>1"</span> VERSION_MAJOR <span class="hljs-string">"${VERSION}"</span>)
+<span class="hljs-type">string</span>(REGEX REPLACE <span class="hljs-string">"^[0-9]+<span class="hljs-subst">\\</span>.([0-9]+).*"</span> <span class="hljs-string">"<span class="hljs-subst">\\</span>1"</span> VERSION_MINOR <span class="hljs-string">"${VERSION}"</span>)
+<span class="hljs-type">string</span>(REGEX REPLACE <span class="hljs-string">"^[0-9]+<span class="hljs-subst">\\</span>.[0-9]+<span class="hljs-subst">\\</span>.([0-9]+).*"</span> <span class="hljs-string">"<span class="hljs-subst">\\</span>1"</span> VERSION_PATCH <span class="hljs-string">"${VERSION}"</span>)
+
+# thay đổi số
+SET(PACKAGE_VERSION <span class="hljs-number">3.0</span><span class="hljs-number">.0</span>)
+SET(VERSION <span class="hljs-number">3.0</span><span class="hljs-number">.0</span>)
+SET(SINGA_MAJOR_VERSION <span class="hljs-number">3</span>)  # <span class="hljs-number">0</span> -
+SET(SINGA_MINOR_VERSION <span class="hljs-number">0</span>)  # <span class="hljs-number">0</span> - <span class="hljs-number">9</span>
+SET(SINGA_PATCH_VERSION <span class="hljs-number">0</span>)  # <span class="hljs-number">0</span> - <span class="hljs-number">99</span>
+</code></pre>
+<p>Tải gói chương trình lên
+<a href="https://dist.apache.org/repos/dist/dev/singa/">stage repo</a>. Cần bao gồm các tệp tin tar,
+signature, KEY và tệp tin SHA256 checksum. Không sử dụng MD5. Xem chính sách tại
+<a href="http://www.apache.org/dev/release-distribution#sigs-and-sums">đây</a>. Thư mục
+stage  cần bao gồm:</p>
+<ul>
+<li>apache-singa-VERSION.tar.gz</li>
+<li>apache-singa-VERSION.acs</li>
+<li>apache-singa-VERSION.SHA256</li>
+</ul>
+<p>Các lệnh để tạo tệp tin và tải chúng lên stage svn repo:</p>
+<pre><code class="hljs css language-sh"><span class="hljs-comment"># trong singa repo</span>
+rm -rf .git
+rm -rf rafiki/*
+<span class="hljs-built_in">cd</span> ..
+tar -czvf apache-singa-VERSION.tar.gz  singa/
+
+mkdir stage
+<span class="hljs-built_in">cd</span> stage
+svn co https://dist.apache.org/repos/dist/dev/singa/
+<span class="hljs-built_in">cd</span> singa
+<span class="hljs-comment"># copy tệp tin KEYS từ singa repo sang thư mục này nếu không có</span>
+cp ../../singa/KEYS .
+mkdir VERSION
+<span class="hljs-comment"># copy tệp tin tar.gz </span>
+mv ../../apache-singa-VERSION.tar.gz VERSION/
+<span class="hljs-built_in">cd</span> VERSION
+sha512sum apache-singa-VERSION.tar.gz &gt; apache-singa-VERSION.tar.gz.sha512
+gpg --armor --output apache-singa-VERSION.tar.gz.asc --detach-sig apache-singa-VERSION.tar.gz
+<span class="hljs-built_in">cd</span> ..
+svn add VERSION
+svn commit
+</code></pre></li>
+</ol>
+<ol start="6">
+<li><p>Kêu gọi vote bằng cách gửi email. Xem ví dụ dưới đây.</p>
+<pre><code class="hljs"><span class="hljs-attribute">To</span>: dev<span class="hljs-variable">@singa</span>.apache.org
+<span class="hljs-attribute">Subject</span>: [VOTE] Release apache-singa-X.Y.Z (release candidate N)
+
+Hi all,
+
+I have created a build for Apache SINGA <span class="hljs-number">3.1</span>.<span class="hljs-number">0</span>, release candidate <span class="hljs-number">2</span>.
+
+The release note is at
+<span class="hljs-attribute">https</span>:<span class="hljs-comment">//github.com/apache/singa/blob/master/RELEASE_NOTES.</span>
+
+The artifacts to be voted on are located <span class="hljs-attribute">here</span>:
+<span class="hljs-attribute">https</span>:<span class="hljs-comment">//dist.apache.org/repos/dist/dev/singa/3.1.0.rc2/apache-singa-3.1.0.rc2.tar.gz</span>
+ 
+The hashes of the artifacts are as <span class="hljs-attribute">follows</span>:
+<span class="hljs-attribute">SHA512</span>: <span class="hljs-number">84545499</span>ad36da108c6a599edd1d853f82d331bc03273b5278515554866f0c698e881f956b2eabcb6b29c07fa9fa4ff1add5a777b58db8a6a2362cf383b5c04d 
+
+Release artifacts are signed with the <span class="hljs-attribute">followingkey</span>:
+<span class="hljs-attribute">https</span>:<span class="hljs-comment">//dist.apache.org/repos/dist/dev/singa/KEYS</span>
+
+The signature file <span class="hljs-attribute">is</span>:
+<span class="hljs-attribute">https</span>:<span class="hljs-comment">//dist.apache.org/repos/dist/dev/singa/3.1.0.rc2/apache-singa-3.1.0.rc2.tar.gz.asc</span>
+
+The Github tag is <span class="hljs-attribute">at</span>:
+<span class="hljs-attribute">https</span>:<span class="hljs-comment">//github.com/apache/singa/releases/tag/3.1.0.rc2</span>
+
+The documentation website is at
+<span class="hljs-attribute">http</span>:<span class="hljs-comment">//singa.apache.org/docs/next/installation/</span>
+
+Some examples are available for <span class="hljs-attribute">testing</span>:
+<span class="hljs-attribute">https</span>:<span class="hljs-comment">//github.com/apache/singa/tree/master/examples</span>
+</code></pre></li>
+</ol>
+<p>Please vote on releasing this package. The vote is open for at least 72 hours
+and passes if a majority of at least three +1 votes are cast.</p>
+<p>[ ] +1 Release this package as Apache SINGA X.Y.Z [ ] 0 I don't feel strongly
+about it, but I'm okay with the release [ ] -1 Do not release this package
+because...</p>
+<p>Here is my vote: +1</p>
+<pre><code class="hljs">
+<span class="hljs-number">7</span>) Sau đó đợi í<span class="hljs-built_in">t</span> nhấ<span class="hljs-built_in">t</span> <span class="hljs-number">48</span> giờ để nhậ<span class="hljs-built_in">n</span> phả<span class="hljs-built_in">n</span> hồi. Bấ<span class="hljs-built_in">t</span> kì PMC, committer hay contributor
+đều có thể kiểm tra các <span class="hljs-built_in">t</span>ính <span class="hljs-built_in">n</span>ăng trước khi phá<span class="hljs-built_in">t</span> hành, và đưa ra nhậ<span class="hljs-built_in">n</span> xét. Mọi người <span class="hljs-built_in">n</span>ê<span class="hljs-built_in">n</span> kiểm tra trước khi
+đưa ra vote +<span class="hljs-number">1</span>. <span class="hljs-built_in">N</span>ếu vote được thông qua, vui lòng gửi email kế<span class="hljs-built_in">t</span> quả. <span class="hljs-built_in">N</span>ếu không thì cầ<span class="hljs-built_in">n</span> lặp lại trình <span class="hljs-built_in">t</span>ự <span class="hljs-built_in">t</span>ừ đầu. 
+
+</code></pre>
+<p>To: <a href="mailto:dev@singa.apache.org">dev@singa.apache.org</a> Subject: [RESULT][vote] Release apache-singa-X.Y.Z
+(release candidate N)</p>
+<p>Thanks to everyone who has voted and given their comments. The tally is as
+follows.</p>
+<p>N binding +1s: <names></p>
+<p>N non-binding +1s: <names></p>
+<p>No 0s or -1s.</p>
+<p>I am delighted to announce that the proposal to release Apache SINGA X.Y.Z has
+passed.</p>
+<pre><code class="hljs">
+8) Tải gói chương trình để
+[<span class="hljs-string">phân bổ</span>](<span class="hljs-link">http://www.apache.org/dev/release-publishing.html#distribution</span>)
+tới https://dist.apache.org/repos/dist/release/singa/.
+
+9) Cập nhật trang Tải (Download) trên website SINGA. Tệp tin tar.gz PHẢI được tải từ mirror, sử dụng closer.cgi script; các tạo tác khác PHẢI được tải từ trang chủ Apache. Xem chi tiết tại 
+[<span class="hljs-string">đây</span>](<span class="hljs-link">http://www.apache.org/dev/release-download-pages.html</span>). Một vài nhận xét chúng tôi nhận được trong các đợt phát hành trước: "Trang Tải chỉ nên được dẫn tới các bản phát hành chính thức, vì vậy phải bao gồm đường dẫn tới GitHub.", "Đường dẫn tới KEYS, sigs và
+hashes không nên sử dụng dist.apache.org; mà nên dùng 
+https://www.apache.org/dist/singa/...;", "Và bạn chỉ cần một đường dẫn tới KEYS,
+và cần có hướng dẫn cách sử dụng KEYS + sig hay hash để chứng thực hoàn tất việc tải."
+
+10) Xoá tag RC và tập hợp gói conda packages.
+
+11) Xuất bản thông tin phát hành.
+
+ <span class="hljs-code">```</span>
+ To: announce@apache.org, dev@singa.apache.org
+ Subject: [ANNOUNCE] Apache SINGA X.Y.Z released
+
+ We are pleased to announce that SINGA X.Y.Z is released.
+
+ SINGA is a general distributed deep learning platform
+ for training big deep learning models over large datasets.
+ The release is available at: http://singa.apache.org/downloads.html
+ The main features of this release include XXX
+ We look forward to hearing your feedback, suggestions,
+ and contributions to the project.
+
+ On behalf of the SINGA team, {SINGA Team Member Name}
+ <span class="hljs-code">```</span>
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/contribute-docs"><span class="arrow-prev">← </span><span>How to Contribute to Documentation</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/git-workflow"><span>Git Workflow</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src= [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/how-to-release/index.html b/content/docs/3.1.0_Viet/how-to-release/index.html
new file mode 100644
index 0000000..1486d17
--- /dev/null
+++ b/content/docs/3.1.0_Viet/how-to-release/index.html
@@ -0,0 +1,254 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Chuẩn bị trước khi phát hành · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regard [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/how-to-release.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Chuẩn bị trước khi phát hành</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or [...]
+<p>Đây là hướng dẫn chuẩn bị cho việc phát hành
+<a href="http://www.apache.org/dev/release-publishing.html">quá trình chuẩn bị trước khi phát hành</a>
+SINGA.</p>
+<ol>
+<li><p>Lựa chọn người quản lý cho việc phát hành. Người quản lý chịu trách nhiệm
+điều phối quá trình phát hành. Chữ ký của người quản lý (.asc) sẽ được tải lên cùng với
+bản phát hành. Nggười quản lý tạo KEY (RSA 4096-bit) và tải nó lên
+public key server. Để được tin cậy kết nối trên web, người quản lý cần các người dùng Apache khác
+chứng thực (signed) Key của mình. Anh ta trước tiên cần yêu cầu mentor giúp chứng thực key.
+<a href="http://www.apache.org/dev/release-signing.html">Cách tạo Key</a>?</p></li>
+<li><p>Kiểm tra bản quyền. <a href="https://www.apache.org/legal/src-headers.html#faq-docs">FAQ</a>;
+<a href="https://issues.apache.org/jira/projects/SINGA/issues/SINGA-447">Các bản SINGA đã phát hành</a></p>
+<ul>
+<li>Nền tảng code không bao gồm code của bên thứ 3 mà không tương thích với
+APL;</li>
+<li>Các chương trình dependencies phải tương thích với APL. Các licenses giống với GNU là không tương thích;</li>
+<li>Các tệp tin nguồn viết bởi chúng tôi PHẢI bao gồm license header của Apache:
+<a href="http://www.apache.org/legal/src-headers.html">http://www.apache.org/legal/src-headers.html</a>. Chúng tôi cung cấp script để chạy header trên tất cả các tệp tin.</li>
+<li>Cập nhật tệp tin LICENSE. Nếu code có chứa mã code của một bên thứ 3 trong bản phát hành mà không phải APL, phải nêu rõ ở phần cuối của tập tin THÔNG BÁO.</li>
+</ul></li>
+<li><p>Nâng cấp phiên bản. Kiểm tra mã code và Tài liệu hướng dẫn</p>
+<ul>
+<li>Quá trình cài đặt không bị lỗi nào.</li>
+<li>Bao gồm tests cho những mục nhỏ (nhiều nhất có thể)</li>
+<li>Gói chương trình Conda chạy không bị lỗi.</li>
+<li>Tài liệu hướng dẫn trực tuyến trên trang web Apache là mới nhất.</li>
+</ul></li>
+<li><p>Chuẩn bị tệp tin RELEASE_NOTES (Lưu ý phát hành). Bao gồm các mục, Giới thiệu, Tính năng nổi bật, Lỗi Bugs, (đường dẫn tới JIRA hoặc Github PR), Những thay đổi, Danh sách thư viện Dependency, Các vấn đề không tương thích. Làm theo
+<a href="http://commons.apache.org/proper/commons-digester/commons-digester-3.0/RELEASE-NOTES.txt">ví dụ</a>.</p></li>
+<li><p>Gói các phiên bản phát hành. Bản phát hành cần được gói gọn thành:
+apache-singa-VERSION.tar.gz. Trong bản phát hành không nên chứa bất kì tệp tin dạng binary nào, bao gồm cả các tệp tin git. Tuy nhiên, các tệp CMake compilation dựa vào git tag để tạo số phiên bản; để bỏ qua dependency này, bạn cần cập nhật tệp tin CMakeLists.txt theo cách thủ công để tạo số phiên bản.</p>
+<pre><code class="hljs"># xoá các dòng sau 
+include(GetGitRevisionDescription)
+git_describe(VERSION --tags --dirty=-d)
+<span class="hljs-type">string</span>(REGEX REPLACE <span class="hljs-string">"^([0-9]+)<span class="hljs-subst">\\</span>..*"</span> <span class="hljs-string">"<span class="hljs-subst">\\</span>1"</span> VERSION_MAJOR <span class="hljs-string">"${VERSION}"</span>)
+<span class="hljs-type">string</span>(REGEX REPLACE <span class="hljs-string">"^[0-9]+<span class="hljs-subst">\\</span>.([0-9]+).*"</span> <span class="hljs-string">"<span class="hljs-subst">\\</span>1"</span> VERSION_MINOR <span class="hljs-string">"${VERSION}"</span>)
+<span class="hljs-type">string</span>(REGEX REPLACE <span class="hljs-string">"^[0-9]+<span class="hljs-subst">\\</span>.[0-9]+<span class="hljs-subst">\\</span>.([0-9]+).*"</span> <span class="hljs-string">"<span class="hljs-subst">\\</span>1"</span> VERSION_PATCH <span class="hljs-string">"${VERSION}"</span>)
+
+# thay đổi số
+SET(PACKAGE_VERSION <span class="hljs-number">3.0</span><span class="hljs-number">.0</span>)
+SET(VERSION <span class="hljs-number">3.0</span><span class="hljs-number">.0</span>)
+SET(SINGA_MAJOR_VERSION <span class="hljs-number">3</span>)  # <span class="hljs-number">0</span> -
+SET(SINGA_MINOR_VERSION <span class="hljs-number">0</span>)  # <span class="hljs-number">0</span> - <span class="hljs-number">9</span>
+SET(SINGA_PATCH_VERSION <span class="hljs-number">0</span>)  # <span class="hljs-number">0</span> - <span class="hljs-number">99</span>
+</code></pre>
+<p>Tải gói chương trình lên
+<a href="https://dist.apache.org/repos/dist/dev/singa/">stage repo</a>. Cần bao gồm các tệp tin tar,
+signature, KEY và tệp tin SHA256 checksum. Không sử dụng MD5. Xem chính sách tại
+<a href="http://www.apache.org/dev/release-distribution#sigs-and-sums">đây</a>. Thư mục
+stage  cần bao gồm:</p>
+<ul>
+<li>apache-singa-VERSION.tar.gz</li>
+<li>apache-singa-VERSION.acs</li>
+<li>apache-singa-VERSION.SHA256</li>
+</ul>
+<p>Các lệnh để tạo tệp tin và tải chúng lên stage svn repo:</p>
+<pre><code class="hljs css language-sh"><span class="hljs-comment"># trong singa repo</span>
+rm -rf .git
+rm -rf rafiki/*
+<span class="hljs-built_in">cd</span> ..
+tar -czvf apache-singa-VERSION.tar.gz  singa/
+
+mkdir stage
+<span class="hljs-built_in">cd</span> stage
+svn co https://dist.apache.org/repos/dist/dev/singa/
+<span class="hljs-built_in">cd</span> singa
+<span class="hljs-comment"># copy tệp tin KEYS từ singa repo sang thư mục này nếu không có</span>
+cp ../../singa/KEYS .
+mkdir VERSION
+<span class="hljs-comment"># copy tệp tin tar.gz </span>
+mv ../../apache-singa-VERSION.tar.gz VERSION/
+<span class="hljs-built_in">cd</span> VERSION
+sha512sum apache-singa-VERSION.tar.gz &gt; apache-singa-VERSION.tar.gz.sha512
+gpg --armor --output apache-singa-VERSION.tar.gz.asc --detach-sig apache-singa-VERSION.tar.gz
+<span class="hljs-built_in">cd</span> ..
+svn add VERSION
+svn commit
+</code></pre></li>
+</ol>
+<ol start="6">
+<li><p>Kêu gọi vote bằng cách gửi email. Xem ví dụ dưới đây.</p>
+<pre><code class="hljs"><span class="hljs-attribute">To</span>: dev<span class="hljs-variable">@singa</span>.apache.org
+<span class="hljs-attribute">Subject</span>: [VOTE] Release apache-singa-X.Y.Z (release candidate N)
+
+Hi all,
+
+I have created a build for Apache SINGA <span class="hljs-number">3.1</span>.<span class="hljs-number">0</span>, release candidate <span class="hljs-number">2</span>.
+
+The release note is at
+<span class="hljs-attribute">https</span>:<span class="hljs-comment">//github.com/apache/singa/blob/master/RELEASE_NOTES.</span>
+
+The artifacts to be voted on are located <span class="hljs-attribute">here</span>:
+<span class="hljs-attribute">https</span>:<span class="hljs-comment">//dist.apache.org/repos/dist/dev/singa/3.1.0.rc2/apache-singa-3.1.0.rc2.tar.gz</span>
+ 
+The hashes of the artifacts are as <span class="hljs-attribute">follows</span>:
+<span class="hljs-attribute">SHA512</span>: <span class="hljs-number">84545499</span>ad36da108c6a599edd1d853f82d331bc03273b5278515554866f0c698e881f956b2eabcb6b29c07fa9fa4ff1add5a777b58db8a6a2362cf383b5c04d 
+
+Release artifacts are signed with the <span class="hljs-attribute">followingkey</span>:
+<span class="hljs-attribute">https</span>:<span class="hljs-comment">//dist.apache.org/repos/dist/dev/singa/KEYS</span>
+
+The signature file <span class="hljs-attribute">is</span>:
+<span class="hljs-attribute">https</span>:<span class="hljs-comment">//dist.apache.org/repos/dist/dev/singa/3.1.0.rc2/apache-singa-3.1.0.rc2.tar.gz.asc</span>
+
+The Github tag is <span class="hljs-attribute">at</span>:
+<span class="hljs-attribute">https</span>:<span class="hljs-comment">//github.com/apache/singa/releases/tag/3.1.0.rc2</span>
+
+The documentation website is at
+<span class="hljs-attribute">http</span>:<span class="hljs-comment">//singa.apache.org/docs/next/installation/</span>
+
+Some examples are available for <span class="hljs-attribute">testing</span>:
+<span class="hljs-attribute">https</span>:<span class="hljs-comment">//github.com/apache/singa/tree/master/examples</span>
+</code></pre></li>
+</ol>
+<p>Please vote on releasing this package. The vote is open for at least 72 hours
+and passes if a majority of at least three +1 votes are cast.</p>
+<p>[ ] +1 Release this package as Apache SINGA X.Y.Z [ ] 0 I don't feel strongly
+about it, but I'm okay with the release [ ] -1 Do not release this package
+because...</p>
+<p>Here is my vote: +1</p>
+<pre><code class="hljs">
+<span class="hljs-number">7</span>) Sau đó đợi í<span class="hljs-built_in">t</span> nhấ<span class="hljs-built_in">t</span> <span class="hljs-number">48</span> giờ để nhậ<span class="hljs-built_in">n</span> phả<span class="hljs-built_in">n</span> hồi. Bấ<span class="hljs-built_in">t</span> kì PMC, committer hay contributor
+đều có thể kiểm tra các <span class="hljs-built_in">t</span>ính <span class="hljs-built_in">n</span>ăng trước khi phá<span class="hljs-built_in">t</span> hành, và đưa ra nhậ<span class="hljs-built_in">n</span> xét. Mọi người <span class="hljs-built_in">n</span>ê<span class="hljs-built_in">n</span> kiểm tra trước khi
+đưa ra vote +<span class="hljs-number">1</span>. <span class="hljs-built_in">N</span>ếu vote được thông qua, vui lòng gửi email kế<span class="hljs-built_in">t</span> quả. <span class="hljs-built_in">N</span>ếu không thì cầ<span class="hljs-built_in">n</span> lặp lại trình <span class="hljs-built_in">t</span>ự <span class="hljs-built_in">t</span>ừ đầu. 
+
+</code></pre>
+<p>To: <a href="mailto:dev@singa.apache.org">dev@singa.apache.org</a> Subject: [RESULT][vote] Release apache-singa-X.Y.Z
+(release candidate N)</p>
+<p>Thanks to everyone who has voted and given their comments. The tally is as
+follows.</p>
+<p>N binding +1s: <names></p>
+<p>N non-binding +1s: <names></p>
+<p>No 0s or -1s.</p>
+<p>I am delighted to announce that the proposal to release Apache SINGA X.Y.Z has
+passed.</p>
+<pre><code class="hljs">
+8) Tải gói chương trình để
+[<span class="hljs-string">phân bổ</span>](<span class="hljs-link">http://www.apache.org/dev/release-publishing.html#distribution</span>)
+tới https://dist.apache.org/repos/dist/release/singa/.
+
+9) Cập nhật trang Tải (Download) trên website SINGA. Tệp tin tar.gz PHẢI được tải từ mirror, sử dụng closer.cgi script; các tạo tác khác PHẢI được tải từ trang chủ Apache. Xem chi tiết tại 
+[<span class="hljs-string">đây</span>](<span class="hljs-link">http://www.apache.org/dev/release-download-pages.html</span>). Một vài nhận xét chúng tôi nhận được trong các đợt phát hành trước: "Trang Tải chỉ nên được dẫn tới các bản phát hành chính thức, vì vậy phải bao gồm đường dẫn tới GitHub.", "Đường dẫn tới KEYS, sigs và
+hashes không nên sử dụng dist.apache.org; mà nên dùng 
+https://www.apache.org/dist/singa/...;", "Và bạn chỉ cần một đường dẫn tới KEYS,
+và cần có hướng dẫn cách sử dụng KEYS + sig hay hash để chứng thực hoàn tất việc tải."
+
+10) Xoá tag RC và tập hợp gói conda packages.
+
+11) Xuất bản thông tin phát hành.
+
+ <span class="hljs-code">```</span>
+ To: announce@apache.org, dev@singa.apache.org
+ Subject: [ANNOUNCE] Apache SINGA X.Y.Z released
+
+ We are pleased to announce that SINGA X.Y.Z is released.
+
+ SINGA is a general distributed deep learning platform
+ for training big deep learning models over large datasets.
+ The release is available at: http://singa.apache.org/downloads.html
+ The main features of this release include XXX
+ We look forward to hearing your feedback, suggestions,
+ and contributions to the project.
+
+ On behalf of the SINGA team, {SINGA Team Member Name}
+ <span class="hljs-code">```</span>
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/contribute-docs"><span class="arrow-prev">← </span><span>How to Contribute to Documentation</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/git-workflow"><span>Git Workflow</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src= [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/install-win.html b/content/docs/3.1.0_Viet/install-win.html
new file mode 100644
index 0000000..ddb171e
--- /dev/null
+++ b/content/docs/3.1.0_Viet/install-win.html
@@ -0,0 +1,358 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Cách cài SINGA trên Windows · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regardi [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+<p>Quá trình cài đặt SINGA từ nguồn sử dụng Microsoft Windows bao gồm bốn bước:
+cài đặt thư viện dependencies, cài SINGA từ nguồn, (không bắt buộc) cài đặt python module
+và (không bắt buộc) chạy thử unit tests.</p>
+<h2><a class="anchor" aria-hidden="true" id="cài-đặt-thư-viện-dependencies"></a><a href="#cài-đặt-thư-viện-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
+<p>Bạn có thể tạo một thư mục để cài đặt thư viện dependencies.</p>
+<p>Các thư viện dependencies bao gồm:</p>
+<ul>
+<li><p>Compiler và IDE</p>
+<ul>
+<li>Visual Studio. Công cụ biên tập mã này miễn phí và có thể được dùng trong việc cài đặt SINGA.
+<a href="https://www.visualstudio.com/">https://www.visualstudio.com/</a></li>
+</ul></li>
+<li><p>CMake</p>
+<ul>
+<li>Có thể tải về qua <a href="http://cmake.org/">http://cmake.org/</a></li>
+<li>Đảm bảo đường dẫn khả thi của cmake nằm trong đường dẫn chương trình system path, hoặc sử dụng đường dẫn đầy đủ khi gọi hàm cmake.</li>
+</ul></li>
+<li><p>SWIG</p>
+<ul>
+<li>Có thể tải từ <a href="http://swig.org/">http://swig.org/</a></li>
+<li>Đảm bảo đường dẫn khả thi của swig nằm trong đường dẫn chương trình system path, hoặc sử dụng đường dẫn đầy đủ khi gọi hàm swig. Sử dụng các phiên bản cập nhật như 3.0.12.</li>
+</ul></li>
+<li><p>Protocol Buffers</p>
+<ul>
+<li>Tải các phiên bản phù hợp như 2.6.1:
+<a href="https://github.com/google/protobuf/releases/tag/v2.6.1">https://github.com/google/protobuf/releases/tag/v2.6.1</a> .</li>
+<li>Tải cả hai tệp protobuf-2.6.1.zip và protoc-2.6.1-win32.zip .</li>
+<li>Giải nén cả hai tệp trên trong thư mục thư viện dependencies. Thêm đường dẫn khả thi cho protoc
+vào system path, hoặc sử dụng đường dẫn đầy đủ khi gọi hàm này.</li>
+<li>Mở Visual Studio solution có thể tìm trong thư mục vsproject.</li>
+<li>Thay đổi cài đặt thiết lập Settings tới Release and x64.</li>
+<li>Cài đặt libprotobuf project.</li>
+</ul></li>
+<li><p>Openblas</p>
+<ul>
+<li>Tải phiên bản nguồn phù hợp như 0.2.20 từ
+<a href="http://www.openblas.net">http://www.openblas.net</a></li>
+<li>Giải nén nguồn trong thư mục thư viện dependencies.</li>
+<li>Nếu bạn không có chương trình Perl, tải perl environment như
+Strawberry Perl (<a href="http://strawberryperl.com/">http://strawberryperl.com/</a>)</li>
+<li>Cài đặt Visual Studio solution bằng lệnh sau từ thư mục nguồn:</li>
+</ul>
+<pre><code class="hljs css language-bash">cmake -G <span class="hljs-string">"Visual Studio 15 2017 Win64"</span>
+</code></pre>
+<ul>
+<li>Mở Visual Studio solution và thay đổi cấu hình cài đặt cho Release and
+x64.</li>
+<li>Cài libopenblas project</li>
+</ul></li>
+<li><p>Google glog</p>
+<ul>
+<li>Tải phiên bản phù hợp như 0.3.5 từ
+<a href="https://github.com/google/glog/releases">https://github.com/google/glog/releases</a></li>
+<li>Giải nén nguồn trong thư mục thư viện dependencies.</li>
+<li>Mở Visual Studio solution.</li>
+<li>Thay đổi cài đặt thiết lập Settings tới Release and x64.</li>
+<li>Cài đặt libglog project</li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="cài-singa-từ-nguồn"></a><a href="#cài-singa-từ-nguồn" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<ul>
+<li><p>Tải code nguồn của SINGA</p></li>
+<li><p>Cấu tạo các tệp protobuf:</p>
+<ul>
+<li>Tới thư mục src/proto</li>
+</ul>
+<pre><code class="hljs css language-shell">mkdir python_out
+protoc.exe *.proto --python_out python_out
+</code></pre></li>
+<li><p>Tạo swig interfaces cho C++ và Python: Tới mục src/api</p>
+<pre><code class="hljs css language-shell">swig -python -c++ singa.i
+</code></pre></li>
+<li><p>Tạo Visual Studio solution cho SINGA: Đi tới thư mục nguồn SINGA</p>
+<pre><code class="hljs css language-shell">mkdir build
+cd build
+</code></pre></li>
+<li><p>Gọi hàm cmake và thêm đường dẫn vào trong system của bạn, tương tự như ví dụ sau:</p>
+<pre><code class="hljs css language-shell">cmake -G "Visual Studio 15 2017 Win64" ^
+  -DGLOG_INCLUDE_DIR="D:/WinSinga/dependencies/glog-0.3.5/src/windows" ^
+  -DGLOG_LIBRARIES="D:/WinSinga/dependencies/glog-0.3.5/x64/Release" ^
+  -DCBLAS_INCLUDE_DIR="D:/WinSinga/dependencies/openblas-0.2.20/lapack-netlib/CBLAS/include" ^
+  -DCBLAS_LIBRARIES="D:/WinSinga/dependencies/openblas-0.2.20/lib/RELEASE" ^
+  -DProtobuf_INCLUDE_DIR="D:/WinSinga/dependencies/protobuf-2.6.1/src" ^
+  -DProtobuf_LIBRARIES="D:/WinSinga/dependencies/protobuf-2.6.1/vsprojects/x64/Release" ^
+  -DProtobuf_PROTOC_EXECUTABLE="D:/WinSinga/dependencies/protoc-2.6.1-win32/protoc.exe" ^
+  ..
+</code></pre></li>
+<li><p>Mở generated solution trong Visual Studio</p></li>
+<li><p>Thay đổi cài đặt thiết lập Settings tới Release and x64</p></li>
+<li><p>Thêm tệp tin singa_wrap.cxx từ src/api tới singa_objects project</p></li>
+<li><p>Trong singa_objects project, mở Additional Include Directories.</p></li>
+<li><p>Thêm Python bao gồm đường dẫn</p></li>
+<li><p>Thêm numpy bao gồm đường dẫn</p></li>
+<li><p>Thêm protobuf bao gồm đường dẫn</p></li>
+<li><p>Trong định nghĩa preprocessor của singa_objects project, thêm USE_GLOG</p></li>
+<li><p>Sử dụng singa_objects project</p></li>
+<li><p>Trong singa project:</p>
+<ul>
+<li>thêm singa_wrap.obj vào Thư viện Object</li>
+<li>đổi tên mục target thành _singa_wrap</li>
+<li>đổi định dạng tệp target thành .pyd</li>
+<li>đổi định dạng cấu hình sang Dynamic Library (.dll)</li>
+<li>đi tới Additional Library Directories và thêm đường dẫn vào các thư viện python, openblas,
+protobuf và glog</li>
+<li>đi tới các thư viện Dependencies bổ sung để thêm libopenblas.lib, libglog.lib và
+libprotobuf.lib</li>
+</ul></li>
+<li><p>tạo singa project</p></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="cài-đặt-python-module"></a><a href="#cài-đặt-python-module" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
+<ul>
+<li><p>Đổi <code>_singa_wrap.so</code> thành <code>_singa_wrap.pyd</code> trong build/python/setup.py</p></li>
+<li><p>Copy các tệp tin trong <code>src/proto/python_out</code> sang <code>build/python/singa/proto</code></p></li>
+<li><p>Không bắt buộc, tạo và kích hoạt virtual environment:</p>
+<pre><code class="hljs css language-shell">mkdir SingaEnv
+virtualenv SingaEnv
+SingaEnv\Scripts\activate
+</code></pre></li>
+<li><p>tới thư mục build/python và chạy:</p>
+<pre><code class="hljs css language-shell">python setup.py install
+</code></pre></li>
+<li><p>Sử dụng _singa_wrap.pyd, libglog.dll và libopenblas.dll bằng cách thêm chúng vào đường dẫn hoặc copy chúng vào thư mục gói chương trình singa trong gói python site-packages</p></li>
+<li><p>Xác nhận SINGA đã được cài đặt bằng cách chạy:</p>
+<pre><code class="hljs css language-shell">python -c "from singa import tensor"
+</code></pre></li>
+</ul>
+<p>Tham khảo video quá trình cài đặt tại đây:</p>
+<p><a href="https://www.youtube.com/watch?v=cteER7WeiGk"><img src="https://img.youtube.com/vi/cteER7WeiGk/0.jpg" alt="youtube video"></a></p>
+<h2><a class="anchor" aria-hidden="true" id="chạy-unit-tests"></a><a href="#chạy-unit-tests" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
+<ul>
+<li><p>Trong thư mục test, tạo Visual Studio solution:</p>
+<pre><code class="hljs css language-shell">cmake -G "Visual Studio 15 2017 Win64"
+</code></pre></li>
+<li><p>Mở generated solution trong Visual Studio.</p></li>
+<li><p>Thay đổi cài đặt thiết lập Settings tới Release and x64.</p></li>
+<li><p>Tạo glog project.</p></li>
+<li><p>Trong mục test_singa project:</p>
+<ul>
+<li>Thêm USE_GLOG vào Định nghĩa Preprocessor.</li>
+<li>Trong Additional Include Directories, thêm đường dẫn của GLOG_INCLUDE_DIR,
+CBLAS_INCLUDE_DIR và Protobuf_INCLUDE_DIR đã được dùng ở bước 2 bên trên.
+Đồng thời tạo và tạo/bao gồm các thư mục.</li>
+<li>Đi tới Additional Library Directories và thêm đường dẫn vào thư viện openblas, protobuf
+và glog. Thêm build/src/singa_objects.dir/Release.</li>
+<li>Tới Thư viện Dependencies bổ sung và thêm libopenblas.lib, libglog.lib và
+libprotobuf.lib. Sửa tên của hai thư viện: gtest.lib và
+singa_objects.lib.</li>
+</ul></li>
+<li><p>Cài test_singa project.</p></li>
+<li><p>Sử dụng libglog.dll và libopenblas.dll bằng cách thêm chúng vào đường dẫn hoặc copy chúng vào thư mục test/release.</p></li>
+<li><p>Tiến hành unit tests bằng cách</p>
+<ul>
+<li>Từ dòng lệnh:</li>
+</ul>
+<pre><code class="hljs css language-shell">test_singa.exe
+</code></pre>
+<ul>
+<li>Từ Visual Studio:
+<ul>
+<li>ấn chuột phải tại test_singa project và chọn 'Set as StartUp Project'.</li>
+<li>Từ mục Debug menu, chọn 'Start Without Debugging'</li>
+</ul></li>
+</ul></li>
+</ul>
+<p>Tham khảo video hướng dẫn chạy unit tests tại đây:</p>
+<p><a href="https://www.youtube.com/watch?v=393gPtzMN1k"><img src="https://img.youtube.com/vi/393gPtzMN1k/0.jpg" alt="youtube video"></a></p>
+<h2><a class="anchor" aria-hidden="true" id="cài-đặt-hỗ-trợ-gpu-với-cuda"></a><a href="#cài-đặt-hỗ-trợ-gpu-với-cuda" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>Trong mục này, chúng tôi sẽ mở rộng các bước phía trên để sử dụng GPU.</p>
+<h3><a class="anchor" aria-hidden="true" id="cài-đặt-thư-viện-dependencies-1"></a><a href="#cài-đặt-thư-viện-dependencies-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
+<p>Ngoài các thư viện dependencies ở mục 1 phía trên, chúng ta cần:</p>
+<ul>
+<li><p>CUDA</p>
+<p>Tải phiên bản phù hợp như 9.1 từ
+<a href="https://developer.nvidia.com/cuda-downloads">https://developer.nvidia.com/cuda-downloads</a> . Đảm bảo bạn cài đặt Visual
+Studio integration module.</p></li>
+<li><p>cuDNN</p>
+<p>Tải phiên bản phù hợp như 7.1 từ
+<a href="https://developer.nvidia.com/cudnn">https://developer.nvidia.com/cudnn</a></p></li>
+<li><p>cnmem:</p>
+<ul>
+<li>Tải phiên bản mới nhất tại  <a href="https://github.com/NVIDIA/cnmem">https://github.com/NVIDIA/cnmem</a></li>
+<li>Tạo Visual Studio solution:</li>
+</ul>
+<pre><code class="hljs css language-shell">cmake -G "Visual Studio 15 2017 Win64"
+</code></pre>
+<ul>
+<li>Mở generated solution trong Visual Studio.</li>
+<li>Thay đổi cài đặt thiết lập Settings tới Release and x64.</li>
+<li>Tạo cnmem project.</li>
+</ul></li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="cài-singa-từ-nguồn-1"></a><a href="#cài-singa-từ-nguồn-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<ul>
+<li>Gọi hàm cmake và thêm đường dẫn vào trong system của bạn, tương tự như ví dụ sau:
+<pre><code class="hljs css language-shell">cmake -G "Visual Studio 15 2017 Win64" ^
+  -DGLOG_INCLUDE_DIR="D:/WinSinga/dependencies/glog-0.3.5/src/windows" ^
+  -DGLOG_LIBRARIES="D:/WinSinga/dependencies/glog-0.3.5/x64/Release" ^
+  -DCBLAS_INCLUDE_DIR="D:/WinSinga/dependencies/openblas-0.2.20/lapack-netlib/CBLAS/include" ^
+  -DCBLAS_LIBRARIES="D:/WinSinga/dependencies/openblas-0.2.20/lib/RELEASE" ^
+  -DProtobuf_INCLUDE_DIR="D:/WinSinga/dependencies/protobuf-2.6.1/src" ^
+  -DProtobuf_LIBRARIES="D:\WinSinga/dependencies/protobuf-2.6.1/vsprojects/x64/Release" ^
+  -DProtobuf_PROTOC_EXECUTABLE="D:/WinSinga/dependencies/protoc-2.6.1-win32/protoc.exe" ^
+  -DCUDNN_INCLUDE_DIR=D:\WinSinga\dependencies\cudnn-9.1-windows10-x64-v7.1\cuda\include ^
+  -DCUDNN_LIBRARIES=D:\WinSinga\dependencies\cudnn-9.1-windows10-x64-v7.1\cuda\lib\x64 ^
+  -DSWIG_DIR=D:\WinSinga\dependencies\swigwin-3.0.12 ^
+  -DSWIG_EXECUTABLE=D:\WinSinga\dependencies\swigwin-3.0.12\swig.exe ^
+  -DUSE_CUDA=YES ^
+  -DCUDNN_VERSION=7 ^
+  ..
+</code></pre></li>
+</ul>
+<ul>
+<li><p>Tạo swig interfaces cho C++ và Python: Tới mục src/api</p>
+<pre><code class="hljs css language-shell">swig -python -c++ singa.i
+</code></pre></li>
+<li><p>Mở generated solution trong Visual Studio</p></li>
+<li><p>Thay đổi cài đặt thiết lập Settings tới Release and x64.</p></li>
+</ul>
+<h4><a class="anchor" aria-hidden="true" id="tạo-singa_objects"></a><a href="#tạo-singa_objects" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<ul>
+<li>Thêm tệp tin singa_wrap.cxx từ src/api tới singa_objects project</li>
+<li>Trong singa_objects project, mở Additional Include Directories.</li>
+<li>Thêm Python bao gồm đường dẫn</li>
+<li>Thêm numpy bao gồm đường dẫn</li>
+<li>Thêm protobuf bao gồm đường dẫn</li>
+<li>Bổ sung bao gồm đường dẫn cho CUDA, cuDNN và cnmem</li>
+<li>Trong định nghĩa preprocessor của singa_objects project, thêm USE_GLOG,
+USE_CUDA và USE_CUDNN. Xoá DISABLE_WARNINGS.</li>
+<li>Tạo singa_objects project</li>
+</ul>
+<h4><a class="anchor" aria-hidden="true" id="tạo-singa-kernel"></a><a href="#tạo-singa-kernel" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<ul>
+<li><p>Tạo một Visual Studio project mới dưới dạng &quot;CUDA 9.1 Runtime&quot;. Đặt tên dạng như singa-kernel.</p></li>
+<li><p>project này chứa sẵn một tệp tin là kernel.cu. Xoá tệp tin này khỏi project.</p></li>
+<li><p>Thêm tệp tin này: src/core/tensor/math_kernel.cu</p></li>
+<li><p>Trong mục cài đặt project:</p>
+<ul>
+<li>Đặt Platform Toolset sang dạng &quot;Visual Studio 2015 (v140)&quot;</li>
+<li>Đổi Configuration Type sang &quot; Static Library (.lib)&quot;</li>
+<li>Trong mục Include Directories, thêm vào build/include.</li>
+</ul></li>
+<li><p>Tạo singa-kernel project</p></li>
+</ul>
+<h4><a class="anchor" aria-hidden="true" id="cài-đặt-singa"></a><a href="#cài-đặt-singa" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<ul>
+<li><p>Trong singa project:</p>
+<ul>
+<li>thêm singa_wrap.obj vào Object Libraries</li>
+<li>đổi tên target thành _singa_wrap</li>
+<li>đổi định dạng target sang .pyd</li>
+<li>đổi định dạng cấu hình sang Dynamic Library (.dll)</li>
+<li>đi tới Additional Library Directories và thêm đường dẫn vào các thư viện python, openblas,
+protobuf và glog</li>
+<li>thêm các đường dẫn thư viện cho singa-kernel, cnmem, cuda và cudnn.</li>
+<li>đi tới các thư viện Dependencies bổ sung để thêm libopenblas.lib, libglog.lib và
+libprotobuf.lib</li>
+<li>Đồng thời thêm: singa-kernel.lib, cnmem.lib, cudnn.lib, cuda.lib , cublas.lib,
+curand.lib và cudart.lib.</li>
+</ul></li>
+<li><p>tạo singa project</p></li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="cài-đặt-python-module-1"></a><a href="#cài-đặt-python-module-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
+<ul>
+<li><p>Đổi tên  _singa_wrap.so sang _singa_wrap.pyd trong mục build/python/setup.py</p></li>
+<li><p>Copy các tệp tin trong src/proto/python_out sang build/python/singa/proto</p></li>
+<li><p>Không bắt buộc, tạo và kích hoạt virtual environment:</p>
+<pre><code class="hljs css language-shell">mkdir SingaEnv
+virtualenv SingaEnv
+SingaEnv\Scripts\activate
+</code></pre></li>
+<li><p>tới thư mục build/python và chạy:</p>
+<pre><code class="hljs css language-shell">python setup.py install
+</code></pre></li>
+<li><p>Sử dụng _singa_wrap.pyd, libglog.dll, libopenblas.dll, cnmem.dll, CUDA Runtime
+(e.g. cudart64_91.dll) và cuDNN (e.g. cudnn64_7.dll) bằng cách thêm chúng vào đường dẫn hoặc copy chúng vào thư mục gói chương trình singa trong gói python site-packages</p></li>
+<li><p>Xác nhận SINGA đã được cài đặt bằng cách chạy:</p>
+<pre><code class="hljs css language-shell">python -c "from singa import device; dev = device.create_cuda_gpu()"
+</code></pre></li>
+</ul>
+<p>Tham khảo video hướng dẫn cho mục này tại đây:</p>
+<p><a href="https://www.youtube.com/watch?v=YasKVjRtuDs"><img src="https://img.youtube.com/vi/YasKVjRtuDs/0.jpg" alt="youtube video"></a></p>
+<h3><a class="anchor" aria-hidden="true" id="run-unit-tests"></a><a href="#run-unit-tests" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<ul>
+<li><p>Trong thư mục tests, tạo Visual Studio solution:</p>
+<pre><code class="hljs css language-shell">cmake -G "Visual Studio 15 2017 Win64"
+</code></pre></li>
+<li><p>Mở solution được tạo trong Visual Studio, hoặc thêm project vào singa
+solution đã được tạo ở bước 5.2</p></li>
+<li><p>Thay đổi cài đặt thiết lập Settings tới Release and x64.</p></li>
+<li><p>Tạo glog project.</p></li>
+<li><p>Trong test_singa project:</p>
+<ul>
+<li>Thêm USE_GLOG; USE_CUDA; USE_CUDNN vào Định Nghĩa Preprocessor.</li>
+<li>Trong Thư viện Dependencies bổ sung, thêm đường dẫn của GLOG_INCLUDE_DIR,
+CBLAS_INCLUDE_DIR và Protobuf_INCLUDE_DIR đã được sử dụng tại bước 5.2
+ở trên. Và thêm build, build/include, CUDA và cuDNN bao gồm thư mục.</li>
+<li>Tới Thư viện Dependencies bổ sung và thêm đường dẫn của thư viện openblas, protobuf
+và glog. Và thêm đường dẫn thư viện của build/src/singa_objects.dir/Release,
+singa-kernel, cnmem, CUDA và cuDNN.</li>
+<li>Tới Thư viện Dependencies bổ sung và thêm libopenblas.lib; libglog.lib;
+libprotobuf.lib; cnmem.lib; cudnn.lib; cuda.lib; cublas.lib; curand.lib;
+cudart.lib; singa-kernel.lib. Sửa tên của hai thư viện: gtest.lib và
+singa_objects.lib.</li>
+</ul></li>
+</ul>
+<ul>
+<li><p>Tạo test_singa project.</p></li>
+<li><p>Sử dụng libglog.dll, libopenblas.dll, cnmem.dll, cudart64_91.dll và
+cudnn64_7.dll bằng cách thêm chúng vào đường dẫn hoặc copy chúng vào thư mục test/release.</p></li>
+</ul>
+<ul>
+<li><p>Tiến hành unit tests bằng cách:</p>
+<ul>
+<li><p>Từ dòng lệnh:</p>
+<pre><code class="hljs css language-shell">test_singa.exe
+</code></pre></li>
+<li><p>Từ Visual Studio:</p>
+<ul>
+<li>ấn chuột phải tại test_singa project và chọn 'Set as StartUp Project'.</li>
+<li>Từ mục Debug menu, chọn 'Start Without Debugging'</li>
+</ul></li>
+</ul></li>
+</ul>
+<p>Tham khảo video hướng dẫn chạy unit tests tại đây:</p>
+<p><a href="https://www.youtube.com/watch?v=YOjwtrvTPn4"><img src="https://img.youtube.com/vi/YOjwtrvTPn4/0.jpg" alt="youtube video"></a></p>
+</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#cài-đặt-thư-viện-dependencies">Cài đặt thư viện dependencies</a></li><li><a href="#cài-singa-từ-nguồn">Cài SINGA từ nguồn</a></li><li><a href="#cài-đặt-python-module">Cài đặt Python module</a></li><li><a href="#chạy-unit-tests">Chạy Unit Tests</a></li><li><a href="#cài-đặt-hỗ-trợ-gpu-với-cuda">Cài đặt hỗ trợ GPU với CUDA</a><ul class="toc-headings"><li>< [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/install-win/index.html b/content/docs/3.1.0_Viet/install-win/index.html
new file mode 100644
index 0000000..ddb171e
--- /dev/null
+++ b/content/docs/3.1.0_Viet/install-win/index.html
@@ -0,0 +1,358 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Cách cài SINGA trên Windows · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regardi [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+<p>Quá trình cài đặt SINGA từ nguồn sử dụng Microsoft Windows bao gồm bốn bước:
+cài đặt thư viện dependencies, cài SINGA từ nguồn, (không bắt buộc) cài đặt python module
+và (không bắt buộc) chạy thử unit tests.</p>
+<h2><a class="anchor" aria-hidden="true" id="cài-đặt-thư-viện-dependencies"></a><a href="#cài-đặt-thư-viện-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
+<p>Bạn có thể tạo một thư mục để cài đặt thư viện dependencies.</p>
+<p>Các thư viện dependencies bao gồm:</p>
+<ul>
+<li><p>Compiler và IDE</p>
+<ul>
+<li>Visual Studio. Công cụ biên tập mã này miễn phí và có thể được dùng trong việc cài đặt SINGA.
+<a href="https://www.visualstudio.com/">https://www.visualstudio.com/</a></li>
+</ul></li>
+<li><p>CMake</p>
+<ul>
+<li>Có thể tải về qua <a href="http://cmake.org/">http://cmake.org/</a></li>
+<li>Đảm bảo đường dẫn khả thi của cmake nằm trong đường dẫn chương trình system path, hoặc sử dụng đường dẫn đầy đủ khi gọi hàm cmake.</li>
+</ul></li>
+<li><p>SWIG</p>
+<ul>
+<li>Có thể tải từ <a href="http://swig.org/">http://swig.org/</a></li>
+<li>Đảm bảo đường dẫn khả thi của swig nằm trong đường dẫn chương trình system path, hoặc sử dụng đường dẫn đầy đủ khi gọi hàm swig. Sử dụng các phiên bản cập nhật như 3.0.12.</li>
+</ul></li>
+<li><p>Protocol Buffers</p>
+<ul>
+<li>Tải các phiên bản phù hợp như 2.6.1:
+<a href="https://github.com/google/protobuf/releases/tag/v2.6.1">https://github.com/google/protobuf/releases/tag/v2.6.1</a> .</li>
+<li>Tải cả hai tệp protobuf-2.6.1.zip và protoc-2.6.1-win32.zip .</li>
+<li>Giải nén cả hai tệp trên trong thư mục thư viện dependencies. Thêm đường dẫn khả thi cho protoc
+vào system path, hoặc sử dụng đường dẫn đầy đủ khi gọi hàm này.</li>
+<li>Mở Visual Studio solution có thể tìm trong thư mục vsproject.</li>
+<li>Thay đổi cài đặt thiết lập Settings tới Release and x64.</li>
+<li>Cài đặt libprotobuf project.</li>
+</ul></li>
+<li><p>Openblas</p>
+<ul>
+<li>Tải phiên bản nguồn phù hợp như 0.2.20 từ
+<a href="http://www.openblas.net">http://www.openblas.net</a></li>
+<li>Giải nén nguồn trong thư mục thư viện dependencies.</li>
+<li>Nếu bạn không có chương trình Perl, tải perl environment như
+Strawberry Perl (<a href="http://strawberryperl.com/">http://strawberryperl.com/</a>)</li>
+<li>Cài đặt Visual Studio solution bằng lệnh sau từ thư mục nguồn:</li>
+</ul>
+<pre><code class="hljs css language-bash">cmake -G <span class="hljs-string">"Visual Studio 15 2017 Win64"</span>
+</code></pre>
+<ul>
+<li>Mở Visual Studio solution và thay đổi cấu hình cài đặt cho Release and
+x64.</li>
+<li>Cài libopenblas project</li>
+</ul></li>
+<li><p>Google glog</p>
+<ul>
+<li>Tải phiên bản phù hợp như 0.3.5 từ
+<a href="https://github.com/google/glog/releases">https://github.com/google/glog/releases</a></li>
+<li>Giải nén nguồn trong thư mục thư viện dependencies.</li>
+<li>Mở Visual Studio solution.</li>
+<li>Thay đổi cài đặt thiết lập Settings tới Release and x64.</li>
+<li>Cài đặt libglog project</li>
+</ul></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="cài-singa-từ-nguồn"></a><a href="#cài-singa-từ-nguồn" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<ul>
+<li><p>Tải code nguồn của SINGA</p></li>
+<li><p>Cấu tạo các tệp protobuf:</p>
+<ul>
+<li>Tới thư mục src/proto</li>
+</ul>
+<pre><code class="hljs css language-shell">mkdir python_out
+protoc.exe *.proto --python_out python_out
+</code></pre></li>
+<li><p>Tạo swig interfaces cho C++ và Python: Tới mục src/api</p>
+<pre><code class="hljs css language-shell">swig -python -c++ singa.i
+</code></pre></li>
+<li><p>Tạo Visual Studio solution cho SINGA: Đi tới thư mục nguồn SINGA</p>
+<pre><code class="hljs css language-shell">mkdir build
+cd build
+</code></pre></li>
+<li><p>Gọi hàm cmake và thêm đường dẫn vào trong system của bạn, tương tự như ví dụ sau:</p>
+<pre><code class="hljs css language-shell">cmake -G "Visual Studio 15 2017 Win64" ^
+  -DGLOG_INCLUDE_DIR="D:/WinSinga/dependencies/glog-0.3.5/src/windows" ^
+  -DGLOG_LIBRARIES="D:/WinSinga/dependencies/glog-0.3.5/x64/Release" ^
+  -DCBLAS_INCLUDE_DIR="D:/WinSinga/dependencies/openblas-0.2.20/lapack-netlib/CBLAS/include" ^
+  -DCBLAS_LIBRARIES="D:/WinSinga/dependencies/openblas-0.2.20/lib/RELEASE" ^
+  -DProtobuf_INCLUDE_DIR="D:/WinSinga/dependencies/protobuf-2.6.1/src" ^
+  -DProtobuf_LIBRARIES="D:/WinSinga/dependencies/protobuf-2.6.1/vsprojects/x64/Release" ^
+  -DProtobuf_PROTOC_EXECUTABLE="D:/WinSinga/dependencies/protoc-2.6.1-win32/protoc.exe" ^
+  ..
+</code></pre></li>
+<li><p>Mở generated solution trong Visual Studio</p></li>
+<li><p>Thay đổi cài đặt thiết lập Settings tới Release and x64</p></li>
+<li><p>Thêm tệp tin singa_wrap.cxx từ src/api tới singa_objects project</p></li>
+<li><p>Trong singa_objects project, mở Additional Include Directories.</p></li>
+<li><p>Thêm Python bao gồm đường dẫn</p></li>
+<li><p>Thêm numpy bao gồm đường dẫn</p></li>
+<li><p>Thêm protobuf bao gồm đường dẫn</p></li>
+<li><p>Trong định nghĩa preprocessor của singa_objects project, thêm USE_GLOG</p></li>
+<li><p>Sử dụng singa_objects project</p></li>
+<li><p>Trong singa project:</p>
+<ul>
+<li>thêm singa_wrap.obj vào Thư viện Object</li>
+<li>đổi tên mục target thành _singa_wrap</li>
+<li>đổi định dạng tệp target thành .pyd</li>
+<li>đổi định dạng cấu hình sang Dynamic Library (.dll)</li>
+<li>đi tới Additional Library Directories và thêm đường dẫn vào các thư viện python, openblas,
+protobuf và glog</li>
+<li>đi tới các thư viện Dependencies bổ sung để thêm libopenblas.lib, libglog.lib và
+libprotobuf.lib</li>
+</ul></li>
+<li><p>tạo singa project</p></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="cài-đặt-python-module"></a><a href="#cài-đặt-python-module" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
+<ul>
+<li><p>Đổi <code>_singa_wrap.so</code> thành <code>_singa_wrap.pyd</code> trong build/python/setup.py</p></li>
+<li><p>Copy các tệp tin trong <code>src/proto/python_out</code> sang <code>build/python/singa/proto</code></p></li>
+<li><p>Không bắt buộc, tạo và kích hoạt virtual environment:</p>
+<pre><code class="hljs css language-shell">mkdir SingaEnv
+virtualenv SingaEnv
+SingaEnv\Scripts\activate
+</code></pre></li>
+<li><p>tới thư mục build/python và chạy:</p>
+<pre><code class="hljs css language-shell">python setup.py install
+</code></pre></li>
+<li><p>Sử dụng _singa_wrap.pyd, libglog.dll và libopenblas.dll bằng cách thêm chúng vào đường dẫn hoặc copy chúng vào thư mục gói chương trình singa trong gói python site-packages</p></li>
+<li><p>Xác nhận SINGA đã được cài đặt bằng cách chạy:</p>
+<pre><code class="hljs css language-shell">python -c "from singa import tensor"
+</code></pre></li>
+</ul>
+<p>Tham khảo video quá trình cài đặt tại đây:</p>
+<p><a href="https://www.youtube.com/watch?v=cteER7WeiGk"><img src="https://img.youtube.com/vi/cteER7WeiGk/0.jpg" alt="youtube video"></a></p>
+<h2><a class="anchor" aria-hidden="true" id="chạy-unit-tests"></a><a href="#chạy-unit-tests" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
+<ul>
+<li><p>Trong thư mục test, tạo Visual Studio solution:</p>
+<pre><code class="hljs css language-shell">cmake -G "Visual Studio 15 2017 Win64"
+</code></pre></li>
+<li><p>Mở generated solution trong Visual Studio.</p></li>
+<li><p>Thay đổi cài đặt thiết lập Settings tới Release and x64.</p></li>
+<li><p>Tạo glog project.</p></li>
+<li><p>Trong mục test_singa project:</p>
+<ul>
+<li>Thêm USE_GLOG vào Định nghĩa Preprocessor.</li>
+<li>Trong Additional Include Directories, thêm đường dẫn của GLOG_INCLUDE_DIR,
+CBLAS_INCLUDE_DIR và Protobuf_INCLUDE_DIR đã được dùng ở bước 2 bên trên.
+Đồng thời tạo và tạo/bao gồm các thư mục.</li>
+<li>Đi tới Additional Library Directories và thêm đường dẫn vào thư viện openblas, protobuf
+và glog. Thêm build/src/singa_objects.dir/Release.</li>
+<li>Tới Thư viện Dependencies bổ sung và thêm libopenblas.lib, libglog.lib và
+libprotobuf.lib. Sửa tên của hai thư viện: gtest.lib và
+singa_objects.lib.</li>
+</ul></li>
+<li><p>Cài test_singa project.</p></li>
+<li><p>Sử dụng libglog.dll và libopenblas.dll bằng cách thêm chúng vào đường dẫn hoặc copy chúng vào thư mục test/release.</p></li>
+<li><p>Tiến hành unit tests bằng cách</p>
+<ul>
+<li>Từ dòng lệnh:</li>
+</ul>
+<pre><code class="hljs css language-shell">test_singa.exe
+</code></pre>
+<ul>
+<li>Từ Visual Studio:
+<ul>
+<li>ấn chuột phải tại test_singa project và chọn 'Set as StartUp Project'.</li>
+<li>Từ mục Debug menu, chọn 'Start Without Debugging'</li>
+</ul></li>
+</ul></li>
+</ul>
+<p>Tham khảo video hướng dẫn chạy unit tests tại đây:</p>
+<p><a href="https://www.youtube.com/watch?v=393gPtzMN1k"><img src="https://img.youtube.com/vi/393gPtzMN1k/0.jpg" alt="youtube video"></a></p>
+<h2><a class="anchor" aria-hidden="true" id="cài-đặt-hỗ-trợ-gpu-với-cuda"></a><a href="#cài-đặt-hỗ-trợ-gpu-với-cuda" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>Trong mục này, chúng tôi sẽ mở rộng các bước phía trên để sử dụng GPU.</p>
+<h3><a class="anchor" aria-hidden="true" id="cài-đặt-thư-viện-dependencies-1"></a><a href="#cài-đặt-thư-viện-dependencies-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
+<p>Ngoài các thư viện dependencies ở mục 1 phía trên, chúng ta cần:</p>
+<ul>
+<li><p>CUDA</p>
+<p>Tải phiên bản phù hợp như 9.1 từ
+<a href="https://developer.nvidia.com/cuda-downloads">https://developer.nvidia.com/cuda-downloads</a> . Đảm bảo bạn cài đặt Visual
+Studio integration module.</p></li>
+<li><p>cuDNN</p>
+<p>Tải phiên bản phù hợp như 7.1 từ
+<a href="https://developer.nvidia.com/cudnn">https://developer.nvidia.com/cudnn</a></p></li>
+<li><p>cnmem:</p>
+<ul>
+<li>Tải phiên bản mới nhất tại  <a href="https://github.com/NVIDIA/cnmem">https://github.com/NVIDIA/cnmem</a></li>
+<li>Tạo Visual Studio solution:</li>
+</ul>
+<pre><code class="hljs css language-shell">cmake -G "Visual Studio 15 2017 Win64"
+</code></pre>
+<ul>
+<li>Mở generated solution trong Visual Studio.</li>
+<li>Thay đổi cài đặt thiết lập Settings tới Release and x64.</li>
+<li>Tạo cnmem project.</li>
+</ul></li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="cài-singa-từ-nguồn-1"></a><a href="#cài-singa-từ-nguồn-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<ul>
+<li>Gọi hàm cmake và thêm đường dẫn vào trong system của bạn, tương tự như ví dụ sau:
+<pre><code class="hljs css language-shell">cmake -G "Visual Studio 15 2017 Win64" ^
+  -DGLOG_INCLUDE_DIR="D:/WinSinga/dependencies/glog-0.3.5/src/windows" ^
+  -DGLOG_LIBRARIES="D:/WinSinga/dependencies/glog-0.3.5/x64/Release" ^
+  -DCBLAS_INCLUDE_DIR="D:/WinSinga/dependencies/openblas-0.2.20/lapack-netlib/CBLAS/include" ^
+  -DCBLAS_LIBRARIES="D:/WinSinga/dependencies/openblas-0.2.20/lib/RELEASE" ^
+  -DProtobuf_INCLUDE_DIR="D:/WinSinga/dependencies/protobuf-2.6.1/src" ^
+  -DProtobuf_LIBRARIES="D:\WinSinga/dependencies/protobuf-2.6.1/vsprojects/x64/Release" ^
+  -DProtobuf_PROTOC_EXECUTABLE="D:/WinSinga/dependencies/protoc-2.6.1-win32/protoc.exe" ^
+  -DCUDNN_INCLUDE_DIR=D:\WinSinga\dependencies\cudnn-9.1-windows10-x64-v7.1\cuda\include ^
+  -DCUDNN_LIBRARIES=D:\WinSinga\dependencies\cudnn-9.1-windows10-x64-v7.1\cuda\lib\x64 ^
+  -DSWIG_DIR=D:\WinSinga\dependencies\swigwin-3.0.12 ^
+  -DSWIG_EXECUTABLE=D:\WinSinga\dependencies\swigwin-3.0.12\swig.exe ^
+  -DUSE_CUDA=YES ^
+  -DCUDNN_VERSION=7 ^
+  ..
+</code></pre></li>
+</ul>
+<ul>
+<li><p>Tạo swig interfaces cho C++ và Python: Tới mục src/api</p>
+<pre><code class="hljs css language-shell">swig -python -c++ singa.i
+</code></pre></li>
+<li><p>Mở generated solution trong Visual Studio</p></li>
+<li><p>Thay đổi cài đặt thiết lập Settings tới Release and x64.</p></li>
+</ul>
+<h4><a class="anchor" aria-hidden="true" id="tạo-singa_objects"></a><a href="#tạo-singa_objects" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<ul>
+<li>Thêm tệp tin singa_wrap.cxx từ src/api tới singa_objects project</li>
+<li>Trong singa_objects project, mở Additional Include Directories.</li>
+<li>Thêm Python bao gồm đường dẫn</li>
+<li>Thêm numpy bao gồm đường dẫn</li>
+<li>Thêm protobuf bao gồm đường dẫn</li>
+<li>Bổ sung bao gồm đường dẫn cho CUDA, cuDNN và cnmem</li>
+<li>Trong định nghĩa preprocessor của singa_objects project, thêm USE_GLOG,
+USE_CUDA và USE_CUDNN. Xoá DISABLE_WARNINGS.</li>
+<li>Tạo singa_objects project</li>
+</ul>
+<h4><a class="anchor" aria-hidden="true" id="tạo-singa-kernel"></a><a href="#tạo-singa-kernel" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<ul>
+<li><p>Tạo một Visual Studio project mới dưới dạng &quot;CUDA 9.1 Runtime&quot;. Đặt tên dạng như singa-kernel.</p></li>
+<li><p>project này chứa sẵn một tệp tin là kernel.cu. Xoá tệp tin này khỏi project.</p></li>
+<li><p>Thêm tệp tin này: src/core/tensor/math_kernel.cu</p></li>
+<li><p>Trong mục cài đặt project:</p>
+<ul>
+<li>Đặt Platform Toolset sang dạng &quot;Visual Studio 2015 (v140)&quot;</li>
+<li>Đổi Configuration Type sang &quot; Static Library (.lib)&quot;</li>
+<li>Trong mục Include Directories, thêm vào build/include.</li>
+</ul></li>
+<li><p>Tạo singa-kernel project</p></li>
+</ul>
+<h4><a class="anchor" aria-hidden="true" id="cài-đặt-singa"></a><a href="#cài-đặt-singa" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<ul>
+<li><p>Trong singa project:</p>
+<ul>
+<li>thêm singa_wrap.obj vào Object Libraries</li>
+<li>đổi tên target thành _singa_wrap</li>
+<li>đổi định dạng target sang .pyd</li>
+<li>đổi định dạng cấu hình sang Dynamic Library (.dll)</li>
+<li>đi tới Additional Library Directories và thêm đường dẫn vào các thư viện python, openblas,
+protobuf và glog</li>
+<li>thêm các đường dẫn thư viện cho singa-kernel, cnmem, cuda và cudnn.</li>
+<li>đi tới các thư viện Dependencies bổ sung để thêm libopenblas.lib, libglog.lib và
+libprotobuf.lib</li>
+<li>Đồng thời thêm: singa-kernel.lib, cnmem.lib, cudnn.lib, cuda.lib , cublas.lib,
+curand.lib và cudart.lib.</li>
+</ul></li>
+<li><p>tạo singa project</p></li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="cài-đặt-python-module-1"></a><a href="#cài-đặt-python-module-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
+<ul>
+<li><p>Đổi tên  _singa_wrap.so sang _singa_wrap.pyd trong mục build/python/setup.py</p></li>
+<li><p>Copy các tệp tin trong src/proto/python_out sang build/python/singa/proto</p></li>
+<li><p>Không bắt buộc, tạo và kích hoạt virtual environment:</p>
+<pre><code class="hljs css language-shell">mkdir SingaEnv
+virtualenv SingaEnv
+SingaEnv\Scripts\activate
+</code></pre></li>
+<li><p>tới thư mục build/python và chạy:</p>
+<pre><code class="hljs css language-shell">python setup.py install
+</code></pre></li>
+<li><p>Sử dụng _singa_wrap.pyd, libglog.dll, libopenblas.dll, cnmem.dll, CUDA Runtime
+(e.g. cudart64_91.dll) và cuDNN (e.g. cudnn64_7.dll) bằng cách thêm chúng vào đường dẫn hoặc copy chúng vào thư mục gói chương trình singa trong gói python site-packages</p></li>
+<li><p>Xác nhận SINGA đã được cài đặt bằng cách chạy:</p>
+<pre><code class="hljs css language-shell">python -c "from singa import device; dev = device.create_cuda_gpu()"
+</code></pre></li>
+</ul>
+<p>Tham khảo video hướng dẫn cho mục này tại đây:</p>
+<p><a href="https://www.youtube.com/watch?v=YasKVjRtuDs"><img src="https://img.youtube.com/vi/YasKVjRtuDs/0.jpg" alt="youtube video"></a></p>
+<h3><a class="anchor" aria-hidden="true" id="run-unit-tests"></a><a href="#run-unit-tests" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<ul>
+<li><p>Trong thư mục tests, tạo Visual Studio solution:</p>
+<pre><code class="hljs css language-shell">cmake -G "Visual Studio 15 2017 Win64"
+</code></pre></li>
+<li><p>Mở solution được tạo trong Visual Studio, hoặc thêm project vào singa
+solution đã được tạo ở bước 5.2</p></li>
+<li><p>Thay đổi cài đặt thiết lập Settings tới Release and x64.</p></li>
+<li><p>Tạo glog project.</p></li>
+<li><p>Trong test_singa project:</p>
+<ul>
+<li>Thêm USE_GLOG; USE_CUDA; USE_CUDNN vào Định Nghĩa Preprocessor.</li>
+<li>Trong Thư viện Dependencies bổ sung, thêm đường dẫn của GLOG_INCLUDE_DIR,
+CBLAS_INCLUDE_DIR và Protobuf_INCLUDE_DIR đã được sử dụng tại bước 5.2
+ở trên. Và thêm build, build/include, CUDA và cuDNN bao gồm thư mục.</li>
+<li>Tới Thư viện Dependencies bổ sung và thêm đường dẫn của thư viện openblas, protobuf
+và glog. Và thêm đường dẫn thư viện của build/src/singa_objects.dir/Release,
+singa-kernel, cnmem, CUDA và cuDNN.</li>
+<li>Tới Thư viện Dependencies bổ sung và thêm libopenblas.lib; libglog.lib;
+libprotobuf.lib; cnmem.lib; cudnn.lib; cuda.lib; cublas.lib; curand.lib;
+cudart.lib; singa-kernel.lib. Sửa tên của hai thư viện: gtest.lib và
+singa_objects.lib.</li>
+</ul></li>
+</ul>
+<ul>
+<li><p>Tạo test_singa project.</p></li>
+<li><p>Sử dụng libglog.dll, libopenblas.dll, cnmem.dll, cudart64_91.dll và
+cudnn64_7.dll bằng cách thêm chúng vào đường dẫn hoặc copy chúng vào thư mục test/release.</p></li>
+</ul>
+<ul>
+<li><p>Tiến hành unit tests bằng cách:</p>
+<ul>
+<li><p>Từ dòng lệnh:</p>
+<pre><code class="hljs css language-shell">test_singa.exe
+</code></pre></li>
+<li><p>Từ Visual Studio:</p>
+<ul>
+<li>ấn chuột phải tại test_singa project và chọn 'Set as StartUp Project'.</li>
+<li>Từ mục Debug menu, chọn 'Start Without Debugging'</li>
+</ul></li>
+</ul></li>
+</ul>
+<p>Tham khảo video hướng dẫn chạy unit tests tại đây:</p>
+<p><a href="https://www.youtube.com/watch?v=YOjwtrvTPn4"><img src="https://img.youtube.com/vi/YOjwtrvTPn4/0.jpg" alt="youtube video"></a></p>
+</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#cài-đặt-thư-viện-dependencies">Cài đặt thư viện dependencies</a></li><li><a href="#cài-singa-từ-nguồn">Cài SINGA từ nguồn</a></li><li><a href="#cài-đặt-python-module">Cài đặt Python module</a></li><li><a href="#chạy-unit-tests">Chạy Unit Tests</a></li><li><a href="#cài-đặt-hỗ-trợ-gpu-với-cuda">Cài đặt hỗ trợ GPU với CUDA</a><ul class="toc-headings"><li>< [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/installation.html b/content/docs/3.1.0_Viet/installation.html
new file mode 100644
index 0000000..3854d7d
--- /dev/null
+++ b/content/docs/3.1.0_Viet/installation.html
@@ -0,0 +1,215 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Cài đặt · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright ownersh [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/installation.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Cài đặt</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor licen [...]
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng-conda"></a><a href="#sử-dụng-conda" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>Conda là gói quản lý chương trình cho Python, CPP và các phần mềm khác.</p>
+<p>Hiện nay SINGA có gói conda packages dùng cho Linux và MacOSX.
+<a href="https://conda.io/miniconda.html">Miniconda3</a> được khuyến khích dùng với SINGA.
+Sau khi cài đặt miniconda, thực hiện các lệnh sau để cài đặt
+SINGA.</p>
+<ol>
+<li>Cho CPU
+<a href="https://colab.research.google.com/drive/1Ntkhi-Z6XTR8WYPXiLwujHd2dOm0772V?usp=sharing"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Mở trên Colab"></a></li>
+</ol>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> conda install -c nusdbsystem -c conda-forge singa-cpu</span>
+</code></pre>
+<ol start="2">
+<li>GPU với CUDA và cuDNN (yêu cầu CUDA driver &gt;=384.81)
+<a href="https://colab.research.google.com/drive/1do_TLJe18IthLOnBOsHCEe-FFPGk1sPJ?usp=sharing"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Mở trên Colab"></a></li>
+</ol>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> conda install -c nusdbsystem -c conda-forge singa-gpu</span>
+</code></pre>
+<ol start="3">
+<li>Cài đặt SINGA với phiên bản cụ thể. Câu lệnh sau cho danh sách tất cả gói chương trình SINGA đang hoạt động.</li>
+</ol>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> conda search -c nusdbsystem singa</span>
+
+Loading channels: done
+<span class="hljs-meta">#</span><span class="bash"> Name                       Version           Build  Channel</span>
+singa                      3.1.0.rc2        cpu_py36  nusdbsystem
+singa                      3.1.0.rc2 cudnn7.6.5_cuda10.2_py36  nusdbsystem
+singa                      3.1.0.rc2 cudnn7.6.5_cuda10.2_py37  nusdbsystem
+</code></pre>
+<!--- > Lưu ý rằng việc sử dụng nightly built images không được khuyến khích ngoại trừ trong quá trình phát triển và kiểm định. Khuyến khích việc sử dụng phiên bản phát hành ổn định. -->
+<p>Dùng câu lệnh sau để cài đặt một phiên bản SINGA cụ thể,</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> conda install -c nusdbsystem -c conda-forge singa=X.Y.Z=cpu_py36</span>
+</code></pre>
+<p>Nếu không có lỗi khi chạy</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> python -c <span class="hljs-string">"from singa import tensor"</span></span>
+</code></pre>
+<p>thì bạn đã cài đặt SINGA thành công.</p>
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng-pip"></a><a href="#sử-dụng-pip" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
+<ol>
+<li>Cho CPU
+<a href="https://colab.research.google.com/drive/17RA056Brwk0vBQTFaZ-l9EbqwADO0NA9?usp=sharing"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Mở trên Colab"></a></li>
+</ol>
+<pre><code class="hljs css language-bash">pip install singa -f http://singa.apache.org/docs/next/wheel-cpu.html --trusted-host singa.apache.org
+</code></pre>
+<p>Bạn có thể cài đặt một phiên bản SINGA cụ thể sử dụng <code>singa==&lt;version&gt;</code>, thay thông tin
+<code>&lt;version&gt;</code>, v.d, <code>3.1.0</code>. Xem danh sách các phiên bản SINGA đang hoạt động ở đường dẫn.</p>
+<p>Để cài đặt phiên bản phát triển mới nhất, thay đường dẫn bằng
+<a href="http://singa.apache.org/docs/next/wheel-cpu-dev.html">http://singa.apache.org/docs/next/wheel-cpu-dev.html</a></p>
+<ol start="2">
+<li>GPU với CUDA và cuDNN
+<a href="https://colab.research.google.com/drive/1W30IPCqj5fG8ADAQsFqclaCLyIclVcJL?usp=sharing"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Mở trên Colab"></a></li>
+</ol>
+<pre><code class="hljs css language-bash">pip install singa -f http://singa.apache.org/docs/next/wheel-gpu.html --trusted-host singa.apache.org
+</code></pre>
+<p>Bạn có thể thiết lập phiên bản SINGA và CUDA, như
+<code>singa==3.1.0+cuda10.2</code>. Danh sách tổ hợp phiên bản SINGA với CUDA được cung cấp trong đường dẫn.</p>
+<p>Để cài đặt phiên bản phát triển mới nhất, thay đường dẫn bằng
+<a href="http://singa.apache.org/docs/next/wheel-gpu-dev.html">http://singa.apache.org/docs/next/wheel-gpu-dev.html</a></p>
+<p>Lưu ý: phiên bản Python của Python environment trong máy của bạn sẽ được sử dụng để tìm gói wheel tương ứng. Ví dụ, nếu bạn sử dụng Python 3.6, thì gói wheel kết cấu trong Python 3.6 sẽ được pip chọn để cài đặt.
+Thực tế, tên của tệp tin wheel bao gồm phiên bản SINGA, phiên bản CUDA và Python. Vì thế, <code>pip</code> biết tệp tin wheel nào để tải và cài đặt.</p>
+<p>Tham khảo chú thích ở phần đầu của tệp tin <code>setup.py</code> về cách tạo các gói
+wheel packages.</p>
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng-docker"></a><a href="#sử-dụng-docker" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>Cài đặt Docker vào máy chủ local theo
+<a href="https://docs.docker.com/install/">hướng dẫn</a>. Thêm người dùng vào
+<a href="https://docs.docker.com/install/linux/linux-postinstall/">nhóm docker</a> để chạy câu lệnh docker mà không cần dùng <code>sudo</code>.</p>
+<ol>
+<li>Cho CPU.</li>
+</ol>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> docker run -it apache/singa:X.Y.Z-cpu-ubuntu16.04 /bin/bash</span>
+</code></pre>
+<ol start="2">
+<li>Với GPU. Cài đặt
+<a href="https://github.com/NVIDIA/nvidia-docker">Nvidia-Docker</a> sau khi cài
+Docker.</li>
+</ol>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> nvidia-docker run -it apache/singa:X.Y.Z-cuda9.0-cudnn7.4.2-ubuntu16.04 /bin/bash</span>
+</code></pre>
+<ol start="3">
+<li>Xem danh sách toàn bộ SINGA Docker images (tags), tại
+<a href="https://hub.docker.com/r/apache/singa/">trang web docker hub</a>. Với mỗi docker
+image, tag được đặt tên theo</li>
+</ol>
+<pre><code class="hljs css language-shell">version-(cpu|gpu)[-devel]
+</code></pre>
+<table>
+<thead>
+<tr><th>Tag</th><th>Mô tả</th><th>Ví dụ giá trị</th></tr>
+</thead>
+<tbody>
+<tr><td><code>phiên bản</code></td><td>phiên bản SINGA</td><td>'2.0.0-rc0', '2.0.0', '1.2.0'</td></tr>
+<tr><td><code>cpu</code></td><td>image không thể sử dụng cho GPUs</td><td>'cpu'</td></tr>
+<tr><td><code>gpu</code></td><td>image có thể sử dụng cho Nvidia GPUs</td><td>'gpu', or 'cudax.x-cudnnx.x' e.g., 'cuda10.0-cudnn7.3'</td></tr>
+<tr><td><code>devel</code></td><td>chỉ số phát triển</td><td>nếu không có, gói SINGA Python package chỉ được cài đặt cho runtime; nếu có, environment cũng được tạo ra, bạn có thể kết cấu lại SINGA từ nguồn tại '/root/singa'</td></tr>
+<tr><td><code>OS</code></td><td>cho biết phiên bản OS</td><td>'ubuntu16.04', 'ubuntu18.04'</td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="từ-nguồn"></a><a href="#từ-nguồn" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p>Bạn có thể <a href="/docs/3.1.0_Viet/build">tạo và cài đặt SINGA</a> từ mã code nguồn sử dụng các công cụ tạo chương trình hoặc conda-build, trên hệ điều hành máy chủ cục bộ (local host os) hay trong Docker container.</p>
+<h2><a class="anchor" aria-hidden="true" id="câu-hỏi-thường-gặp"></a><a href="#câu-hỏi-thường-gặp" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<ul>
+<li><p>Q: Lỗi khi chạy <code>from singa import tensor</code></p>
+<p>A: Kiểm tra chi tiết lỗi từ</p>
+<pre><code class="hljs css language-shell">python -c  "from singa import _singa_wrap"
+<span class="hljs-meta">#</span><span class="bash"> tới thưu mục chứa _singa_wrap.so</span>
+ldd path to _singa_wrap.so
+python
+<span class="hljs-meta">&gt;</span><span class="bash">&gt; import importlib</span>
+<span class="hljs-meta">&gt;</span><span class="bash">&gt; importlib.import_module(<span class="hljs-string">'_singa_wrap'</span>)</span>
+</code></pre>
+<p>Thư mục chứa <code>_singa_wrap.so</code> thường ở
+<code>~/miniconda3/lib/python3.7/site-packages/singa</code>. Thông thường, lỗi này được gây ra bởi sự không tương thích hoặc thiếu các thư viện dependent libraries, v.d cuDNN hay
+protobuf. Cách giải quyết là tạo một virtual environment mới và cài đặt SINGA trong environment đó, v.d,</p>
+<pre><code class="hljs css language-shell">conda create -n singa
+conda activate singa
+conda install -c nusdbsystem -c conda-forge singa-cpu
+</code></pre></li>
+<li><p>Q: Khi sử dụng virtual environment, mỗi khi tôi cài SINGA, numpy cũng tự động bị cài lại. Tuy nhiên, numpy không được sử dụng khi chạy <code>import numpy</code></p>
+<p>A: Lỗi này có thể do biến <code>PYTHONPATH</code> environment lẽ ra phải để trống trong khi bạn sử dụng virtual environment để tránh mâu thuẫn với đường dẫn của virtual environment.</p></li>
+<li><p>Q: Khi chạy SINGA trên Mac OS X, tôi gặp lỗi &quot;Fatal Python error:
+PyThreadState_Get: no current thread Abort trap: 6&quot;</p>
+<p>A: Lỗi này thường xảy ra khi bạn có nhiều phiên bản Python trong hệ thống, v.d, bản của OS và bản được cài bởi Homebrew.
+Bản Python dùng cho SINGA phải giống với bản Python interpreter. Bạn có thể kiểm tra interpreter của mình bằng  <code>which python</code> và kiểm tra bản Python dùng cho SINGA
+qua <code>otool -L &lt;path to _singa_wrap.so&gt;</code>. Vấn đề này được giải quyết nếu
+SINGA được cài qua conda.</p></li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-next button" href="/docs/3.1.0_Viet/software-stack"><span>Software Stack</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sử-dụng-conda">Sử dụng Conda</a></li><li><a href="#sử-dụng-pip">Sử dụng Pip</a></li><li><a href="#sử-dụng-docker">Sử dụng Docker</a></li><li><a href="#từ-nguồn">Từ nguồn</a></li><li><a href="#câu-hỏi-thường-gặp">Câu Hỏi Thườ [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/installation/index.html b/content/docs/3.1.0_Viet/installation/index.html
new file mode 100644
index 0000000..3854d7d
--- /dev/null
+++ b/content/docs/3.1.0_Viet/installation/index.html
@@ -0,0 +1,215 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Cài đặt · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright ownersh [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/installation.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Cài đặt</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor licen [...]
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng-conda"></a><a href="#sử-dụng-conda" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>Conda là gói quản lý chương trình cho Python, CPP và các phần mềm khác.</p>
+<p>Hiện nay SINGA có gói conda packages dùng cho Linux và MacOSX.
+<a href="https://conda.io/miniconda.html">Miniconda3</a> được khuyến khích dùng với SINGA.
+Sau khi cài đặt miniconda, thực hiện các lệnh sau để cài đặt
+SINGA.</p>
+<ol>
+<li>Cho CPU
+<a href="https://colab.research.google.com/drive/1Ntkhi-Z6XTR8WYPXiLwujHd2dOm0772V?usp=sharing"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Mở trên Colab"></a></li>
+</ol>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> conda install -c nusdbsystem -c conda-forge singa-cpu</span>
+</code></pre>
+<ol start="2">
+<li>GPU với CUDA và cuDNN (yêu cầu CUDA driver &gt;=384.81)
+<a href="https://colab.research.google.com/drive/1do_TLJe18IthLOnBOsHCEe-FFPGk1sPJ?usp=sharing"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Mở trên Colab"></a></li>
+</ol>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> conda install -c nusdbsystem -c conda-forge singa-gpu</span>
+</code></pre>
+<ol start="3">
+<li>Cài đặt SINGA với phiên bản cụ thể. Câu lệnh sau cho danh sách tất cả gói chương trình SINGA đang hoạt động.</li>
+</ol>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> conda search -c nusdbsystem singa</span>
+
+Loading channels: done
+<span class="hljs-meta">#</span><span class="bash"> Name                       Version           Build  Channel</span>
+singa                      3.1.0.rc2        cpu_py36  nusdbsystem
+singa                      3.1.0.rc2 cudnn7.6.5_cuda10.2_py36  nusdbsystem
+singa                      3.1.0.rc2 cudnn7.6.5_cuda10.2_py37  nusdbsystem
+</code></pre>
+<!--- > Lưu ý rằng việc sử dụng nightly built images không được khuyến khích ngoại trừ trong quá trình phát triển và kiểm định. Khuyến khích việc sử dụng phiên bản phát hành ổn định. -->
+<p>Dùng câu lệnh sau để cài đặt một phiên bản SINGA cụ thể,</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> conda install -c nusdbsystem -c conda-forge singa=X.Y.Z=cpu_py36</span>
+</code></pre>
+<p>Nếu không có lỗi khi chạy</p>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> python -c <span class="hljs-string">"from singa import tensor"</span></span>
+</code></pre>
+<p>thì bạn đã cài đặt SINGA thành công.</p>
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng-pip"></a><a href="#sử-dụng-pip" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
+<ol>
+<li>Cho CPU
+<a href="https://colab.research.google.com/drive/17RA056Brwk0vBQTFaZ-l9EbqwADO0NA9?usp=sharing"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Mở trên Colab"></a></li>
+</ol>
+<pre><code class="hljs css language-bash">pip install singa -f http://singa.apache.org/docs/next/wheel-cpu.html --trusted-host singa.apache.org
+</code></pre>
+<p>Bạn có thể cài đặt một phiên bản SINGA cụ thể sử dụng <code>singa==&lt;version&gt;</code>, thay thông tin
+<code>&lt;version&gt;</code>, v.d, <code>3.1.0</code>. Xem danh sách các phiên bản SINGA đang hoạt động ở đường dẫn.</p>
+<p>Để cài đặt phiên bản phát triển mới nhất, thay đường dẫn bằng
+<a href="http://singa.apache.org/docs/next/wheel-cpu-dev.html">http://singa.apache.org/docs/next/wheel-cpu-dev.html</a></p>
+<ol start="2">
+<li>GPU với CUDA và cuDNN
+<a href="https://colab.research.google.com/drive/1W30IPCqj5fG8ADAQsFqclaCLyIclVcJL?usp=sharing"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Mở trên Colab"></a></li>
+</ol>
+<pre><code class="hljs css language-bash">pip install singa -f http://singa.apache.org/docs/next/wheel-gpu.html --trusted-host singa.apache.org
+</code></pre>
+<p>Bạn có thể thiết lập phiên bản SINGA và CUDA, như
+<code>singa==3.1.0+cuda10.2</code>. Danh sách tổ hợp phiên bản SINGA với CUDA được cung cấp trong đường dẫn.</p>
+<p>Để cài đặt phiên bản phát triển mới nhất, thay đường dẫn bằng
+<a href="http://singa.apache.org/docs/next/wheel-gpu-dev.html">http://singa.apache.org/docs/next/wheel-gpu-dev.html</a></p>
+<p>Lưu ý: phiên bản Python của Python environment trong máy của bạn sẽ được sử dụng để tìm gói wheel tương ứng. Ví dụ, nếu bạn sử dụng Python 3.6, thì gói wheel kết cấu trong Python 3.6 sẽ được pip chọn để cài đặt.
+Thực tế, tên của tệp tin wheel bao gồm phiên bản SINGA, phiên bản CUDA và Python. Vì thế, <code>pip</code> biết tệp tin wheel nào để tải và cài đặt.</p>
+<p>Tham khảo chú thích ở phần đầu của tệp tin <code>setup.py</code> về cách tạo các gói
+wheel packages.</p>
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng-docker"></a><a href="#sử-dụng-docker" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>Cài đặt Docker vào máy chủ local theo
+<a href="https://docs.docker.com/install/">hướng dẫn</a>. Thêm người dùng vào
+<a href="https://docs.docker.com/install/linux/linux-postinstall/">nhóm docker</a> để chạy câu lệnh docker mà không cần dùng <code>sudo</code>.</p>
+<ol>
+<li>Cho CPU.</li>
+</ol>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> docker run -it apache/singa:X.Y.Z-cpu-ubuntu16.04 /bin/bash</span>
+</code></pre>
+<ol start="2">
+<li>Với GPU. Cài đặt
+<a href="https://github.com/NVIDIA/nvidia-docker">Nvidia-Docker</a> sau khi cài
+Docker.</li>
+</ol>
+<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> nvidia-docker run -it apache/singa:X.Y.Z-cuda9.0-cudnn7.4.2-ubuntu16.04 /bin/bash</span>
+</code></pre>
+<ol start="3">
+<li>Xem danh sách toàn bộ SINGA Docker images (tags), tại
+<a href="https://hub.docker.com/r/apache/singa/">trang web docker hub</a>. Với mỗi docker
+image, tag được đặt tên theo</li>
+</ol>
+<pre><code class="hljs css language-shell">version-(cpu|gpu)[-devel]
+</code></pre>
+<table>
+<thead>
+<tr><th>Tag</th><th>Mô tả</th><th>Ví dụ giá trị</th></tr>
+</thead>
+<tbody>
+<tr><td><code>phiên bản</code></td><td>phiên bản SINGA</td><td>'2.0.0-rc0', '2.0.0', '1.2.0'</td></tr>
+<tr><td><code>cpu</code></td><td>image không thể sử dụng cho GPUs</td><td>'cpu'</td></tr>
+<tr><td><code>gpu</code></td><td>image có thể sử dụng cho Nvidia GPUs</td><td>'gpu', or 'cudax.x-cudnnx.x' e.g., 'cuda10.0-cudnn7.3'</td></tr>
+<tr><td><code>devel</code></td><td>chỉ số phát triển</td><td>nếu không có, gói SINGA Python package chỉ được cài đặt cho runtime; nếu có, environment cũng được tạo ra, bạn có thể kết cấu lại SINGA từ nguồn tại '/root/singa'</td></tr>
+<tr><td><code>OS</code></td><td>cho biết phiên bản OS</td><td>'ubuntu16.04', 'ubuntu18.04'</td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="từ-nguồn"></a><a href="#từ-nguồn" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p>Bạn có thể <a href="/docs/3.1.0_Viet/build">tạo và cài đặt SINGA</a> từ mã code nguồn sử dụng các công cụ tạo chương trình hoặc conda-build, trên hệ điều hành máy chủ cục bộ (local host os) hay trong Docker container.</p>
+<h2><a class="anchor" aria-hidden="true" id="câu-hỏi-thường-gặp"></a><a href="#câu-hỏi-thường-gặp" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<ul>
+<li><p>Q: Lỗi khi chạy <code>from singa import tensor</code></p>
+<p>A: Kiểm tra chi tiết lỗi từ</p>
+<pre><code class="hljs css language-shell">python -c  "from singa import _singa_wrap"
+<span class="hljs-meta">#</span><span class="bash"> tới thưu mục chứa _singa_wrap.so</span>
+ldd path to _singa_wrap.so
+python
+<span class="hljs-meta">&gt;</span><span class="bash">&gt; import importlib</span>
+<span class="hljs-meta">&gt;</span><span class="bash">&gt; importlib.import_module(<span class="hljs-string">'_singa_wrap'</span>)</span>
+</code></pre>
+<p>Thư mục chứa <code>_singa_wrap.so</code> thường ở
+<code>~/miniconda3/lib/python3.7/site-packages/singa</code>. Thông thường, lỗi này được gây ra bởi sự không tương thích hoặc thiếu các thư viện dependent libraries, v.d cuDNN hay
+protobuf. Cách giải quyết là tạo một virtual environment mới và cài đặt SINGA trong environment đó, v.d,</p>
+<pre><code class="hljs css language-shell">conda create -n singa
+conda activate singa
+conda install -c nusdbsystem -c conda-forge singa-cpu
+</code></pre></li>
+<li><p>Q: Khi sử dụng virtual environment, mỗi khi tôi cài SINGA, numpy cũng tự động bị cài lại. Tuy nhiên, numpy không được sử dụng khi chạy <code>import numpy</code></p>
+<p>A: Lỗi này có thể do biến <code>PYTHONPATH</code> environment lẽ ra phải để trống trong khi bạn sử dụng virtual environment để tránh mâu thuẫn với đường dẫn của virtual environment.</p></li>
+<li><p>Q: Khi chạy SINGA trên Mac OS X, tôi gặp lỗi &quot;Fatal Python error:
+PyThreadState_Get: no current thread Abort trap: 6&quot;</p>
+<p>A: Lỗi này thường xảy ra khi bạn có nhiều phiên bản Python trong hệ thống, v.d, bản của OS và bản được cài bởi Homebrew.
+Bản Python dùng cho SINGA phải giống với bản Python interpreter. Bạn có thể kiểm tra interpreter của mình bằng  <code>which python</code> và kiểm tra bản Python dùng cho SINGA
+qua <code>otool -L &lt;path to _singa_wrap.so&gt;</code>. Vấn đề này được giải quyết nếu
+SINGA được cài qua conda.</p></li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-next button" href="/docs/3.1.0_Viet/software-stack"><span>Software Stack</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sử-dụng-conda">Sử dụng Conda</a></li><li><a href="#sử-dụng-pip">Sử dụng Pip</a></li><li><a href="#sử-dụng-docker">Sử dụng Docker</a></li><li><a href="#từ-nguồn">Từ nguồn</a></li><li><a href="#câu-hỏi-thường-gặp">Câu Hỏi Thườ [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/issue-tracking.html b/content/docs/3.1.0_Viet/issue-tracking.html
new file mode 100644
index 0000000..ef9c473
--- /dev/null
+++ b/content/docs/3.1.0_Viet/issue-tracking.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Theo Dõi Vấn Đề · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/issue-tracking.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Theo Dõi Vấn Đề</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contrib [...]
+<p>SINGA sử dụng <a href="https://issues.apache.org/jira/browse/singa">JIRA</a> để quản lý các vấn đề bao gồm lỗi
+(bugs), các tính năng mới và thảo luận.</p>
+<p>Chúng tôi đang trong quá trình chuyển sang mục <a href="https://github.com/apache/singa/issues">Github Issues</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/mail-lists"><span class="arrow-prev">← </span><span>Project Mailing Lists</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/security"><span>Security</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/singa-logo-square.pn [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/issue-tracking/index.html b/content/docs/3.1.0_Viet/issue-tracking/index.html
new file mode 100644
index 0000000..ef9c473
--- /dev/null
+++ b/content/docs/3.1.0_Viet/issue-tracking/index.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Theo Dõi Vấn Đề · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/issue-tracking.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Theo Dõi Vấn Đề</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contrib [...]
+<p>SINGA sử dụng <a href="https://issues.apache.org/jira/browse/singa">JIRA</a> để quản lý các vấn đề bao gồm lỗi
+(bugs), các tính năng mới và thảo luận.</p>
+<p>Chúng tôi đang trong quá trình chuyển sang mục <a href="https://github.com/apache/singa/issues">Github Issues</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/mail-lists"><span class="arrow-prev">← </span><span>Project Mailing Lists</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/security"><span>Security</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/singa-logo-square.pn [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/mail-lists.html b/content/docs/3.1.0_Viet/mail-lists.html
new file mode 100644
index 0000000..bba5948
--- /dev/null
+++ b/content/docs/3.1.0_Viet/mail-lists.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Danh sách liên hệ của Dự Án · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regardi [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/mail-lists.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Danh sách liên hệ của Dự Án</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more [...]
+<p>Có một danh sách liên hệ được thiết lập cho dự án này. Mỗi danh sách bao gồm đường dẫn để đăng kí(subscribe), huỷ đăng kí (unsubscribe), và đường dẫn tới kho lưu trữ.</p>
+<table>
+<thead>
+<tr><th>Tên</th><th>Loại</th><th>Đăng kí</th><th>Huỷ Đăng kí</th><th>Lưu Trữ</th></tr>
+</thead>
+<tbody>
+<tr><td>Phát triển</td><td><a href="mailto:dev@singa.incubator.apache.org">dev@singa.incubator.apache.org</a></td><td><a href="mailto:dev-subscribe@singa.incubator.apache.org">Đăng kí</a></td><td><a href="mailto:dev-unsubscribe@singa.incubator.apache.org.">Huỷ đăng kí</a></td><td><a href="http://mail-archives.apache.org/mod_mbox/singa-dev/">mail-archives.apache.org</a></td></tr>
+<tr><td>Đóng góp</td><td><a href="mailto:commits@singa.incubator.apache.org">commits@singa.incubator.apache.org</a></td><td><a href="mailto:commits-subscribe@singa.incubator.apache.org">Đăng kí</a></td><td><a href="mailto:commits-unsubscribe@singa.incubator.apache.org">Huỷ đăng kí</a></td><td><a href="http://mail-archives.apache.org/mod_mbox/singa-commits/">mail-archives.apache.org</a></td></tr>
+<tr><td>Bảo mật</td><td><a href="mailto:security@singa.apache.org">security@singa.apache.org</a></td><td>private</td><td>private</td><td>private</td></tr>
+</tbody>
+</table>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/source-repository"><span class="arrow-prev">← </span><span>Source Repository</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/issue-tracking"><span>Issue Tracking</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/singa [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/mail-lists/index.html b/content/docs/3.1.0_Viet/mail-lists/index.html
new file mode 100644
index 0000000..bba5948
--- /dev/null
+++ b/content/docs/3.1.0_Viet/mail-lists/index.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Danh sách liên hệ của Dự Án · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regardi [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/mail-lists.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Danh sách liên hệ của Dự Án</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more [...]
+<p>Có một danh sách liên hệ được thiết lập cho dự án này. Mỗi danh sách bao gồm đường dẫn để đăng kí(subscribe), huỷ đăng kí (unsubscribe), và đường dẫn tới kho lưu trữ.</p>
+<table>
+<thead>
+<tr><th>Tên</th><th>Loại</th><th>Đăng kí</th><th>Huỷ Đăng kí</th><th>Lưu Trữ</th></tr>
+</thead>
+<tbody>
+<tr><td>Phát triển</td><td><a href="mailto:dev@singa.incubator.apache.org">dev@singa.incubator.apache.org</a></td><td><a href="mailto:dev-subscribe@singa.incubator.apache.org">Đăng kí</a></td><td><a href="mailto:dev-unsubscribe@singa.incubator.apache.org.">Huỷ đăng kí</a></td><td><a href="http://mail-archives.apache.org/mod_mbox/singa-dev/">mail-archives.apache.org</a></td></tr>
+<tr><td>Đóng góp</td><td><a href="mailto:commits@singa.incubator.apache.org">commits@singa.incubator.apache.org</a></td><td><a href="mailto:commits-subscribe@singa.incubator.apache.org">Đăng kí</a></td><td><a href="mailto:commits-unsubscribe@singa.incubator.apache.org">Huỷ đăng kí</a></td><td><a href="http://mail-archives.apache.org/mod_mbox/singa-commits/">mail-archives.apache.org</a></td></tr>
+<tr><td>Bảo mật</td><td><a href="mailto:security@singa.apache.org">security@singa.apache.org</a></td><td>private</td><td>private</td><td>private</td></tr>
+</tbody>
+</table>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/source-repository"><span class="arrow-prev">← </span><span>Source Repository</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/issue-tracking"><span>Issue Tracking</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/singa [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/onnx.html b/content/docs/3.1.0_Viet/onnx.html
new file mode 100644
index 0000000..d85e03b
--- /dev/null
+++ b/content/docs/3.1.0_Viet/onnx.html
@@ -0,0 +1,418 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>ONNX · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright ownership. [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/onnx.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">ONNX</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreemen [...]
+<p><a href="https://onnx.ai/">ONNX</a> là một định dạng đại diện mở dùng trong các model của machine learning, cho phép nhà phát triển AI sử dụng các models trên các libraries và công cụ khác nhau. SINGA hỗ trợ tải các models dạng ONNX trong training và inference, và lưu các models ở dạng ONNX với SINGA APIs (e.g., <a href="./module">Module</a>).</p>
+<p>SINGA đã được thử nghiệm với
+<a href="https://github.com/onnx/onnx/blob/master/docs/Versioning.md">phiên bản sau</a> của ONNX.</p>
+<table>
+<thead>
+<tr><th>Phiên bản ONNX</th><th>Phiên bản định dạng tệp tin</th><th>Opset phiên bản ai.onnx</th><th>Opset phiên bản ai.onnx.ml</th><th>Opset phiên bản ai.onnx.training</th></tr>
+</thead>
+<tbody>
+<tr><td>1.6.0</td><td>6</td><td>11</td><td>2</td><td>-</td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng-chung"></a><a href="#sử-dụng-chung" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<h3><a class="anchor" aria-hidden="true" id="tải-một-onnx-model-trong-singa"></a><a href="#tải-một-onnx-model-trong-singa" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
+<p>Sau khi tải một ONNX model từ disk qua <code>onnx.load</code>, bạn chỉ cần cập nhật batch-size của input sử dụng <code>tensor.PlaceHolder</code> sau SINGA v3.0, shape của internal tensors sẽ tự động được tạo ra.</p>
+<p>Sau đó, bạn định nghĩa một class thừa hưởng từ <code>sonnx.SONNXModel</code> và thực hiện hai phương pháp <code>forward</code> cho quá trình forward và <code>train_one_batch</code> cho quá trình training.
+Sau khi gọi hàm <code>model.compile</code>, hàm SONNX sẽ lặp lại và dịch tất cả các nodes trong phạm vi graph của ONNX model sang các hàm SINGA, tải tất cả weights đã lưu trữ và tạo ra shape của từng tensor trung gian.</p>
+<pre><code class="hljs css language-python3"><span class="hljs-keyword">import</span> onnx
+<span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> device
+<span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> sonnx
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyModel</span><span class="hljs-params">(sonnx.SONNXModel)</span>:</span>
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, onnx_model)</span>:</span>
+        super(MyModel, self).__init__(onnx_model)
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(self, *x)</span>:</span>
+        y = super(MyModel, self).forward(*x)
+        <span class="hljs-comment"># Since SINGA model returns the output as a list,</span>
+        <span class="hljs-comment"># if there is only one output,</span>
+        <span class="hljs-comment"># you just need to take the first element.</span>
+        <span class="hljs-keyword">return</span> y[<span class="hljs-number">0</span>]
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">train_one_batch</span><span class="hljs-params">(self, x, y)</span>:</span>
+        <span class="hljs-keyword">pass</span>
+
+model_path = <span class="hljs-string">"PATH/To/ONNX/MODEL"</span>
+onnx_model = onnx.load(model_path)
+
+<span class="hljs-comment"># convert onnx model into SINGA model</span>
+dev = device.create_cuda_gpu()
+x = tensor.PlaceHolder(INPUT.shape, device=dev)
+model = MyModel(onnx_model)
+model.compile([x], is_train=<span class="hljs-literal">False</span>, use_graph=<span class="hljs-literal">True</span>, sequential=<span class="hljs-literal">True</span>)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="inference-với-singa-model"></a><a href="#inference-với-singa-model" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<p>Sau khi tạo models, bạn có thể tiến hành inference bằng cách gọi hàm <code>model.forward</code>. Đầu vào và đầu ra phải ở dạng phiên bản của SINGA <code>Tensor</code>.</p>
+<pre><code class="hljs css language-python3"><span class="hljs-attr">x</span> = tensor.Tensor(device=dev, data=INPUT)
+<span class="hljs-attr">y</span> = model.forward(x)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="lưu-model-của-singa-dưới-dạng-onnx"></a><a href="#lưu-model-của-singa-dưới-dạng-onnx" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
+<p>Với hàm tensors đầu vào và đầu ra được tạo ra bởi các hàm của model, bạn có thể truy nguyên đến tất cả các hàm nội bộ. Bởi vậy, một model SINGA được xác định bởi tensors đầu vào và đầu ra. Để biến một model SINGA sang dạng ONNX, bạn chỉ cần cung cấp danh sách tensor đầu vào và đầu ra.</p>
+<pre><code class="hljs css language-python3"># <span class="hljs-symbol">x</span> is the input tensor, <span class="hljs-symbol">y</span> is the output tensor
+sonnx.to_onnx([<span class="hljs-symbol">x</span>], [<span class="hljs-symbol">y</span>])
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="training-lại-với-model-onnx"></a><a href="#training-lại-với-model-onnx" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>Để train (hay luyện) một model ONNX sử dụng SINGA, bạn cần thực hiện
+<code>train_one_batch</code> từ <code>sonnx.SONNXModel</code> và đánh dấu <code>is_train=True</code> khi gọi hàm <code>model.compile</code>.</p>
+<pre><code class="hljs css language-python3">from singa import opt
+from singa import autograd
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyModel</span>(<span class="hljs-title">sonnx</span>.<span class="hljs-title">SONNXModel</span>):</span>
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, onnx_model)</span></span>:
+        <span class="hljs-keyword">super</span>(MyModel, <span class="hljs-keyword">self</span>).__init_<span class="hljs-number">_</span>(onnx_model)
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, *x)</span></span>:
+        y = <span class="hljs-keyword">super</span>(MyModel, <span class="hljs-keyword">self</span>).forward(*x)
+        <span class="hljs-keyword">return</span> y[<span class="hljs-number">0</span>]
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">train_one_batch</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, x, y, dist_option, spars)</span></span>:
+        out = <span class="hljs-keyword">self</span>.forward(x)
+        loss = autograd.softmax_cross_entropy(out, y)
+        <span class="hljs-keyword">if</span> dist_option == <span class="hljs-string">'fp32'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_update(loss)
+        elif dist_option == <span class="hljs-string">'fp16'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_update_half(loss)
+        elif dist_option == <span class="hljs-string">'partialUpdate'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_partial_update(loss)
+        elif dist_option == <span class="hljs-string">'sparseTopK'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_sparse_update(loss,
+                                                      topK=True,
+                                                      spars=spars)
+        elif dist_option == <span class="hljs-string">'sparseThreshold'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_sparse_update(loss,
+                                                      topK=False,
+                                                      spars=spars)
+        <span class="hljs-keyword">return</span> out, loss
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_optimizer</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, optimizer)</span></span>:
+        <span class="hljs-keyword">self</span>.optimizer = optimizer
+
+sgd = opt.SGD(lr=<span class="hljs-number">0</span>.<span class="hljs-number">005</span>, momentum=<span class="hljs-number">0</span>.<span class="hljs-number">9</span>, weight_decay=<span class="hljs-number">1</span>e-<span class="hljs-number">5</span>)
+model.set_optimizer(sgd)
+model.compile([tx], is_train=True, use_graph=graph, sequential=True)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="transfer-learning-một-model-onnx"></a><a href="#transfer-learning-một-model-onnx" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
+<p>Bạn cũng có thể thêm một vài layers vào phần cuối của ONNX model để làm
+transfer-learning. Hàm <code>last_layers</code> chấp nhận một số nguyên âm để chỉ layer bị cắt ra. Ví dụ, <code>-1</code> nghĩa là bị cắt ra sau kết quả cuối cùng (không xoá bớt layer nào) <code>-2</code> nghĩa là bị cắt ra sau hai layer cuối cùng.</p>
+<pre><code class="hljs css language-python3">from singa import opt
+from singa import autograd
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyModel</span>(<span class="hljs-title">sonnx</span>.<span class="hljs-title">SONNXModel</span>):</span>
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, onnx_model)</span></span>:
+        <span class="hljs-keyword">super</span>(MyModel, <span class="hljs-keyword">self</span>).__init_<span class="hljs-number">_</span>(onnx_model)
+        <span class="hljs-keyword">self</span>.linear = layer.Linear(<span class="hljs-number">1000</span>, <span class="hljs-number">3</span>)
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, *x)</span></span>:
+        <span class="hljs-comment"># cut off after the last third layer</span>
+        <span class="hljs-comment"># and append a linear layer</span>
+        y = <span class="hljs-keyword">super</span>(MyModel, <span class="hljs-keyword">self</span>).forward(*x, last_layers=-<span class="hljs-number">3</span>)[<span class="hljs-number">0</span>]
+        y = <span class="hljs-keyword">self</span>.linear(y)
+        <span class="hljs-keyword">return</span> y
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">train_one_batch</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, x, y, dist_option, spars)</span></span>:
+        out = <span class="hljs-keyword">self</span>.forward(x)
+        loss = autograd.softmax_cross_entropy(out, y)
+        <span class="hljs-keyword">if</span> dist_option == <span class="hljs-string">'fp32'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_update(loss)
+        elif dist_option == <span class="hljs-string">'fp16'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_update_half(loss)
+        elif dist_option == <span class="hljs-string">'partialUpdate'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_partial_update(loss)
+        elif dist_option == <span class="hljs-string">'sparseTopK'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_sparse_update(loss,
+                                                      topK=True,
+                                                      spars=spars)
+        elif dist_option == <span class="hljs-string">'sparseThreshold'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_sparse_update(loss,
+                                                      topK=False,
+                                                      spars=spars)
+        <span class="hljs-keyword">return</span> out, loss
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_optimizer</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, optimizer)</span></span>:
+        <span class="hljs-keyword">self</span>.optimizer = optimizer
+
+sgd = opt.SGD(lr=<span class="hljs-number">0</span>.<span class="hljs-number">005</span>, momentum=<span class="hljs-number">0</span>.<span class="hljs-number">9</span>, weight_decay=<span class="hljs-number">1</span>e-<span class="hljs-number">5</span>)
+model.set_optimizer(sgd)
+model.compile([tx], is_train=True, use_graph=graph, sequential=True)
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="onnx-model-zoo"></a><a href="#onnx-model-zoo" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p><a href="https://github.com/onnx/models">ONNX Model Zoo</a> là tổ hợp các models ở dạng ONNX, đã được train có kết quả tốt nhất, đóng góp bởi cộng đồng thành viên. SINGA giờ đây đã hỗ trợ một số models CV và NLP. Chúng tôi dự định sẽ sớm hỗ trợ thêm các models khác.</p>
+<h3><a class="anchor" aria-hidden="true" id="phân-loại-hình-ảnh-image-classification"></a><a href="#phân-loại-hình-ảnh-image-classification" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2  [...]
+<p>Tổ hợp models này có đầu vào là hình ảnh, sau đó phân loại các đối tượng chính trong hình ảnh thành 1000 mục đối tượng như bàn phím, chuột, bút chì, và các động vật.</p>
+<table>
+<thead>
+<tr><th>Model Class</th><th>Tham khảo</th><th>Mô tả</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/vision/classification/mobilenet">MobileNet</a></b></td><td><a href="https://arxiv.org/abs/1801.04381">Sandler et al.</a></td><td>deep neural network nhỏ, nhẹ phù hợp nhất cho điện thoại và ứng dụng hình ảnh đính kèm. <br>Top-5 error từ báo cáo - ~10%</td><td><a href="https://colab.research.google.com/drive/1HsixqJMIpKyEPhkbB8jy7NwNEFEAUWAf"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Mở trên Colab [...]
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/vision/classification/resnet">ResNet18</a></b></td><td><a href="https://arxiv.org/abs/1512.03385">He et al.</a></td><td>Mô hình CNN (lên tới 152 layers). Sử dụng liên kết ngắn gọn để đạt độ chính xác cao hơn khi phân loại hình ảnh. <br> Top-5 error từ báo cáo - ~3.6%</td><td><a href="https://colab.research.google.com/drive/1u1RYefSsVbiP4I-5wiBKHjsT9L0FxLm9"><img src="https://colab.research.google.com/assets/colab-badge.svg" a [...]
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/vision/classification/vgg">VGG16</a></b></td><td><a href="https://arxiv.org/abs/1409.1556">Simonyan et al.</a></td><td>Mô hình CNN chuyên sâu (lên tới 19 layers). Tương tự như AlexNet nhưng sử dụng nhiều loại filters cỡ kernel nhỏ hơn mang lại độ chính xác cao hơn khi phân loại hình ảnh. <br>Top-5 từ báo cáo - ~8%</td><td><a href="https://colab.research.google.com/drive/14kxgRKtbjPCKKsDJVNi3AvTev81Gp_Ds"><img src="https://col [...]
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/vision/classification/shufflenet">ShuffleNet_V2</a></b></td><td><a href="https://arxiv.org/pdf/1707.01083.pdf">Simonyan et al.</a></td><td>Mô hình CNN cực kỳ hiệu quả trong sử dụng tài nguyên, được thiết kế đặc biệt cho các thiết bị di động. Mạng lưới thiết kế hệ mô hình sử dụng số liệu trực tiếp như tốc độ, thay vì các số liệu gián tiếp như FLOP. Top-1 error từ báo cáo - ~30.6%</td><td>[<img src="https://colab.research.googl [...]
+</tbody>
+</table>
+<p>Chúng tôi cung cấp ví dụ re-training sử dụng VGG và ResNet, vui lòng xem tại
+<code>examples/onnx/training</code>.</p>
+<h3><a class="anchor" aria-hidden="true" id="nhận-diện-đối-tượng-object-detection"></a><a href="#nhận-diện-đối-tượng-object-detection" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 [...]
+<p>Các models Object detection nhận diện sự hiện diện của các đối tượng trong một hình ảnh và phân đoạn ra các khu vực của bức ảnh mà đối tượng được nhận diện.</p>
+<table>
+<thead>
+<tr><th>Model Class</th><th>Tham khảo</th><th>Mô tả</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/vision/object_detection_segmentation/tiny_yolov2">Tiny YOLOv2</a></b></td><td><a href="https://arxiv.org/pdf/1612.08242.pdf">Redmon et al.</a></td><td>Mô hình CNN thời gian thực cho Nhận diện đối tượng có thể nhận diện 20 loại đối tượng khác nhau. Phiên bản nhỏ của mô hình phức tạp Yolov2.</td><td><a href="https://colab.research.google.com/drive/11V4I6cRjIJNUv5ZGsEGwqHuoQEie6b1T"><img src="https://colab.research.google.com/as [...]
+</tbody>
+</table>
+<h3><a class="anchor" aria-hidden="true" id="phân-tích-khuôn-mặt-face-analysis"></a><a href="#phân-tích-khuôn-mặt-face-analysis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S1 [...]
+<p>Các mô hình Nhận Diện Khuôn Mặt xác định và/hoặc nhận diện khuôn mặt người và các trạng thái cảm xúc trong bức ảnh.</p>
+<table>
+<thead>
+<tr><th>Model Class</th><th>Tham khảo</th><th>Mô tả</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/vision/body_analysis/arcface">ArcFace</a></b></td><td><a href="https://arxiv.org/abs/1801.07698">Deng et al.</a></td><td>Mô hình dựa trên CNN để nhận diện khuôn mặt, học từ các đặc tính khác nhau trên khuôn mặt và tạo ra các embeddings cho hình ảnh khuôn mặt đầu vào.</td><td><a href="https://colab.research.google.com/drive/1qanaqUKGIDtifdzEzJOHjEj4kYzA9uJC"><img src="https://colab.research.google.com/assets/colab-badge.svg" a [...]
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/vision/body_analysis/emotion_ferplus">Emotion FerPlus</a></b></td><td><a href="https://arxiv.org/abs/1608.01041">Barsoum et al.</a></td><td>Mô hình CNN chuyên sâu nhận diện cảm xúc được train trên các hình ảnh khuôn mặt.</td><td><a href="https://colab.research.google.com/drive/1XHtBQGRhe58PDi4LGYJzYueWBeWbO23r"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"></a></td></tr>
+</tbody>
+</table>
+<h3><a class="anchor" aria-hidden="true" id="máy-hiểu-machine-comprehension"></a><a href="#máy-hiểu-machine-comprehension" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
+<p>Một dạng của mô hình xử lý ngôn ngữ tự nhiên giúp trả lời câu hỏi trên một đoạn ngôn ngữ cung cấp.</p>
+<table>
+<thead>
+<tr><th>Model Class</th><th>Tham khảo</th><th>Mô tả</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/text/machine_comprehension/bert-squad">BERT-Squad</a></b></td><td><a href="https://arxiv.org/pdf/1810.04805.pdf">Devlin et al.</a></td><td>Mô hình này trả lời câu hỏi dựa trên ngữ cảnh của đoạn văn đầu vào.</td><td><a href="https://colab.research.google.com/drive/1kud-lUPjS_u-TkDAzihBTw0Vqr0FjCE-"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Mở trên Colab"></a></td></tr>
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/text/machine_comprehension/roberta">RoBERTa</a></b></td><td><a href="https://arxiv.org/pdf/1907.11692.pdf">Devlin et al.</a></td><td>Mô hình transformer-based kích thước lớn, dự đoán ngữ nghĩa dựa trên đoạn văn đầu vào.</td><td><a href="https://colab.research.google.com/drive/1F-c4LJSx3Cb2jW6tP7f8nAZDigyLH6iN?usp=sharing"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Mở trên Colab"></a></td></tr>
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/text/machine_comprehension/gpt-2">GPT-2</a></b></td><td><a href="https://d4mucfpksywv.cloudfront.net/better-language-models/language_models_are_unsupervised_multitask_learners.pdf">Devlin et al.</a></td><td>Mô hình ngôn ngữ transformer-based kích thước lớn, đưa ra một đoạn chữ, rồi dự đoán từ tiếp theo.</td><td>[<img src="https://colab.research.google.com/drive/1ZlXLSIMppPch6HgzKRillJiUcWn3PiK7?usp=sharing" alt="Mở trên Colab [...]
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="các-toán-tử-operators-được-hỗ-trợ"></a><a href="#các-toán-tử-operators-được-hỗ-trợ" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S1 [...]
+<p>Chúng tôi hỗ trợ các toán tử sau:</p>
+<ul>
+<li>Acos</li>
+<li>Acosh</li>
+<li>Add</li>
+<li>And</li>
+<li>Asin</li>
+<li>Asinh</li>
+<li>Atan</li>
+<li>Atanh</li>
+<li>AveragePool</li>
+<li>BatchNormalization</li>
+<li>Cast</li>
+<li>Ceil</li>
+<li>Clip</li>
+<li>Concat</li>
+<li>ConstantOfShape</li>
+<li>Conv</li>
+<li>Cos</li>
+<li>Cosh</li>
+<li>Div</li>
+<li>Dropout</li>
+<li>Elu</li>
+<li>Equal</li>
+<li>Erf</li>
+<li>Expand</li>
+<li>Flatten</li>
+<li>Gather</li>
+<li>Gemm</li>
+<li>GlobalAveragePool</li>
+<li>Greater</li>
+<li>HardSigmoid</li>
+<li>Identity</li>
+<li>LeakyRelu</li>
+<li>Less</li>
+<li>Log</li>
+<li>MatMul</li>
+<li>Max</li>
+<li>MaxPool</li>
+<li>Mean</li>
+<li>Min</li>
+<li>Mul</li>
+<li>Neg</li>
+<li>NonZero</li>
+<li>Not</li>
+<li>OneHot</li>
+<li>Or</li>
+<li>Pad</li>
+<li>Pow</li>
+<li>PRelu</li>
+<li>Reciprocal</li>
+<li>ReduceMean</li>
+<li>ReduceSum</li>
+<li>Relu</li>
+<li>Reshape</li>
+<li>ScatterElements</li>
+<li>Selu</li>
+<li>Shape</li>
+<li>Sigmoid</li>
+<li>Sign</li>
+<li>Sin</li>
+<li>Sinh</li>
+<li>Slice</li>
+<li>Softmax</li>
+<li>Softplus</li>
+<li>Softsign</li>
+<li>Split</li>
+<li>Sqrt</li>
+<li>Squeeze</li>
+<li>Sub</li>
+<li>Sum</li>
+<li>Tan</li>
+<li>Tanh</li>
+<li>Tile</li>
+<li>Transpose</li>
+<li>Unsqueeze</li>
+<li>Upsample</li>
+<li>Where</li>
+<li>Xor</li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="các-lưu-ý-đặc-biệt-cho-onnx-backend"></a><a href="#các-lưu-ý-đặc-biệt-cho-onnx-backend" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2 [...]
+<ul>
+<li><p>Conv, MaxPool và AveragePool</p>
+<p>Đầu vào phải có shape 1d<code>(N*C*H)</code> và 2d(<code>N*C*H*W</code>) trong khi <code>dilation</code> phải là 1.</p></li>
+<li><p>BatchNormalization</p>
+<p><code>epsilon</code> là 1e-05 và không được đổi.</p></li>
+<li><p>Cast</p>
+<p>Chỉ hỗ trợ float32 và int32, các dạng khác phải được cast thành hai dạng này.</p></li>
+<li><p>Squeeze và Unsqueeze</p>
+<p>Nếu gặp lỗi khi dùng <code>Squeeze</code> hay <code>Unsqueeze</code> giữa <code>Tensor</code> và
+Scalar, vui lòng báo cho chúng tôi.</p></li>
+<li><p>Empty tensor Empty tensor không được chấp nhận trong SINGA.</p></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="thực-hiện"></a><a href="#thực-hiện" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
+<p>Mã code của SINGA ONNX được đặt trong <code>python/singa/soonx.py</code>. Có bốn loại chính, <code>SingaFrontend</code>, <code>SingaBackend</code>, <code>SingaRep</code> và <code>SONNXModel</code>.
+<code>SingaFrontend</code> qui đổi mô hình SINGA model sang mô hình ONNX model; <code>SingaBackend</code> biến mô hình ONNX model sang đối tượng <code>SingaRep</code> giúp lưu trữ tất cả các toán tử SINGA operators và
+tensors(tensor trong văn bản này nghĩa là SINGA <code>Tensor</code>); <code>SingaRep</code> có thẻ chạy giống như mô hình SINGA model. <code>SONNXModel</code> tạo ra từ <code>model.Model</code> xác định thống nhất API cho SINGA.</p>
+<h3><a class="anchor" aria-hidden="true" id="singafrontend"></a><a href="#singafrontend" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>Hàm function đầu vào của <code>SingaFrontend</code> là <code>singa_to_onnx_model</code> cũng được gọi là <code>to_onnx</code>. <code>singa_to_onnx_model</code> tạo ra mô hình ONNX model, và nó cũng tạo ra một ONNX graph bằng việc
+sử dụng <code>singa_to_onnx_graph</code>.</p>
+<p><code>singa_to_onnx_graph</code> chấp nhận đầu ra của mô hình, và lặp lại đệ quy graph của mô hình
+SINGA model từ đầu ra để gom tất cả toán tử tạo thành một hàng.
+Tensors đầu vào và trực tiếp, v.d, weights để train, của mô hình SINGA model
+được chọn cùng một lúc. Đầu vào được lưu trong <code>onnx_model.graph.input</code>;
+đầu ra được lưu trong <code>onnx_model.graph.output</code>; và weights để train được lưu trong <code>onnx_model.graph.initializer</code>.</p>
+<p>Sau đó toán tử SINGA operator trong hàng được đổi sang từng toán tử ONNX operators.
+<code>_rename_operators</code> xác định tên toán tử giữa SINGA và ONNX.
+<code>_special_operators</code> xác định function sử dụng để biến đổi toán tử.</p>
+<p>Thêm vào đó, một vài toán tử trong SINGA có các định nghĩa khác với ONNX, chẳng hạn như,
+ONNX coi một vài thuộc tính của toán tử SINGA operators là đầu vào, vì thế
+<code>_unhandled_operators</code> xác định function nào dùng để xử lý toán tử đặc biệt.</p>
+<p>Do dạng bool được coi là dạng int32 trong SINGA, <code>_bool_operators</code> địng nghĩa toán tử có thể
+chuyển sang dạng bool.</p>
+<h3><a class="anchor" aria-hidden="true" id="singabackend"></a><a href="#singabackend" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p>Function đầu vào của <code>SingaBackend</code> là <code>prepare</code> kiểm tra phiên bản nào của mô hình
+ONNX model rồi gọi <code>_onnx_model_to_singa_ops</code>.</p>
+<p>Chức năng của <code>_onnx_model_to_singa_ops</code> là để lấy SINGA tensors và operators.
+Các tensors được lưu trong một thư viện, theo tên trong ONNX, và operators được
+lưu trong hàng ở dạng <code>namedtuple('SingaOps', ['node', 'operator'])</code>.
+Với mỗi toán tử operator, <code>node</code> là một ví dụ từ OnnxNode được dùng để lưu các thông
+tin cơ bản của ONNX node; <code>operator</code> là forward function cho toán tử SINGA;</p>
+<p>Bước đầu tiên của <code>_onnx_model_to_singa_ops</code> có bốn bước, đầu tiên là gọi
+<code>_parse_graph_params</code> để lấy tất các các tensors lưu trong <code>params</code>. Sau đó gọi hàm
+<code>_parse_graph_inputs_outputs</code> để lấy tất cả thông tin đầu vào đầu ra lưu trong
+<code>inputs</code> và <code>outputs</code>. Cuối cùng nó lặp lại tất cả các nodes trong ONNX graph
+và đẩy sang <code>_onnx_node_to_singa_op</code> như SINGA operators hoặc layers và lưu chúng thành
+<code>outputs</code>. Một vài weights được lưu trong ONNX node gọi là
+<code>Constant</code>, SONNX có thể xử lý chúng bằng <code>_onnx_constant_to_np</code> để lưu trong
+<code>params</code>.</p>
+<p>Cuối cùng class này trả lại một đối tượng <code>SingaRep</code> và lưu trên <code>params</code>,
+<code>inputs</code>, <code>outputs</code>, <code>layers</code>.</p>
+<h3><a class="anchor" aria-hidden="true" id="singarep"></a><a href="#singarep" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p><code>SingaBackend</code> lưu tất cả SINGA tensors và operators. <code>run</code> chấp nhận đầu vào của mô hình và
+chạy từng toán tử SINGA operators một, theo hàng của toán tử. Người dùng có thể sử dụng <code>last_layers</code>
+để xoá mô hình model sau vài layers cuối cùng.</p>
+<h3><a class="anchor" aria-hidden="true" id="sonnxmodel"></a><a href="#sonnxmodel" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p><code>SONNXModel</code> được tạo từ  <code>sonnx.SONNXModel</code> và thực hiện phương pháp
+<code>forward</code> để cung cấp một API đồng bộ với các mô hình SINGA.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/graph"><span class="arrow-prev">← </span><span>Model</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/dist-train"><span>Distributed Training</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sử-dụng-chung">Sử dụng chung</a><ul class="toc-headings"><li><a href="#tải-một-onnx-model-trong-singa">Tải m [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/onnx/index.html b/content/docs/3.1.0_Viet/onnx/index.html
new file mode 100644
index 0000000..d85e03b
--- /dev/null
+++ b/content/docs/3.1.0_Viet/onnx/index.html
@@ -0,0 +1,418 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>ONNX · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright ownership. [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/onnx.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">ONNX</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreemen [...]
+<p><a href="https://onnx.ai/">ONNX</a> là một định dạng đại diện mở dùng trong các model của machine learning, cho phép nhà phát triển AI sử dụng các models trên các libraries và công cụ khác nhau. SINGA hỗ trợ tải các models dạng ONNX trong training và inference, và lưu các models ở dạng ONNX với SINGA APIs (e.g., <a href="./module">Module</a>).</p>
+<p>SINGA đã được thử nghiệm với
+<a href="https://github.com/onnx/onnx/blob/master/docs/Versioning.md">phiên bản sau</a> của ONNX.</p>
+<table>
+<thead>
+<tr><th>Phiên bản ONNX</th><th>Phiên bản định dạng tệp tin</th><th>Opset phiên bản ai.onnx</th><th>Opset phiên bản ai.onnx.ml</th><th>Opset phiên bản ai.onnx.training</th></tr>
+</thead>
+<tbody>
+<tr><td>1.6.0</td><td>6</td><td>11</td><td>2</td><td>-</td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng-chung"></a><a href="#sử-dụng-chung" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<h3><a class="anchor" aria-hidden="true" id="tải-một-onnx-model-trong-singa"></a><a href="#tải-một-onnx-model-trong-singa" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
+<p>Sau khi tải một ONNX model từ disk qua <code>onnx.load</code>, bạn chỉ cần cập nhật batch-size của input sử dụng <code>tensor.PlaceHolder</code> sau SINGA v3.0, shape của internal tensors sẽ tự động được tạo ra.</p>
+<p>Sau đó, bạn định nghĩa một class thừa hưởng từ <code>sonnx.SONNXModel</code> và thực hiện hai phương pháp <code>forward</code> cho quá trình forward và <code>train_one_batch</code> cho quá trình training.
+Sau khi gọi hàm <code>model.compile</code>, hàm SONNX sẽ lặp lại và dịch tất cả các nodes trong phạm vi graph của ONNX model sang các hàm SINGA, tải tất cả weights đã lưu trữ và tạo ra shape của từng tensor trung gian.</p>
+<pre><code class="hljs css language-python3"><span class="hljs-keyword">import</span> onnx
+<span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> device
+<span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> sonnx
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyModel</span><span class="hljs-params">(sonnx.SONNXModel)</span>:</span>
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, onnx_model)</span>:</span>
+        super(MyModel, self).__init__(onnx_model)
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(self, *x)</span>:</span>
+        y = super(MyModel, self).forward(*x)
+        <span class="hljs-comment"># Since SINGA model returns the output as a list,</span>
+        <span class="hljs-comment"># if there is only one output,</span>
+        <span class="hljs-comment"># you just need to take the first element.</span>
+        <span class="hljs-keyword">return</span> y[<span class="hljs-number">0</span>]
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">train_one_batch</span><span class="hljs-params">(self, x, y)</span>:</span>
+        <span class="hljs-keyword">pass</span>
+
+model_path = <span class="hljs-string">"PATH/To/ONNX/MODEL"</span>
+onnx_model = onnx.load(model_path)
+
+<span class="hljs-comment"># convert onnx model into SINGA model</span>
+dev = device.create_cuda_gpu()
+x = tensor.PlaceHolder(INPUT.shape, device=dev)
+model = MyModel(onnx_model)
+model.compile([x], is_train=<span class="hljs-literal">False</span>, use_graph=<span class="hljs-literal">True</span>, sequential=<span class="hljs-literal">True</span>)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="inference-với-singa-model"></a><a href="#inference-với-singa-model" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<p>Sau khi tạo models, bạn có thể tiến hành inference bằng cách gọi hàm <code>model.forward</code>. Đầu vào và đầu ra phải ở dạng phiên bản của SINGA <code>Tensor</code>.</p>
+<pre><code class="hljs css language-python3"><span class="hljs-attr">x</span> = tensor.Tensor(device=dev, data=INPUT)
+<span class="hljs-attr">y</span> = model.forward(x)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="lưu-model-của-singa-dưới-dạng-onnx"></a><a href="#lưu-model-của-singa-dưới-dạng-onnx" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
+<p>Với hàm tensors đầu vào và đầu ra được tạo ra bởi các hàm của model, bạn có thể truy nguyên đến tất cả các hàm nội bộ. Bởi vậy, một model SINGA được xác định bởi tensors đầu vào và đầu ra. Để biến một model SINGA sang dạng ONNX, bạn chỉ cần cung cấp danh sách tensor đầu vào và đầu ra.</p>
+<pre><code class="hljs css language-python3"># <span class="hljs-symbol">x</span> is the input tensor, <span class="hljs-symbol">y</span> is the output tensor
+sonnx.to_onnx([<span class="hljs-symbol">x</span>], [<span class="hljs-symbol">y</span>])
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="training-lại-với-model-onnx"></a><a href="#training-lại-với-model-onnx" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>Để train (hay luyện) một model ONNX sử dụng SINGA, bạn cần thực hiện
+<code>train_one_batch</code> từ <code>sonnx.SONNXModel</code> và đánh dấu <code>is_train=True</code> khi gọi hàm <code>model.compile</code>.</p>
+<pre><code class="hljs css language-python3">from singa import opt
+from singa import autograd
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyModel</span>(<span class="hljs-title">sonnx</span>.<span class="hljs-title">SONNXModel</span>):</span>
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, onnx_model)</span></span>:
+        <span class="hljs-keyword">super</span>(MyModel, <span class="hljs-keyword">self</span>).__init_<span class="hljs-number">_</span>(onnx_model)
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, *x)</span></span>:
+        y = <span class="hljs-keyword">super</span>(MyModel, <span class="hljs-keyword">self</span>).forward(*x)
+        <span class="hljs-keyword">return</span> y[<span class="hljs-number">0</span>]
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">train_one_batch</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, x, y, dist_option, spars)</span></span>:
+        out = <span class="hljs-keyword">self</span>.forward(x)
+        loss = autograd.softmax_cross_entropy(out, y)
+        <span class="hljs-keyword">if</span> dist_option == <span class="hljs-string">'fp32'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_update(loss)
+        elif dist_option == <span class="hljs-string">'fp16'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_update_half(loss)
+        elif dist_option == <span class="hljs-string">'partialUpdate'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_partial_update(loss)
+        elif dist_option == <span class="hljs-string">'sparseTopK'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_sparse_update(loss,
+                                                      topK=True,
+                                                      spars=spars)
+        elif dist_option == <span class="hljs-string">'sparseThreshold'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_sparse_update(loss,
+                                                      topK=False,
+                                                      spars=spars)
+        <span class="hljs-keyword">return</span> out, loss
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_optimizer</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, optimizer)</span></span>:
+        <span class="hljs-keyword">self</span>.optimizer = optimizer
+
+sgd = opt.SGD(lr=<span class="hljs-number">0</span>.<span class="hljs-number">005</span>, momentum=<span class="hljs-number">0</span>.<span class="hljs-number">9</span>, weight_decay=<span class="hljs-number">1</span>e-<span class="hljs-number">5</span>)
+model.set_optimizer(sgd)
+model.compile([tx], is_train=True, use_graph=graph, sequential=True)
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="transfer-learning-một-model-onnx"></a><a href="#transfer-learning-một-model-onnx" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
+<p>Bạn cũng có thể thêm một vài layers vào phần cuối của ONNX model để làm
+transfer-learning. Hàm <code>last_layers</code> chấp nhận một số nguyên âm để chỉ layer bị cắt ra. Ví dụ, <code>-1</code> nghĩa là bị cắt ra sau kết quả cuối cùng (không xoá bớt layer nào) <code>-2</code> nghĩa là bị cắt ra sau hai layer cuối cùng.</p>
+<pre><code class="hljs css language-python3">from singa import opt
+from singa import autograd
+
+<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyModel</span>(<span class="hljs-title">sonnx</span>.<span class="hljs-title">SONNXModel</span>):</span>
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, onnx_model)</span></span>:
+        <span class="hljs-keyword">super</span>(MyModel, <span class="hljs-keyword">self</span>).__init_<span class="hljs-number">_</span>(onnx_model)
+        <span class="hljs-keyword">self</span>.linear = layer.Linear(<span class="hljs-number">1000</span>, <span class="hljs-number">3</span>)
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, *x)</span></span>:
+        <span class="hljs-comment"># cut off after the last third layer</span>
+        <span class="hljs-comment"># and append a linear layer</span>
+        y = <span class="hljs-keyword">super</span>(MyModel, <span class="hljs-keyword">self</span>).forward(*x, last_layers=-<span class="hljs-number">3</span>)[<span class="hljs-number">0</span>]
+        y = <span class="hljs-keyword">self</span>.linear(y)
+        <span class="hljs-keyword">return</span> y
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">train_one_batch</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, x, y, dist_option, spars)</span></span>:
+        out = <span class="hljs-keyword">self</span>.forward(x)
+        loss = autograd.softmax_cross_entropy(out, y)
+        <span class="hljs-keyword">if</span> dist_option == <span class="hljs-string">'fp32'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_update(loss)
+        elif dist_option == <span class="hljs-string">'fp16'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_update_half(loss)
+        elif dist_option == <span class="hljs-string">'partialUpdate'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_partial_update(loss)
+        elif dist_option == <span class="hljs-string">'sparseTopK'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_sparse_update(loss,
+                                                      topK=True,
+                                                      spars=spars)
+        elif dist_option == <span class="hljs-string">'sparseThreshold'</span>:
+            <span class="hljs-keyword">self</span>.optimizer.backward_and_sparse_update(loss,
+                                                      topK=False,
+                                                      spars=spars)
+        <span class="hljs-keyword">return</span> out, loss
+
+    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_optimizer</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, optimizer)</span></span>:
+        <span class="hljs-keyword">self</span>.optimizer = optimizer
+
+sgd = opt.SGD(lr=<span class="hljs-number">0</span>.<span class="hljs-number">005</span>, momentum=<span class="hljs-number">0</span>.<span class="hljs-number">9</span>, weight_decay=<span class="hljs-number">1</span>e-<span class="hljs-number">5</span>)
+model.set_optimizer(sgd)
+model.compile([tx], is_train=True, use_graph=graph, sequential=True)
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="onnx-model-zoo"></a><a href="#onnx-model-zoo" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p><a href="https://github.com/onnx/models">ONNX Model Zoo</a> là tổ hợp các models ở dạng ONNX, đã được train có kết quả tốt nhất, đóng góp bởi cộng đồng thành viên. SINGA giờ đây đã hỗ trợ một số models CV và NLP. Chúng tôi dự định sẽ sớm hỗ trợ thêm các models khác.</p>
+<h3><a class="anchor" aria-hidden="true" id="phân-loại-hình-ảnh-image-classification"></a><a href="#phân-loại-hình-ảnh-image-classification" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2  [...]
+<p>Tổ hợp models này có đầu vào là hình ảnh, sau đó phân loại các đối tượng chính trong hình ảnh thành 1000 mục đối tượng như bàn phím, chuột, bút chì, và các động vật.</p>
+<table>
+<thead>
+<tr><th>Model Class</th><th>Tham khảo</th><th>Mô tả</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/vision/classification/mobilenet">MobileNet</a></b></td><td><a href="https://arxiv.org/abs/1801.04381">Sandler et al.</a></td><td>deep neural network nhỏ, nhẹ phù hợp nhất cho điện thoại và ứng dụng hình ảnh đính kèm. <br>Top-5 error từ báo cáo - ~10%</td><td><a href="https://colab.research.google.com/drive/1HsixqJMIpKyEPhkbB8jy7NwNEFEAUWAf"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Mở trên Colab [...]
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/vision/classification/resnet">ResNet18</a></b></td><td><a href="https://arxiv.org/abs/1512.03385">He et al.</a></td><td>Mô hình CNN (lên tới 152 layers). Sử dụng liên kết ngắn gọn để đạt độ chính xác cao hơn khi phân loại hình ảnh. <br> Top-5 error từ báo cáo - ~3.6%</td><td><a href="https://colab.research.google.com/drive/1u1RYefSsVbiP4I-5wiBKHjsT9L0FxLm9"><img src="https://colab.research.google.com/assets/colab-badge.svg" a [...]
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/vision/classification/vgg">VGG16</a></b></td><td><a href="https://arxiv.org/abs/1409.1556">Simonyan et al.</a></td><td>Mô hình CNN chuyên sâu (lên tới 19 layers). Tương tự như AlexNet nhưng sử dụng nhiều loại filters cỡ kernel nhỏ hơn mang lại độ chính xác cao hơn khi phân loại hình ảnh. <br>Top-5 từ báo cáo - ~8%</td><td><a href="https://colab.research.google.com/drive/14kxgRKtbjPCKKsDJVNi3AvTev81Gp_Ds"><img src="https://col [...]
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/vision/classification/shufflenet">ShuffleNet_V2</a></b></td><td><a href="https://arxiv.org/pdf/1707.01083.pdf">Simonyan et al.</a></td><td>Mô hình CNN cực kỳ hiệu quả trong sử dụng tài nguyên, được thiết kế đặc biệt cho các thiết bị di động. Mạng lưới thiết kế hệ mô hình sử dụng số liệu trực tiếp như tốc độ, thay vì các số liệu gián tiếp như FLOP. Top-1 error từ báo cáo - ~30.6%</td><td>[<img src="https://colab.research.googl [...]
+</tbody>
+</table>
+<p>Chúng tôi cung cấp ví dụ re-training sử dụng VGG và ResNet, vui lòng xem tại
+<code>examples/onnx/training</code>.</p>
+<h3><a class="anchor" aria-hidden="true" id="nhận-diện-đối-tượng-object-detection"></a><a href="#nhận-diện-đối-tượng-object-detection" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 [...]
+<p>Các models Object detection nhận diện sự hiện diện của các đối tượng trong một hình ảnh và phân đoạn ra các khu vực của bức ảnh mà đối tượng được nhận diện.</p>
+<table>
+<thead>
+<tr><th>Model Class</th><th>Tham khảo</th><th>Mô tả</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/vision/object_detection_segmentation/tiny_yolov2">Tiny YOLOv2</a></b></td><td><a href="https://arxiv.org/pdf/1612.08242.pdf">Redmon et al.</a></td><td>Mô hình CNN thời gian thực cho Nhận diện đối tượng có thể nhận diện 20 loại đối tượng khác nhau. Phiên bản nhỏ của mô hình phức tạp Yolov2.</td><td><a href="https://colab.research.google.com/drive/11V4I6cRjIJNUv5ZGsEGwqHuoQEie6b1T"><img src="https://colab.research.google.com/as [...]
+</tbody>
+</table>
+<h3><a class="anchor" aria-hidden="true" id="phân-tích-khuôn-mặt-face-analysis"></a><a href="#phân-tích-khuôn-mặt-face-analysis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S1 [...]
+<p>Các mô hình Nhận Diện Khuôn Mặt xác định và/hoặc nhận diện khuôn mặt người và các trạng thái cảm xúc trong bức ảnh.</p>
+<table>
+<thead>
+<tr><th>Model Class</th><th>Tham khảo</th><th>Mô tả</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/vision/body_analysis/arcface">ArcFace</a></b></td><td><a href="https://arxiv.org/abs/1801.07698">Deng et al.</a></td><td>Mô hình dựa trên CNN để nhận diện khuôn mặt, học từ các đặc tính khác nhau trên khuôn mặt và tạo ra các embeddings cho hình ảnh khuôn mặt đầu vào.</td><td><a href="https://colab.research.google.com/drive/1qanaqUKGIDtifdzEzJOHjEj4kYzA9uJC"><img src="https://colab.research.google.com/assets/colab-badge.svg" a [...]
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/vision/body_analysis/emotion_ferplus">Emotion FerPlus</a></b></td><td><a href="https://arxiv.org/abs/1608.01041">Barsoum et al.</a></td><td>Mô hình CNN chuyên sâu nhận diện cảm xúc được train trên các hình ảnh khuôn mặt.</td><td><a href="https://colab.research.google.com/drive/1XHtBQGRhe58PDi4LGYJzYueWBeWbO23r"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"></a></td></tr>
+</tbody>
+</table>
+<h3><a class="anchor" aria-hidden="true" id="máy-hiểu-machine-comprehension"></a><a href="#máy-hiểu-machine-comprehension" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
+<p>Một dạng của mô hình xử lý ngôn ngữ tự nhiên giúp trả lời câu hỏi trên một đoạn ngôn ngữ cung cấp.</p>
+<table>
+<thead>
+<tr><th>Model Class</th><th>Tham khảo</th><th>Mô tả</th><th>Đường dẫn</th></tr>
+</thead>
+<tbody>
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/text/machine_comprehension/bert-squad">BERT-Squad</a></b></td><td><a href="https://arxiv.org/pdf/1810.04805.pdf">Devlin et al.</a></td><td>Mô hình này trả lời câu hỏi dựa trên ngữ cảnh của đoạn văn đầu vào.</td><td><a href="https://colab.research.google.com/drive/1kud-lUPjS_u-TkDAzihBTw0Vqr0FjCE-"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Mở trên Colab"></a></td></tr>
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/text/machine_comprehension/roberta">RoBERTa</a></b></td><td><a href="https://arxiv.org/pdf/1907.11692.pdf">Devlin et al.</a></td><td>Mô hình transformer-based kích thước lớn, dự đoán ngữ nghĩa dựa trên đoạn văn đầu vào.</td><td><a href="https://colab.research.google.com/drive/1F-c4LJSx3Cb2jW6tP7f8nAZDigyLH6iN?usp=sharing"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Mở trên Colab"></a></td></tr>
+<tr><td><b><a href="https://github.com/onnx/models/tree/master/text/machine_comprehension/gpt-2">GPT-2</a></b></td><td><a href="https://d4mucfpksywv.cloudfront.net/better-language-models/language_models_are_unsupervised_multitask_learners.pdf">Devlin et al.</a></td><td>Mô hình ngôn ngữ transformer-based kích thước lớn, đưa ra một đoạn chữ, rồi dự đoán từ tiếp theo.</td><td>[<img src="https://colab.research.google.com/drive/1ZlXLSIMppPch6HgzKRillJiUcWn3PiK7?usp=sharing" alt="Mở trên Colab [...]
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="các-toán-tử-operators-được-hỗ-trợ"></a><a href="#các-toán-tử-operators-được-hỗ-trợ" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S1 [...]
+<p>Chúng tôi hỗ trợ các toán tử sau:</p>
+<ul>
+<li>Acos</li>
+<li>Acosh</li>
+<li>Add</li>
+<li>And</li>
+<li>Asin</li>
+<li>Asinh</li>
+<li>Atan</li>
+<li>Atanh</li>
+<li>AveragePool</li>
+<li>BatchNormalization</li>
+<li>Cast</li>
+<li>Ceil</li>
+<li>Clip</li>
+<li>Concat</li>
+<li>ConstantOfShape</li>
+<li>Conv</li>
+<li>Cos</li>
+<li>Cosh</li>
+<li>Div</li>
+<li>Dropout</li>
+<li>Elu</li>
+<li>Equal</li>
+<li>Erf</li>
+<li>Expand</li>
+<li>Flatten</li>
+<li>Gather</li>
+<li>Gemm</li>
+<li>GlobalAveragePool</li>
+<li>Greater</li>
+<li>HardSigmoid</li>
+<li>Identity</li>
+<li>LeakyRelu</li>
+<li>Less</li>
+<li>Log</li>
+<li>MatMul</li>
+<li>Max</li>
+<li>MaxPool</li>
+<li>Mean</li>
+<li>Min</li>
+<li>Mul</li>
+<li>Neg</li>
+<li>NonZero</li>
+<li>Not</li>
+<li>OneHot</li>
+<li>Or</li>
+<li>Pad</li>
+<li>Pow</li>
+<li>PRelu</li>
+<li>Reciprocal</li>
+<li>ReduceMean</li>
+<li>ReduceSum</li>
+<li>Relu</li>
+<li>Reshape</li>
+<li>ScatterElements</li>
+<li>Selu</li>
+<li>Shape</li>
+<li>Sigmoid</li>
+<li>Sign</li>
+<li>Sin</li>
+<li>Sinh</li>
+<li>Slice</li>
+<li>Softmax</li>
+<li>Softplus</li>
+<li>Softsign</li>
+<li>Split</li>
+<li>Sqrt</li>
+<li>Squeeze</li>
+<li>Sub</li>
+<li>Sum</li>
+<li>Tan</li>
+<li>Tanh</li>
+<li>Tile</li>
+<li>Transpose</li>
+<li>Unsqueeze</li>
+<li>Upsample</li>
+<li>Where</li>
+<li>Xor</li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="các-lưu-ý-đặc-biệt-cho-onnx-backend"></a><a href="#các-lưu-ý-đặc-biệt-cho-onnx-backend" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2 [...]
+<ul>
+<li><p>Conv, MaxPool và AveragePool</p>
+<p>Đầu vào phải có shape 1d<code>(N*C*H)</code> và 2d(<code>N*C*H*W</code>) trong khi <code>dilation</code> phải là 1.</p></li>
+<li><p>BatchNormalization</p>
+<p><code>epsilon</code> là 1e-05 và không được đổi.</p></li>
+<li><p>Cast</p>
+<p>Chỉ hỗ trợ float32 và int32, các dạng khác phải được cast thành hai dạng này.</p></li>
+<li><p>Squeeze và Unsqueeze</p>
+<p>Nếu gặp lỗi khi dùng <code>Squeeze</code> hay <code>Unsqueeze</code> giữa <code>Tensor</code> và
+Scalar, vui lòng báo cho chúng tôi.</p></li>
+<li><p>Empty tensor Empty tensor không được chấp nhận trong SINGA.</p></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="thực-hiện"></a><a href="#thực-hiện" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
+<p>Mã code của SINGA ONNX được đặt trong <code>python/singa/soonx.py</code>. Có bốn loại chính, <code>SingaFrontend</code>, <code>SingaBackend</code>, <code>SingaRep</code> và <code>SONNXModel</code>.
+<code>SingaFrontend</code> qui đổi mô hình SINGA model sang mô hình ONNX model; <code>SingaBackend</code> biến mô hình ONNX model sang đối tượng <code>SingaRep</code> giúp lưu trữ tất cả các toán tử SINGA operators và
+tensors(tensor trong văn bản này nghĩa là SINGA <code>Tensor</code>); <code>SingaRep</code> có thẻ chạy giống như mô hình SINGA model. <code>SONNXModel</code> tạo ra từ <code>model.Model</code> xác định thống nhất API cho SINGA.</p>
+<h3><a class="anchor" aria-hidden="true" id="singafrontend"></a><a href="#singafrontend" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>Hàm function đầu vào của <code>SingaFrontend</code> là <code>singa_to_onnx_model</code> cũng được gọi là <code>to_onnx</code>. <code>singa_to_onnx_model</code> tạo ra mô hình ONNX model, và nó cũng tạo ra một ONNX graph bằng việc
+sử dụng <code>singa_to_onnx_graph</code>.</p>
+<p><code>singa_to_onnx_graph</code> chấp nhận đầu ra của mô hình, và lặp lại đệ quy graph của mô hình
+SINGA model từ đầu ra để gom tất cả toán tử tạo thành một hàng.
+Tensors đầu vào và trực tiếp, v.d, weights để train, của mô hình SINGA model
+được chọn cùng một lúc. Đầu vào được lưu trong <code>onnx_model.graph.input</code>;
+đầu ra được lưu trong <code>onnx_model.graph.output</code>; và weights để train được lưu trong <code>onnx_model.graph.initializer</code>.</p>
+<p>Sau đó toán tử SINGA operator trong hàng được đổi sang từng toán tử ONNX operators.
+<code>_rename_operators</code> xác định tên toán tử giữa SINGA và ONNX.
+<code>_special_operators</code> xác định function sử dụng để biến đổi toán tử.</p>
+<p>Thêm vào đó, một vài toán tử trong SINGA có các định nghĩa khác với ONNX, chẳng hạn như,
+ONNX coi một vài thuộc tính của toán tử SINGA operators là đầu vào, vì thế
+<code>_unhandled_operators</code> xác định function nào dùng để xử lý toán tử đặc biệt.</p>
+<p>Do dạng bool được coi là dạng int32 trong SINGA, <code>_bool_operators</code> địng nghĩa toán tử có thể
+chuyển sang dạng bool.</p>
+<h3><a class="anchor" aria-hidden="true" id="singabackend"></a><a href="#singabackend" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p>Function đầu vào của <code>SingaBackend</code> là <code>prepare</code> kiểm tra phiên bản nào của mô hình
+ONNX model rồi gọi <code>_onnx_model_to_singa_ops</code>.</p>
+<p>Chức năng của <code>_onnx_model_to_singa_ops</code> là để lấy SINGA tensors và operators.
+Các tensors được lưu trong một thư viện, theo tên trong ONNX, và operators được
+lưu trong hàng ở dạng <code>namedtuple('SingaOps', ['node', 'operator'])</code>.
+Với mỗi toán tử operator, <code>node</code> là một ví dụ từ OnnxNode được dùng để lưu các thông
+tin cơ bản của ONNX node; <code>operator</code> là forward function cho toán tử SINGA;</p>
+<p>Bước đầu tiên của <code>_onnx_model_to_singa_ops</code> có bốn bước, đầu tiên là gọi
+<code>_parse_graph_params</code> để lấy tất các các tensors lưu trong <code>params</code>. Sau đó gọi hàm
+<code>_parse_graph_inputs_outputs</code> để lấy tất cả thông tin đầu vào đầu ra lưu trong
+<code>inputs</code> và <code>outputs</code>. Cuối cùng nó lặp lại tất cả các nodes trong ONNX graph
+và đẩy sang <code>_onnx_node_to_singa_op</code> như SINGA operators hoặc layers và lưu chúng thành
+<code>outputs</code>. Một vài weights được lưu trong ONNX node gọi là
+<code>Constant</code>, SONNX có thể xử lý chúng bằng <code>_onnx_constant_to_np</code> để lưu trong
+<code>params</code>.</p>
+<p>Cuối cùng class này trả lại một đối tượng <code>SingaRep</code> và lưu trên <code>params</code>,
+<code>inputs</code>, <code>outputs</code>, <code>layers</code>.</p>
+<h3><a class="anchor" aria-hidden="true" id="singarep"></a><a href="#singarep" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p><code>SingaBackend</code> lưu tất cả SINGA tensors và operators. <code>run</code> chấp nhận đầu vào của mô hình và
+chạy từng toán tử SINGA operators một, theo hàng của toán tử. Người dùng có thể sử dụng <code>last_layers</code>
+để xoá mô hình model sau vài layers cuối cùng.</p>
+<h3><a class="anchor" aria-hidden="true" id="sonnxmodel"></a><a href="#sonnxmodel" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p><code>SONNXModel</code> được tạo từ  <code>sonnx.SONNXModel</code> và thực hiện phương pháp
+<code>forward</code> để cung cấp một API đồng bộ với các mô hình SINGA.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/graph"><span class="arrow-prev">← </span><span>Model</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/dist-train"><span>Distributed Training</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sử-dụng-chung">Sử dụng chung</a><ul class="toc-headings"><li><a href="#tải-một-onnx-model-trong-singa">Tải m [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/optimizer.html b/content/docs/3.1.0_Viet/optimizer.html
new file mode 100644
index 0000000..c5645a5
--- /dev/null
+++ b/content/docs/3.1.0_Viet/optimizer.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Optimizer · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright owner [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/optimizer.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Optimizer</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor licens [...]
+<p>SINGA hỗ trợ đa dạng các thuật toán tối ưu (optimizers) phổ biến bao gồm stochastic gradient descent
+với momentum, Adam, RMSProp, và AdaGrad, etc. Với mỗi thuật toán tối ưu, SINGA hỗ trợ để sử dụng decay schedular để lên kế hoạch learning rate áp dụng trong các epochs khác nhau. Các mỗi thuật toán tối ưu và
+decay schedulers có trong <code>singa/opt.py</code>.</p>
+<h2><a class="anchor" aria-hidden="true" id="tạo-thuật-toán-tối-ưu"></a><a href="#tạo-thuật-toán-tối-ưu" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
+<ol>
+<li>SGD với momentum</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-comment"># xác định hyperparameter learning rate</span>
+lr = <span class="hljs-number">0.001</span>
+<span class="hljs-comment"># xác định hyperparameter momentum</span>
+momentum = <span class="hljs-number">0.9</span>
+<span class="hljs-comment"># xác định hyperparameter weight decay</span>
+weight_decay = <span class="hljs-number">0.0001</span>
+
+<span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> opt
+sgd = opt.SGD(lr=lr, momentum=momentum, weight_decay=weight_decay)
+</code></pre>
+<ol start="2">
+<li>RMSProp</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-comment"># xác định hyperparameter learning rate</span>
+lr = <span class="hljs-number">0.001</span>
+<span class="hljs-comment"># xác định hyperparameter rho</span>
+rho = <span class="hljs-number">0.9</span>
+<span class="hljs-comment"># xác định hyperparameter epsilon</span>
+epsilon = <span class="hljs-number">1e-8</span>
+<span class="hljs-comment"># xác định hyperparameter weight decay</span>
+weight_decay = <span class="hljs-number">0.0001</span>
+
+<span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> opt
+sgd = opt.RMSProp(lr=lr, rho=rho, epsilon=epsilon, weight_decay=weight_decay)
+</code></pre>
+<ol start="3">
+<li>AdaGrad</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-comment"># xác định hyperparameter learning rate</span>
+lr = <span class="hljs-number">0.001</span>
+<span class="hljs-comment"># xác định hyperparameter epsilon</span>
+epsilon = <span class="hljs-number">1e-8</span>
+<span class="hljs-comment"># xác định hyperparameter weight decay</span>
+weight_decay = <span class="hljs-number">0.0001</span>
+
+<span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> opt
+sgd = opt.AdaGrad(lr=lr, epsilon=epsilon, weight_decay=weight_decay)
+</code></pre>
+<ol start="4">
+<li>Adam</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-comment"># xác định hyperparameter learning rate</span>
+lr = <span class="hljs-number">0.001</span>
+<span class="hljs-comment"># xác định hyperparameter beta 1</span>
+beta_1= <span class="hljs-number">0.9</span>
+<span class="hljs-comment"># xác định hyperparameter beta 2</span>
+beta_1= <span class="hljs-number">0.999</span>
+<span class="hljs-comment"># xác định hyperparameter epsilon</span>
+epsilon = <span class="hljs-number">1e-8</span>
+<span class="hljs-comment"># xác định hyperparameter weight decay</span>
+weight_decay = <span class="hljs-number">0.0001</span>
+
+<span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> opt
+sgd = opt.Adam(lr=lr, beta_1=beta_1, beta_2=beta_2, epsilon=epsilon, weight_decay=weight_decay)
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="tạo-decay-scheduler"></a><a href="#tạo-decay-scheduler" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> opt
+
+<span class="hljs-comment"># xác định learning rate ban đầu</span>
+lr_init = <span class="hljs-number">0.001</span>
+<span class="hljs-comment"># xác định rate của decay trong decay scheduler</span>
+decay_rate = <span class="hljs-number">0.95</span>
+<span class="hljs-comment"># xác định learning rate schedule có ở dạng staircase shape</span>
+staircase=<span class="hljs-literal">True</span>
+<span class="hljs-comment"># xác định bước decay của decay scheduler (trong ví dụ này lr giảm sau mỗi 2 bước)</span>
+decay_steps = <span class="hljs-number">2</span>
+
+<span class="hljs-comment"># tạo decay scheduler, schedule của lr trở thành lr_init * (decay_rate ^ (step // decay_steps) )</span>
+lr = opt.ExponentialDecay(<span class="hljs-number">0.1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">0.5</span>, <span class="hljs-literal">True</span>)
+<span class="hljs-comment"># sử dụng lr để tạo một thuật toán tối ưu </span>
+sgd = opt.SGD(lr=lr, momentum=<span class="hljs-number">0.9</span>, weight_decay=<span class="hljs-number">0.0001</span>)
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng-thuật-toán-tối-ưu-trong-model-api"></a><a href="#sử-dụng-thuật-toán-tối-ưu-trong-model-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1  [...]
+<p>Khi tạo mô hình model, cần đính kèm thuật toán tối ưu vào model.</p>
+<pre><code class="hljs css language-python"><span class="hljs-comment"># tạo CNN sử dụng Model API</span>
+model = CNN()
+
+<span class="hljs-comment"># khởi tạo thuật toán tối ưu và đính vào model </span>
+sgd = opt.SGD(lr=<span class="hljs-number">0.005</span>, momentum=<span class="hljs-number">0.9</span>, weight_decay=<span class="hljs-number">1e-5</span>)
+model.set_optimizer(sgd)
+</code></pre>
+<p>Sau đó, khi gọi hàm model, chạy phương pháp <code>train_one_batch</code> để sử dụng thuật toán tối ưu.</p>
+<p>Do vậy, một ví dụ cho lặp lại loop để tối ưu hoá model là:</p>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">for</span> b <span class="hljs-keyword">in</span> range(num_train_batch):
+    <span class="hljs-comment"># tạo mini-batch tiếp theo</span>
+    x, y = ...
+
+    <span class="hljs-comment"># Copy dữ liệu vào tensors đầu vào</span>
+    tx.copy_from_numpy(x)
+    ty.copy_from_numpy(y)
+
+    <span class="hljs-comment"># Train với một batch </span>
+    out, loss = model(tx, ty)
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/autograd"><span class="arrow-prev">← </span><span>Autograd</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/graph"><span>Model</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#tạo-thuật-toán-tối-ưu">Tạo thuật toán tối ưu</a></li><li><a href="#tạo-decay-scheduler">Tạo Decay Scheduler</a></li><li><a [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/optimizer/index.html b/content/docs/3.1.0_Viet/optimizer/index.html
new file mode 100644
index 0000000..c5645a5
--- /dev/null
+++ b/content/docs/3.1.0_Viet/optimizer/index.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Optimizer · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright owner [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/optimizer.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Optimizer</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor licens [...]
+<p>SINGA hỗ trợ đa dạng các thuật toán tối ưu (optimizers) phổ biến bao gồm stochastic gradient descent
+với momentum, Adam, RMSProp, và AdaGrad, etc. Với mỗi thuật toán tối ưu, SINGA hỗ trợ để sử dụng decay schedular để lên kế hoạch learning rate áp dụng trong các epochs khác nhau. Các mỗi thuật toán tối ưu và
+decay schedulers có trong <code>singa/opt.py</code>.</p>
+<h2><a class="anchor" aria-hidden="true" id="tạo-thuật-toán-tối-ưu"></a><a href="#tạo-thuật-toán-tối-ưu" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
+<ol>
+<li>SGD với momentum</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-comment"># xác định hyperparameter learning rate</span>
+lr = <span class="hljs-number">0.001</span>
+<span class="hljs-comment"># xác định hyperparameter momentum</span>
+momentum = <span class="hljs-number">0.9</span>
+<span class="hljs-comment"># xác định hyperparameter weight decay</span>
+weight_decay = <span class="hljs-number">0.0001</span>
+
+<span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> opt
+sgd = opt.SGD(lr=lr, momentum=momentum, weight_decay=weight_decay)
+</code></pre>
+<ol start="2">
+<li>RMSProp</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-comment"># xác định hyperparameter learning rate</span>
+lr = <span class="hljs-number">0.001</span>
+<span class="hljs-comment"># xác định hyperparameter rho</span>
+rho = <span class="hljs-number">0.9</span>
+<span class="hljs-comment"># xác định hyperparameter epsilon</span>
+epsilon = <span class="hljs-number">1e-8</span>
+<span class="hljs-comment"># xác định hyperparameter weight decay</span>
+weight_decay = <span class="hljs-number">0.0001</span>
+
+<span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> opt
+sgd = opt.RMSProp(lr=lr, rho=rho, epsilon=epsilon, weight_decay=weight_decay)
+</code></pre>
+<ol start="3">
+<li>AdaGrad</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-comment"># xác định hyperparameter learning rate</span>
+lr = <span class="hljs-number">0.001</span>
+<span class="hljs-comment"># xác định hyperparameter epsilon</span>
+epsilon = <span class="hljs-number">1e-8</span>
+<span class="hljs-comment"># xác định hyperparameter weight decay</span>
+weight_decay = <span class="hljs-number">0.0001</span>
+
+<span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> opt
+sgd = opt.AdaGrad(lr=lr, epsilon=epsilon, weight_decay=weight_decay)
+</code></pre>
+<ol start="4">
+<li>Adam</li>
+</ol>
+<pre><code class="hljs css language-python"><span class="hljs-comment"># xác định hyperparameter learning rate</span>
+lr = <span class="hljs-number">0.001</span>
+<span class="hljs-comment"># xác định hyperparameter beta 1</span>
+beta_1= <span class="hljs-number">0.9</span>
+<span class="hljs-comment"># xác định hyperparameter beta 2</span>
+beta_1= <span class="hljs-number">0.999</span>
+<span class="hljs-comment"># xác định hyperparameter epsilon</span>
+epsilon = <span class="hljs-number">1e-8</span>
+<span class="hljs-comment"># xác định hyperparameter weight decay</span>
+weight_decay = <span class="hljs-number">0.0001</span>
+
+<span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> opt
+sgd = opt.Adam(lr=lr, beta_1=beta_1, beta_2=beta_2, epsilon=epsilon, weight_decay=weight_decay)
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="tạo-decay-scheduler"></a><a href="#tạo-decay-scheduler" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> singa <span class="hljs-keyword">import</span> opt
+
+<span class="hljs-comment"># xác định learning rate ban đầu</span>
+lr_init = <span class="hljs-number">0.001</span>
+<span class="hljs-comment"># xác định rate của decay trong decay scheduler</span>
+decay_rate = <span class="hljs-number">0.95</span>
+<span class="hljs-comment"># xác định learning rate schedule có ở dạng staircase shape</span>
+staircase=<span class="hljs-literal">True</span>
+<span class="hljs-comment"># xác định bước decay của decay scheduler (trong ví dụ này lr giảm sau mỗi 2 bước)</span>
+decay_steps = <span class="hljs-number">2</span>
+
+<span class="hljs-comment"># tạo decay scheduler, schedule của lr trở thành lr_init * (decay_rate ^ (step // decay_steps) )</span>
+lr = opt.ExponentialDecay(<span class="hljs-number">0.1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">0.5</span>, <span class="hljs-literal">True</span>)
+<span class="hljs-comment"># sử dụng lr để tạo một thuật toán tối ưu </span>
+sgd = opt.SGD(lr=lr, momentum=<span class="hljs-number">0.9</span>, weight_decay=<span class="hljs-number">0.0001</span>)
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="sử-dụng-thuật-toán-tối-ưu-trong-model-api"></a><a href="#sử-dụng-thuật-toán-tối-ưu-trong-model-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1  [...]
+<p>Khi tạo mô hình model, cần đính kèm thuật toán tối ưu vào model.</p>
+<pre><code class="hljs css language-python"><span class="hljs-comment"># tạo CNN sử dụng Model API</span>
+model = CNN()
+
+<span class="hljs-comment"># khởi tạo thuật toán tối ưu và đính vào model </span>
+sgd = opt.SGD(lr=<span class="hljs-number">0.005</span>, momentum=<span class="hljs-number">0.9</span>, weight_decay=<span class="hljs-number">1e-5</span>)
+model.set_optimizer(sgd)
+</code></pre>
+<p>Sau đó, khi gọi hàm model, chạy phương pháp <code>train_one_batch</code> để sử dụng thuật toán tối ưu.</p>
+<p>Do vậy, một ví dụ cho lặp lại loop để tối ưu hoá model là:</p>
+<pre><code class="hljs css language-python"><span class="hljs-keyword">for</span> b <span class="hljs-keyword">in</span> range(num_train_batch):
+    <span class="hljs-comment"># tạo mini-batch tiếp theo</span>
+    x, y = ...
+
+    <span class="hljs-comment"># Copy dữ liệu vào tensors đầu vào</span>
+    tx.copy_from_numpy(x)
+    ty.copy_from_numpy(y)
+
+    <span class="hljs-comment"># Train với một batch </span>
+    out, loss = model(tx, ty)
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/autograd"><span class="arrow-prev">← </span><span>Autograd</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/graph"><span>Model</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#tạo-thuật-toán-tối-ưu">Tạo thuật toán tối ưu</a></li><li><a href="#tạo-decay-scheduler">Tạo Decay Scheduler</a></li><li><a [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/security.html b/content/docs/3.1.0_Viet/security.html
new file mode 100644
index 0000000..35ec018
--- /dev/null
+++ b/content/docs/3.1.0_Viet/security.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Bảo Mật · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright ownersh [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/security.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Bảo Mật</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license a [...]
+<p>Người dùng có thể báo cáo vấn đề bảo mật tới
+<a href="mailto:security@singa.apache.org">Mail List của Nhóm SINGA Security</a></p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/issue-tracking"><span class="arrow-prev">← </span><span>Issue Tracking</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/team-list"><span>The SINGA Team</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/singa-logo-squar [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/security/index.html b/content/docs/3.1.0_Viet/security/index.html
new file mode 100644
index 0000000..35ec018
--- /dev/null
+++ b/content/docs/3.1.0_Viet/security/index.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Bảo Mật · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright ownersh [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/security.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Bảo Mật</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license a [...]
+<p>Người dùng có thể báo cáo vấn đề bảo mật tới
+<a href="mailto:security@singa.apache.org">Mail List của Nhóm SINGA Security</a></p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/issue-tracking"><span class="arrow-prev">← </span><span>Issue Tracking</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/team-list"><span>The SINGA Team</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/singa-logo-squar [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/software-stack.html b/content/docs/3.1.0_Viet/software-stack.html
new file mode 100644
index 0000000..ba508d8
--- /dev/null
+++ b/content/docs/3.1.0_Viet/software-stack.html
@@ -0,0 +1,201 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Software Stack · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright  [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/software-stack.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Software Stack</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contribu [...]
+<p>Cấu trúc phần mềm của SINGA bao gồm hai cấp độ chính, cấp thấp backend classes
+và cấp giao diện Python. Hình 1 mô tả chúng cùng với phần cứng. Cấu tạo backend cung
+cấp cấu trúc dữ liệu cơ bản cho các mô hình deep learning, khái quát phần cứng để kế hoạch
+và thực hiện các phép tính, trong khi thành phần
+communication dùng cho distributed training. Giao diện Python tập hợp cấu trúc
+dữ liệu CPP và cung cấp các classes cấp cao bổ sung cho việc train neural
+network, giúp tiện lợi hơn khi thực hiện các mô hình neural network
+phức tạp.</p>
+<p>Sau đây, chúng tôi giới thiệu cấu trúc phần mềm từ dưới lên.</p>
+<p><img src="/docs/assets/singav3.1-sw.png" alt="Cấu trúc phần mềm SINGA V3"> <br/> <strong>Hình 1 - Cấu trúc phần mềm SINGA V3.</strong></p>
+<h2><a class="anchor" aria-hidden="true" id="backend-cấp-thấp"></a><a href="#backend-cấp-thấp" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<h3><a class="anchor" aria-hidden="true" id="device"></a><a href="#device" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
+<p>Mỗi trường hợp <code>Device</code>, hay thiết bị, được tạo ra từ một thiết bị phần cứng,
+v.d GPU hay CPU. <code>Device</code> quản lý bộ nhớ của cấu trúc dữ liệu, và lên kế hoạch
+hoạt động cho việc thực hiện, v.d, trên CUDA streams hay CPU threads.
+Dựa trên phần cứng và ngôn ngữ lập trình của nó, SINGA sử dụng các loại device
+cụ thể sau:</p>
+<ul>
+<li><strong>CudaGPU</strong> tượng trưng cho cạc Nvidia GPU. Đơn vị sử dụng là CUDA
+streams.</li>
+<li><strong>CppCPU</strong> là một CPU thông thường. Đơn vị sử dụng là CPU threads.</li>
+<li><strong>OpenclGPU</strong> là cạc GPU thông thường cho cả Nvidia và AMD. Đơn vị sử dụng là
+CommandQueues. Do OpenCL tương thích với rất nhiều thiết bị phần cứng, như
+FPGA và ARM, OpenclGPU có thể phù hợp với các thiết bị phần cứng khác.</li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="tensor"></a><a href="#tensor" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
+<p>Hàm <code>Tensor</code> class là một array đa chiều, lưu trữ biến models, như hình ảnh đầu vào và
+bản đồ đặc tính của convolution layer.
+Mỗi hàm <code>Tensor</code> (v.d một tensor) được đặt trong một thiết bị, giúp quản lý bộ nhớ của
+tensor và lên kế hoạch (phép tính) việc thực hiện với mỗi tensor. Hầu hết phép toán
+trong machine learning có thể thể hiện (dày hoặc
+mỏng) dựa trên nghĩa và việc sử dụng tensor. Bởi vậy SINGA có thể chạy đa dạng nhiều
+mô hình, bao gồm deep learning và các mô hình machine learning truyền thống khác.</p>
+<h3><a class="anchor" aria-hidden="true" id="hàm-operator"></a><a href="#hàm-operator" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p>Có hai dạng hàm operators cho tensors, đại số tuyến tính (linear algebra) như nhân
+ma trận (matrix multiplication), và các hàm riêng của neural network như convolution
+và pooling. Các hàm đại số tuyến tính được dùng như <code>Tensor</code> functions và được áp dụng
+riêng rẽ với các thiết bị phần cứng khác nhau.</p>
+<ul>
+<li>CppMath (tensor_math_cpp.h) thực hiện hoạt động tensor sử dụng Cpp cho
+CppCPU</li>
+<li>CudaMath (tensor_math_cuda.h) thực hiện hoạt động tensor sử dụng CUDA cho
+CudaGPU</li>
+<li>OpenclMath (tensor_math_opencl.h) thực hiện hoạt động tensor sử dụng
+OpenCL cho OpenclGPU</li>
+</ul>
+<p>Các toán tử neural network cụ thể cũng được sử dụng riêng rẽ như:</p>
+<ul>
+<li>GpuConvFoward (convolution.h) thực hiện hàm forward function của convolution
+qua CuDNN trên Nvidia GPU.</li>
+<li>CpuConvForward (convolution.h) thực hiện hàm forward function của convolution
+qua CPP trên CPU.</li>
+</ul>
+<p>Thông thường, người dùng tạo một hàm <code>Device</code> và sử dụng nó để tạo ra các hàm
+<code>Tensor</code>. Khi gọi chức năng Tensor hoặc dùng trong neural network, việc thực hiện
+tương ứng cho thiết bị sử dụng sẽ được gọi. Nói cách khác, việc áp dụng các toán tử
+là rõ ràng với người dùng.</p>
+<p>Việc dùng Tensor và Device có thể được áp dụng rộng hơn cho đa dạng thiết bị phần cứng<br>
+sử dụng ngôn ngữ lập trình. Mỗi thiết bị phần cứng mới sẽ được hỗ trợ bằng cách thêm một
+Device subclass mới và việc áp dụng tương ứng với các toán tử operators.</p>
+<p>Tối ưu hoá cho tốc độ và bộ nhớ được thực hiện bởi <code>Scheduler</code> và
+<code>MemPool</code> của <code>Device</code>. Ví dụ, <code>Scheduler</code> tạo ra một
+<a href="./graph">computational graph</a> dựa theo thư viện chương trình của toán tử operators.
+Sau đó nó có thể tối ưu lệnh thực hiện của toán tử trong bộ nhớ chia sẻ và song song.</p>
+<h3><a class="anchor" aria-hidden="true" id="communicator"></a><a href="#communicator" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p><code>Communicator</code> là để hỗ trợ <a href="./dist-train">distributed training</a>. Nó áp dụng
+communication protocols sử dụng sockets, MPI và NCCL. Thường người dùng chỉ cần gọi
+APIs cấp cao  như <code>put()</code> và <code>get()</code> để gửi và nhận tensors.
+Tối ưu hoá Communication cho cấu trúc liên kết, kích cỡ tin nhắn, v.v được thực hiện
+nội bộ.</p>
+<h2><a class="anchor" aria-hidden="true" id="giao-diện-python"></a><a href="#giao-diện-python" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<p>Tất cả thành phần backend được thể hiện dạng Python modules thông qua SWIG. Thêm vào đó,
+các classes sau được thêm vào để hỗ trợ việc áp dụng cho các
+networks phức tạp.</p>
+<h3><a class="anchor" aria-hidden="true" id="opt"></a><a href="#opt" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
+<p><code>Opt</code> và các lớp con áp dụng phương pháp (như SGD) để cập nhật các giá trị tham số
+model sử dụng tham số gradients. Một lớp con <a href="./dist-train">DistOpt</a>
+đồng bộ gradients qua các workers trong distributed training bằng cách gọi phương
+pháp từ <code>Communicator</code>.</p>
+<h3><a class="anchor" aria-hidden="true" id="hàm-operator-1"></a><a href="#hàm-operator-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>Hàm <code>Operator</code> gói nhiều functions khác nhau sử dụng toán tử Tensor hoặc neural
+network từ backend. Ví dụ, hàm forward function và
+backward function <code>ReLU</code> tạo ra toán tử <code>ReLU</code> operator.</p>
+<h3><a class="anchor" aria-hidden="true" id="layer"></a><a href="#layer" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
+<p><code>Layer</code> và các lớp con gói các toán tử operators bằng tham số. Ví dụ,
+convolution và linear operators có tham số weight và bias parameters.
+Tham số được duy trì bởi các lớp <code>Layer</code> tương ứng.</p>
+<h3><a class="anchor" aria-hidden="true" id="autograd"></a><a href="#autograd" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p><a href="./autograd">Autograd</a> sử dụng
+<a href="https://rufflewind.com/2016-12-30/reverse-mode-automatic-differentiation">reverse-mode automatic differentiation</a>
+bằng cách ghi nhớ hoạt động của hàm forward functions của các toán tử rồi tự
+động gọi hàm backward functions ở chiều ngược lại. Tất cả các hàm functions có thể được
+hỗ trợ bởi <code>Scheduler</code> để tạo ra một <a href="./graph">computational graph</a> nhằm tối ưu hoá hiệu
+quả và bộ nhớ.</p>
+<h3><a class="anchor" aria-hidden="true" id="model"></a><a href="#model" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
+<p><a href="./graph">Model</a> cung cấp giao diện cơ bản để thực hiện các mô hình models mới.
+Bạn chỉ cần dùng <code>Model</code> và định nghĩa việc thực hiện forward propagation của model bằng cách
+tạo và gọi các layers của toán tử. <code>Model</code> sẽ thực hiện autograd và tự động cập nhật tham số
+thông qua <code>Opt</code> trong khi dữ liệu để training được bơm vào đó.  Với <code>Model</code> API, SINGA có
+nhiều lợi thế trong cả lập trình mệnh lệnh và lập trình khai báo. Người dùng sử dụng một hệ thống
+sử dụng <a href="./graph">Model</a> API theo dạng lập trình mệnh lệnh như PyTorch. Khác với
+PyTorch tạo lại phép thực thi operations ở mỗi vòng lặp, SINGA hỗ trợ phép thực thi qua cách
+tạo một computational graph hàm súc (khi tính năng này được sử dụng) sau vòng lặp đầu tiên.
+Graph tương tự như đã được tạo bởi các thư viện sử dụng lập trình khai báo, như TensorFlow.
+Vì thế, SINGA có thể áp dụng các kĩ thuật tối ưu hoá bộ nhớ và tốc độ qua computational graph.</p>
+<h3><a class="anchor" aria-hidden="true" id="onnx"></a><a href="#onnx" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
+<p>Để hỗ trợ ONNX, SINGA áp dụng một <a href="./onnx">sonnx</a> module, bao gồm:</p>
+<ul>
+<li>SingaFrontend để lưu SINGA model ở định dạng onnx.</li>
+<li>SingaBackend để tải model định dạng onnx sang SINGA cho training và
+inference.</li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/installation"><span class="arrow-prev">← </span><span>Installation</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/examples"><span>Examples</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#backend-cấp-thấp">Backend cấp thấp</a><ul class="toc-headings"><li><a href="#device">Device</a></li><li><a h [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/software-stack/index.html b/content/docs/3.1.0_Viet/software-stack/index.html
new file mode 100644
index 0000000..ba508d8
--- /dev/null
+++ b/content/docs/3.1.0_Viet/software-stack/index.html
@@ -0,0 +1,201 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Software Stack · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright  [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/software-stack.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Software Stack</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contribu [...]
+<p>Cấu trúc phần mềm của SINGA bao gồm hai cấp độ chính, cấp thấp backend classes
+và cấp giao diện Python. Hình 1 mô tả chúng cùng với phần cứng. Cấu tạo backend cung
+cấp cấu trúc dữ liệu cơ bản cho các mô hình deep learning, khái quát phần cứng để kế hoạch
+và thực hiện các phép tính, trong khi thành phần
+communication dùng cho distributed training. Giao diện Python tập hợp cấu trúc
+dữ liệu CPP và cung cấp các classes cấp cao bổ sung cho việc train neural
+network, giúp tiện lợi hơn khi thực hiện các mô hình neural network
+phức tạp.</p>
+<p>Sau đây, chúng tôi giới thiệu cấu trúc phần mềm từ dưới lên.</p>
+<p><img src="/docs/assets/singav3.1-sw.png" alt="Cấu trúc phần mềm SINGA V3"> <br/> <strong>Hình 1 - Cấu trúc phần mềm SINGA V3.</strong></p>
+<h2><a class="anchor" aria-hidden="true" id="backend-cấp-thấp"></a><a href="#backend-cấp-thấp" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<h3><a class="anchor" aria-hidden="true" id="device"></a><a href="#device" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
+<p>Mỗi trường hợp <code>Device</code>, hay thiết bị, được tạo ra từ một thiết bị phần cứng,
+v.d GPU hay CPU. <code>Device</code> quản lý bộ nhớ của cấu trúc dữ liệu, và lên kế hoạch
+hoạt động cho việc thực hiện, v.d, trên CUDA streams hay CPU threads.
+Dựa trên phần cứng và ngôn ngữ lập trình của nó, SINGA sử dụng các loại device
+cụ thể sau:</p>
+<ul>
+<li><strong>CudaGPU</strong> tượng trưng cho cạc Nvidia GPU. Đơn vị sử dụng là CUDA
+streams.</li>
+<li><strong>CppCPU</strong> là một CPU thông thường. Đơn vị sử dụng là CPU threads.</li>
+<li><strong>OpenclGPU</strong> là cạc GPU thông thường cho cả Nvidia và AMD. Đơn vị sử dụng là
+CommandQueues. Do OpenCL tương thích với rất nhiều thiết bị phần cứng, như
+FPGA và ARM, OpenclGPU có thể phù hợp với các thiết bị phần cứng khác.</li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="tensor"></a><a href="#tensor" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
+<p>Hàm <code>Tensor</code> class là một array đa chiều, lưu trữ biến models, như hình ảnh đầu vào và
+bản đồ đặc tính của convolution layer.
+Mỗi hàm <code>Tensor</code> (v.d một tensor) được đặt trong một thiết bị, giúp quản lý bộ nhớ của
+tensor và lên kế hoạch (phép tính) việc thực hiện với mỗi tensor. Hầu hết phép toán
+trong machine learning có thể thể hiện (dày hoặc
+mỏng) dựa trên nghĩa và việc sử dụng tensor. Bởi vậy SINGA có thể chạy đa dạng nhiều
+mô hình, bao gồm deep learning và các mô hình machine learning truyền thống khác.</p>
+<h3><a class="anchor" aria-hidden="true" id="hàm-operator"></a><a href="#hàm-operator" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p>Có hai dạng hàm operators cho tensors, đại số tuyến tính (linear algebra) như nhân
+ma trận (matrix multiplication), và các hàm riêng của neural network như convolution
+và pooling. Các hàm đại số tuyến tính được dùng như <code>Tensor</code> functions và được áp dụng
+riêng rẽ với các thiết bị phần cứng khác nhau.</p>
+<ul>
+<li>CppMath (tensor_math_cpp.h) thực hiện hoạt động tensor sử dụng Cpp cho
+CppCPU</li>
+<li>CudaMath (tensor_math_cuda.h) thực hiện hoạt động tensor sử dụng CUDA cho
+CudaGPU</li>
+<li>OpenclMath (tensor_math_opencl.h) thực hiện hoạt động tensor sử dụng
+OpenCL cho OpenclGPU</li>
+</ul>
+<p>Các toán tử neural network cụ thể cũng được sử dụng riêng rẽ như:</p>
+<ul>
+<li>GpuConvFoward (convolution.h) thực hiện hàm forward function của convolution
+qua CuDNN trên Nvidia GPU.</li>
+<li>CpuConvForward (convolution.h) thực hiện hàm forward function của convolution
+qua CPP trên CPU.</li>
+</ul>
+<p>Thông thường, người dùng tạo một hàm <code>Device</code> và sử dụng nó để tạo ra các hàm
+<code>Tensor</code>. Khi gọi chức năng Tensor hoặc dùng trong neural network, việc thực hiện
+tương ứng cho thiết bị sử dụng sẽ được gọi. Nói cách khác, việc áp dụng các toán tử
+là rõ ràng với người dùng.</p>
+<p>Việc dùng Tensor và Device có thể được áp dụng rộng hơn cho đa dạng thiết bị phần cứng<br>
+sử dụng ngôn ngữ lập trình. Mỗi thiết bị phần cứng mới sẽ được hỗ trợ bằng cách thêm một
+Device subclass mới và việc áp dụng tương ứng với các toán tử operators.</p>
+<p>Tối ưu hoá cho tốc độ và bộ nhớ được thực hiện bởi <code>Scheduler</code> và
+<code>MemPool</code> của <code>Device</code>. Ví dụ, <code>Scheduler</code> tạo ra một
+<a href="./graph">computational graph</a> dựa theo thư viện chương trình của toán tử operators.
+Sau đó nó có thể tối ưu lệnh thực hiện của toán tử trong bộ nhớ chia sẻ và song song.</p>
+<h3><a class="anchor" aria-hidden="true" id="communicator"></a><a href="#communicator" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p><code>Communicator</code> là để hỗ trợ <a href="./dist-train">distributed training</a>. Nó áp dụng
+communication protocols sử dụng sockets, MPI và NCCL. Thường người dùng chỉ cần gọi
+APIs cấp cao  như <code>put()</code> và <code>get()</code> để gửi và nhận tensors.
+Tối ưu hoá Communication cho cấu trúc liên kết, kích cỡ tin nhắn, v.v được thực hiện
+nội bộ.</p>
+<h2><a class="anchor" aria-hidden="true" id="giao-diện-python"></a><a href="#giao-diện-python" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<p>Tất cả thành phần backend được thể hiện dạng Python modules thông qua SWIG. Thêm vào đó,
+các classes sau được thêm vào để hỗ trợ việc áp dụng cho các
+networks phức tạp.</p>
+<h3><a class="anchor" aria-hidden="true" id="opt"></a><a href="#opt" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
+<p><code>Opt</code> và các lớp con áp dụng phương pháp (như SGD) để cập nhật các giá trị tham số
+model sử dụng tham số gradients. Một lớp con <a href="./dist-train">DistOpt</a>
+đồng bộ gradients qua các workers trong distributed training bằng cách gọi phương
+pháp từ <code>Communicator</code>.</p>
+<h3><a class="anchor" aria-hidden="true" id="hàm-operator-1"></a><a href="#hàm-operator-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>Hàm <code>Operator</code> gói nhiều functions khác nhau sử dụng toán tử Tensor hoặc neural
+network từ backend. Ví dụ, hàm forward function và
+backward function <code>ReLU</code> tạo ra toán tử <code>ReLU</code> operator.</p>
+<h3><a class="anchor" aria-hidden="true" id="layer"></a><a href="#layer" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
+<p><code>Layer</code> và các lớp con gói các toán tử operators bằng tham số. Ví dụ,
+convolution và linear operators có tham số weight và bias parameters.
+Tham số được duy trì bởi các lớp <code>Layer</code> tương ứng.</p>
+<h3><a class="anchor" aria-hidden="true" id="autograd"></a><a href="#autograd" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p><a href="./autograd">Autograd</a> sử dụng
+<a href="https://rufflewind.com/2016-12-30/reverse-mode-automatic-differentiation">reverse-mode automatic differentiation</a>
+bằng cách ghi nhớ hoạt động của hàm forward functions của các toán tử rồi tự
+động gọi hàm backward functions ở chiều ngược lại. Tất cả các hàm functions có thể được
+hỗ trợ bởi <code>Scheduler</code> để tạo ra một <a href="./graph">computational graph</a> nhằm tối ưu hoá hiệu
+quả và bộ nhớ.</p>
+<h3><a class="anchor" aria-hidden="true" id="model"></a><a href="#model" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
+<p><a href="./graph">Model</a> cung cấp giao diện cơ bản để thực hiện các mô hình models mới.
+Bạn chỉ cần dùng <code>Model</code> và định nghĩa việc thực hiện forward propagation của model bằng cách
+tạo và gọi các layers của toán tử. <code>Model</code> sẽ thực hiện autograd và tự động cập nhật tham số
+thông qua <code>Opt</code> trong khi dữ liệu để training được bơm vào đó.  Với <code>Model</code> API, SINGA có
+nhiều lợi thế trong cả lập trình mệnh lệnh và lập trình khai báo. Người dùng sử dụng một hệ thống
+sử dụng <a href="./graph">Model</a> API theo dạng lập trình mệnh lệnh như PyTorch. Khác với
+PyTorch tạo lại phép thực thi operations ở mỗi vòng lặp, SINGA hỗ trợ phép thực thi qua cách
+tạo một computational graph hàm súc (khi tính năng này được sử dụng) sau vòng lặp đầu tiên.
+Graph tương tự như đã được tạo bởi các thư viện sử dụng lập trình khai báo, như TensorFlow.
+Vì thế, SINGA có thể áp dụng các kĩ thuật tối ưu hoá bộ nhớ và tốc độ qua computational graph.</p>
+<h3><a class="anchor" aria-hidden="true" id="onnx"></a><a href="#onnx" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
+<p>Để hỗ trợ ONNX, SINGA áp dụng một <a href="./onnx">sonnx</a> module, bao gồm:</p>
+<ul>
+<li>SingaFrontend để lưu SINGA model ở định dạng onnx.</li>
+<li>SingaBackend để tải model định dạng onnx sang SINGA cho training và
+inference.</li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.1.0_Viet/installation"><span class="arrow-prev">← </span><span>Installation</span></a><a class="docs-next button" href="/docs/3.1.0_Viet/examples"><span>Examples</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#backend-cấp-thấp">Backend cấp thấp</a><ul class="toc-headings"><li><a href="#device">Device</a></li><li><a h [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '45202133606c0b5fa6d21cddc4725dd8',
+                indexName: 'apache_singa',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/content/docs/3.1.0_Viet/source-repository.html b/content/docs/3.1.0_Viet/source-repository.html
new file mode 100644
index 0000000..d5f3f6d
--- /dev/null
+++ b/content/docs/3.1.0_Viet/source-repository.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Source Repository · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyrig [...]
+        document.addEventListener('DOMContentLoaded', function() {
+          addBackToTop(
+            {"zIndex":100}
+          )
+        });
+        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.1.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-i [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/source-repository.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Source Repository</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more co [...]
+<p>Dự án này sử dụng <a href="http://git-scm.com/">Git</a> để quản lý nguồn mã code (source code).
+Hướng dẫn sử dụng Git xem tại <a href="http://git-scm.com/documentation">http://git-scm.com/documentation</a> .</p>
+<h2><a class="anchor" aria-hidden="true" id="repository"></a><a href="#repository" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>Các đường dẫn sau tới repository của nguồn code online.</p>
+<ul>
+<li><a href="https://gitbox.apache.org/repos/asf?p=singa.git">https://gitbox.apache.org/repos/asf?p=singa.git</a></li>
+</ul>
+<p>Bản Github mirror tại</p>
+<ul>
+<li><a href="https://github.com/apache/singa">https://github.com/apache/singa</a></li>
+</ul>
+<p>Mã code có thể cloned từ cả hai repo, vd.,</p>
+<pre><code class="hljs">git clone https://github.com/apache/singa.git
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-next button" href="/docs/3.1.0_Viet/mail-lists"><span>Project Mailing Lists</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#repository">Repository</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/singa-logo-square.png" alt="Apache SINGA" width="66" height="58"/ [...]
+   The Apache Software Foundation. All rights reserved.
+   Apache SINGA, Apache, the Apache feather logo, and
+   the Apache SINGA project logos are trademarks of The
+   Apache Software Foundation. All other marks mentioned
+   may be trademarks or registered trademarks of their
+   respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter- [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
... 2435 lines suppressed ...