diff --git a/examples/onnx/superresolution.py b/examples/onnx/superresolution.py
index 1a6b35b..caaae19 100644
--- a/examples/onnx/superresolution.py
+++ b/examples/onnx/superresolution.py
@@ -23,17 +23,16 @@
 
 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 +40,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()
