diff --git a/examples/onnx/159008.jpg b/examples/onnx/159008.jpg
deleted file mode 100644
index 2b90845..0000000
--- a/examples/onnx/159008.jpg
+++ /dev/null
Binary files differ
diff --git a/examples/onnx/superresolution.py b/examples/onnx/superresolution.py
index 1a6b35b..0e752ba 100644
--- a/examples/onnx/superresolution.py
+++ b/examples/onnx/superresolution.py
@@ -19,21 +19,21 @@
 import os
 import numpy as np
 from PIL import Image
+# pip install python-resize-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
+from utils import download_model, check_exist_or_download
 
 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 = 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)
@@ -41,64 +41,65 @@
     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)
+    image_url = 'https://s3.amazonaws.com/model-server/inputs/kitten.jpg'
+    img = Image.open(check_exist_or_download(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
+class MyModel(sonnx.SONNXModel):
 
-    def forward(self, x):
-        return sg_ir.run([x])[0]
+    def __init__(self, onnx_model):
+        super(MyModel, self).__init__(onnx_model)
+
+    def forward(self, *x):
+        y = super(MyModel, self).forward(*x)
+        return y[0]
+
+    def train_one_batch(self, x, y):
+        pass
 
 
 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')
+    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)
-    
+    # sg_ir = sonnx.prepare(onnx_model) # run without graph
+    # y = sg_ir.run([img])
+
+    logging.info("model compling...")
+    dev = device.create_cuda_gpu()
+    x = tensor.PlaceHolder(img_y.shape, device=dev)
+    model = MyModel(onnx_model)
+    model.compile([x], is_train=False, use_graph=True, sequential=True)
+
     # 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')
-    
+    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 = 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()
