diff --git a/examples/onnx/159008.jpg b/examples/onnx/159008.jpg
new file mode 100644
index 0000000..2b90845
--- /dev/null
+++ b/examples/onnx/159008.jpg
Binary files differ
diff --git a/examples/onnx/superresolution.py b/examples/onnx/superresolution.py
new file mode 100644
index 0000000..1a6b35b
--- /dev/null
+++ b/examples/onnx/superresolution.py
@@ -0,0 +1,104 @@
+#
+# 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.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under th
+
+import os
+import numpy as np
+from PIL import Image
+from resizeimage import resizeimage
+
+from singa import device
+from singa import tensor
+from singa import autograd
+from singa import sonnx
+import onnx
+from utils import download_model, update_batch_size
+
+import logging
+logging.basicConfig(level=logging.INFO, format='%(asctime)-15s %(message)s')
+
+
+def preprocess(img):
+    img = resizeimage.resize_cover(img, [224,224], validate=False)
+    img_ycbcr = img.convert('YCbCr')
+    img_y_0, img_cb, img_cr = img_ycbcr.split()
+    img_ndarray = np.asarray(img_y_0)
+    img_4 = np.expand_dims(np.expand_dims(img_ndarray, axis=0), axis=0)
+    img_5 = img_4.astype(np.float32) / 255.0
+    return img_5, img_cb, img_cr
+
+def get_image():
+    # download image
+    image_url = './159008.jpg'
+    img = Image.open(image_url)
+    return img
+
+class Infer:
+
+    def __init__(self, sg_ir):
+        self.sg_ir = sg_ir
+        for idx, tens in sg_ir.tensor_map.items():
+            # allow the tensors to be updated
+            tens.requires_grad = True
+            tens.stores_grad = True
+            sg_ir.tensor_map[idx] = tens
+
+    def forward(self, x):
+        return sg_ir.run([x])[0]
+
+
+if __name__ == "__main__":
+
+    url = 'https://github.com/onnx/models/raw/master/vision/super_resolution/sub_pixel_cnn_2016/model/super-resolution-10.tar.gz'
+    download_dir = '/tmp/'
+    model_path = os.path.join(download_dir, 'super_resolution', 'super_resolution.onnx')
+
+    logging.info("onnx load model...")
+    download_model(url)
+    onnx_model = onnx.load(model_path)
+
+    # set batch size
+    onnx_model = update_batch_size(onnx_model, 1)
+
+    # prepare the model
+    logging.info("prepare model...")
+    dev = device.get_default_device()
+    sg_ir = sonnx.prepare(onnx_model, device=dev)
+    autograd.training = False
+    model = Infer(sg_ir)
+
+    # preprocess
+    logging.info("preprocessing...")
+    img = get_image()
+    img_y, img_cb, img_cr = preprocess(img)
+    
+    # inference
+    logging.info("model running...")
+    x_batch = tensor.Tensor(device=dev, data=img_y)
+    img_y = model.forward(x_batch)
+    array_img_y = tensor.to_numpy(img_y)
+    img_out_y = Image.fromarray(np.uint8((array_img_y[0] * 255.0).clip(0, 255)[0]), mode='L')
+    
+    # postprocess
+    logging.info("postprocessing...")
+    final_img = Image.merge(
+        "YCbCr", [
+            img_out_y,
+            img_cb.resize(img_out_y.size, Image.BICUBIC),
+            img_cr.resize(img_out_y.size, Image.BICUBIC),
+        ]).convert("RGB")
+    final_img.show()
