While virtualization technologies have been widely adopted, virtualizing GPUs remains challenging. In this thesis, we present a GPU virtualization solution based on API remoting, forwarding API calls from guests to the host for execution. Our proposed solution provides guest applications with the Vulkan API, which has been increasingly popular recently, for utilizing GPUs for both rendering and computation. It enables dynamic resource sharing, and is not bound to specific devices. In addition, no modification on the guest OS and applications is required. We also propose several custom optimizations, with the goal of reducing the potential overheads of such a software-based virtualization layer. Our solution is evaluated on workloads with a wide range of native performance. The collected experimental results indicate that our solution achieves up to 98% of native performance on workloads with higher computation load per frame. The results also show that our solution is satisfactory in a variety of use cases.