What's the difference between tvm.relay.optimize() and tvm.transform.Sequential()

I am a rookie in TVM, and when I try to optimize the IRModule of TVM, I found two approaches: (1) use tvm.relay.optimize() to automatically optimize or (2) self-define a Pass using transform.Sequential() optimize with it. I wonder the difference between these 2 approaches. Thank you in advance!!