add tutorial, notebook and API doc for LightningLite (#5114)
* add tutorial, notebook and API doc for LightningLite * increase the timeout when running tutorial notebook * change docs and tutorial to use new API
This commit is contained in:
parent
cda8967416
commit
0f78a568c7
6 changed files with 242 additions and 6 deletions
|
|
@ -49,7 +49,7 @@ BigDL-Nano supports both PyTorch and PyTorch Lightning models and most optimizat
|
|||
|
||||
BigDL-Nano uses a extended version of PyTorch Lightning trainer for integrating our optimizations.
|
||||
|
||||
For example, if you are using a LightingModule, you can use the following code enable intel-extension-for-pytorch and multi-instance training.
|
||||
For example, if you are using a LightingModule, you can use the following code to enable intel-extension-for-pytorch and multi-instance training.
|
||||
|
||||
```python
|
||||
from bigdl.nano.pytorch import Trainer
|
||||
|
|
@ -59,6 +59,19 @@ trainer = Trainer(max_epochs=1, use_ipex=True, num_processes=4)
|
|||
trainer.fit(net, train_loader)
|
||||
```
|
||||
|
||||
If you are using custom training loop, you can use the following code to enable intel-extension-for-pytorch, multi-instance training and other nano's optimizations.
|
||||
|
||||
```python
|
||||
from bigdl.nano.pytorch import TorchNano
|
||||
|
||||
class MyNano(TorchNano):
|
||||
def train(...):
|
||||
# copy your train loop here and make a few changes
|
||||
...
|
||||
|
||||
MyNano(use_ipex=True, num_processes=2).train()
|
||||
```
|
||||
|
||||
For more details on the BigDL-Nano's PyTorch usage, please refer to the [PyTorch Training](../QuickStart/pytorch_train.md) and [PyTorch Inference](../QuickStart/pytorch_inference.md) page.
|
||||
|
||||
### **3.2 TensorFlow**
|
||||
|
|
|
|||
|
|
@ -1,9 +1,17 @@
|
|||
# Nano Tutorial
|
||||
- [**BigDL-Nano PyTorch Training Quickstart**](./pytorch_train_quickstart.html)
|
||||
- [**BigDL-Nano PyTorch Trainer Quickstart**](./pytorch_train_quickstart.html)
|
||||
|
||||
> [View source on GitHub][Nano_pytorch_training]
|
||||
|
||||
In this guide we will describe how to scale out PyTorch programs using Nano
|
||||
In this guide we will describe how to scale out PyTorch programs using Nano Trainer
|
||||
|
||||
---------------------------
|
||||
|
||||
- [**BigDL-Nano PyTorch TorchNano Quickstart**](./pytorch_nano.html)
|
||||
|
||||
> [View source on GitHub][Nano_pytorch_nano]
|
||||
|
||||
In this guide we'll describe how to use BigDL-Nano to accelerate custom training loop easily with very few changes
|
||||
|
||||
---------------------------
|
||||
|
||||
|
|
@ -66,6 +74,7 @@
|
|||
|
||||
|
||||
[Nano_pytorch_training]: <https://github.com/intel-analytics/BigDL/blob/main/python/nano/notebooks/pytorch/tutorial/pytorch_train.ipynb>
|
||||
[Nano_pytorch_nano]: <https://github.com/intel-analytics/BigDL/blob/main/python/nano/notebooks/pytorch/tutorial/pytorch_nano.ipynb>
|
||||
[Nano_pytorch_onnxruntime]: <https://github.com/intel-analytics/BigDL/blob/main/python/nano/notebooks/pytorch/tutorial/pytorch_inference_onnx.ipynb>
|
||||
[Nano_pytorch_openvino]: <https://github.com/intel-analytics/BigDL/blob/main/python/nano/notebooks/pytorch/tutorial/pytorch_inference_openvino.ipynb>
|
||||
[Nano_pytorch_Quantization_inc]: <https://github.com/intel-analytics/BigDL/blob/main/python/nano/notebooks/pytorch/tutorial/pytorch_quantization_inc.ipynb>
|
||||
|
|
|
|||
174
docs/readthedocs/source/doc/Nano/QuickStart/pytorch_nano.md
Normal file
174
docs/readthedocs/source/doc/Nano/QuickStart/pytorch_nano.md
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
# BigDL-Nano Pytorch TorchNano Quickstart
|
||||
|
||||
**In this guide we'll demonstrate how to use BigDL-Nano to accelerate custom train loop easily with very few changes.**
|
||||
|
||||
### **Step 0: Prepare Environment**
|
||||
|
||||
We recommend using [conda](https://docs.conda.io/projects/conda/en/latest/user-guide/install/) to prepare the environment. Please refer to the [install guide](../../UserGuide/python.md) for more details.
|
||||
|
||||
```bash
|
||||
conda create py37 python==3.7.10 setuptools==58.0.4
|
||||
conda activate py37
|
||||
# nightly bulit version
|
||||
pip install --pre --upgrade bigdl-nano[pytorch]
|
||||
# set env variables for your conda environment
|
||||
source bigdl-nano-init
|
||||
```
|
||||
|
||||
### **Step 1: Load the Data**
|
||||
|
||||
Import Cifar10 dataset from torch_vision and modify the train transform. You could access [CIFAR10](https://www.cs.toronto.edu/~kriz/cifar.html) for a view of the whole dataset.
|
||||
|
||||
Leveraging OpenCV and libjpeg-turbo, BigDL-Nano can accelerate computer vision data pipelines by providing a drop-in replacement of torch_vision's `datasets` and `transforms`.
|
||||
|
||||
```python
|
||||
from torch.utils.data import DataLoader, Subset
|
||||
|
||||
from bigdl.nano.pytorch.vision import transforms
|
||||
from bigdl.nano.pytorch.vision.datasets import CIFAR10
|
||||
|
||||
def create_dataloader(data_path, batch_size):
|
||||
train_transform = transforms.Compose([
|
||||
transforms.Resize(256),
|
||||
transforms.ColorJitter(),
|
||||
transforms.RandomCrop(224),
|
||||
transforms.RandomHorizontalFlip(),
|
||||
transforms.Resize(128),
|
||||
transforms.ToTensor()
|
||||
])
|
||||
|
||||
full_dataset = CIFAR10(root=data_path, train=True,
|
||||
download=True, transform=train_transform)
|
||||
|
||||
# use a subset of full dataset to shorten the training time
|
||||
train_dataset = Subset(dataset=full_dataset, indices=list(range(len(full_dataset) // 40)))
|
||||
|
||||
train_loader = DataLoader(train_dataset, batch_size=batch_size,
|
||||
shuffle=True, num_workers=0)
|
||||
|
||||
return train_loader
|
||||
```
|
||||
|
||||
### **Step 2: Define the Model**
|
||||
|
||||
You may define your model in the same way as the standard PyTorch models.
|
||||
|
||||
```python
|
||||
from torch import nn
|
||||
|
||||
from bigdl.nano.pytorch.vision.models import vision
|
||||
|
||||
class ResNet18(nn.Module):
|
||||
def __init__(self, num_classes, pretrained=True, include_top=False, freeze=True):
|
||||
super().__init__()
|
||||
backbone = vision.resnet18(pretrained=pretrained, include_top=include_top, freeze=freeze)
|
||||
output_size = backbone.get_output_size()
|
||||
head = nn.Linear(output_size, num_classes)
|
||||
self.model = nn.Sequential(backbone, head)
|
||||
|
||||
def forward(self, x):
|
||||
return self.model(x)
|
||||
```
|
||||
|
||||
### **Step 3: Define Train Loop**
|
||||
|
||||
Suppose the custom train loop is as follows:
|
||||
|
||||
```python
|
||||
import os
|
||||
import torch
|
||||
|
||||
data_path = os.environ.get("DATA_PATH", ".")
|
||||
batch_size = 256
|
||||
max_epochs = 10
|
||||
lr = 0.01
|
||||
|
||||
model = ResNet18(10, pretrained=False, include_top=False, freeze=True)
|
||||
loss_func = nn.CrossEntropyLoss()
|
||||
optimizer = torch.optim.Adam(model.parameters(), lr=lr)
|
||||
train_loader = create_dataloader(data_path, batch_size)
|
||||
|
||||
model.train()
|
||||
|
||||
for _i in range(max_epochs):
|
||||
total_loss, num = 0, 0
|
||||
for X, y in train_loader:
|
||||
optimizer.zero_grad()
|
||||
loss = loss_func(model(X), y)
|
||||
loss.backward()
|
||||
optimizer.step()
|
||||
|
||||
total_loss += loss.sum()
|
||||
num += 1
|
||||
print(f'avg_loss: {total_loss / num}')
|
||||
```
|
||||
|
||||
The `TorchNano` (`bigdl.nano.pytorch.TorchNano`) class is what we use to accelerate raw pytorch code. By using it, we only need to make very few changes to accelerate custom training loop.
|
||||
|
||||
We only need the following steps:
|
||||
|
||||
- define a class `MyNano` derived from our `TorchNano`
|
||||
- copy all lines of code into the `train` method of `MyNano`
|
||||
- add one line to setup model, optimizer and dataloader
|
||||
- replace the `loss.backward()` with `self.backward(loss)`
|
||||
|
||||
```python
|
||||
import os
|
||||
import torch
|
||||
|
||||
from bigdl.nano.pytorch import TorchNano
|
||||
|
||||
class MyNano(TorchNano):
|
||||
def train(self):
|
||||
# copy all lines of code into this method
|
||||
data_path = os.environ.get("DATA_PATH", ".")
|
||||
batch_size = 256
|
||||
max_epochs = 10
|
||||
lr = 0.01
|
||||
|
||||
model = ResNet18(10, pretrained=False, include_top=False, freeze=True)
|
||||
loss_func = nn.CrossEntropyLoss()
|
||||
optimizer = torch.optim.Adam(model.parameters(), lr=lr)
|
||||
train_loader = create_dataloader(data_path, batch_size)
|
||||
|
||||
# add this line to setup model, optimizer and dataloaders
|
||||
model, optimizer, train_loader = self.setup(model, optimizer, train_loader)
|
||||
|
||||
model.train()
|
||||
|
||||
for _i in range(max_epochs):
|
||||
total_loss, num = 0, 0
|
||||
for X, y in train_loader:
|
||||
optimizer.zero_grad()
|
||||
loss = loss_func(model(X), y)
|
||||
self.backward(loss) # modify this line
|
||||
optimizer.step()
|
||||
|
||||
total_loss += loss.sum()
|
||||
num += 1
|
||||
print(f'avg_loss: {total_loss / num}')
|
||||
```
|
||||
|
||||
### **Step 4: Run with Nano TorchNano**
|
||||
|
||||
```python
|
||||
MyNano().train()
|
||||
```
|
||||
|
||||
At this stage, you may already experience some speedup due to the optimized environment variables set by source bigdl-nano-init. Besides, you can also enable optimizations delivered by BigDL-Nano by setting a paramter or calling a method to accelerate PyTorch application on training workloads.
|
||||
|
||||
#### Increase the number of processes in distributed training to accelerate training.
|
||||
|
||||
```python
|
||||
MyNano(num_processes=2, strategy="subprocess").train()
|
||||
```
|
||||
|
||||
- Note: BigDL-Nano now support 'spawn', 'subprocess' and 'ray' strategies for distributed training, but only the 'subprocess' strategy can be used in interactive environment.
|
||||
|
||||
#### Intel Extension for Pytorch (a.k.a. [IPEX](https://github.com/intel/intel-extension-for-pytorch))
|
||||
|
||||
IPEX extends Pytorch with optimizations on intel hardware. BigDL-Nano also integrates IPEX into the `TorchNano`, you can turn on IPEX optimization by setting `use_ipex=True`.
|
||||
|
||||
```python
|
||||
MyNano(use_ipex=True, num_processes=2, strategy="subprocess").train()
|
||||
```
|
||||
|
|
@ -60,6 +60,38 @@ trainer = Trainer(max_epoch=10, num_processes=4)
|
|||
|
||||
Note that the effective batch size multi-instance training is the `batch_size` in your `dataloader` times `num_processes` so the number of iterations of each epoch will be reduced `num_processes` fold. A common practice to compensate for that is to gradually increase the learning rate to `num_processes` times. You can find more details of this trick in the [Facebook paper](https://arxiv.org/abs/1706.02677).
|
||||
|
||||
### BigDL-Nano PyTorch TorchNano
|
||||
|
||||
The `TorchNano` (`bigdl.nano.pytorch.TorchNano`) class is what we use to accelerate raw pytorch code. By using it, we only need to make very few changes to accelerate custom training loop. For example,
|
||||
|
||||
```python
|
||||
from bigdl.nano.pytorch import TorchNano
|
||||
|
||||
class MyNano(TorchNano) :
|
||||
def train(self, ...):
|
||||
# copy your train loop here and make a few changes
|
||||
|
||||
MyNano().train(...)
|
||||
```
|
||||
|
||||
- note: see [this tutorial](./pytorch_nano.html) for details about our `TorchNano`.
|
||||
|
||||
Our `TorchNano` also integrates IPEX and distributed training optimizations. For example,
|
||||
|
||||
```python
|
||||
from bigdl.nano.pytorch import TorchNano
|
||||
|
||||
class MyNano(TorchNano):
|
||||
def train(self, ...):
|
||||
# define train loop
|
||||
|
||||
# enable IPEX optimizaiton
|
||||
MyNano(use_ipex=True).train(...)
|
||||
|
||||
# enable IPEX and distributed training, using subprocess strategy
|
||||
MyNano(use_ipex=True, num_processes=2, strategy="subprocess").train(...)
|
||||
```
|
||||
|
||||
### Optimized Data pipeline
|
||||
|
||||
Computer Vision task often needs a data processing pipeline that sometimes constitutes a non-trivial part of the whole training pipeline. Leveraging OpenCV and libjpeg-turbo, BigDL-Nano can accelerate computer vision data pipelines by providing a drop-in replacement of torch_vision's `datasets` and `transforms`.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# BigDL-Nano PyTorch Training Quickstart
|
||||
# BigDL-Nano PyTorch Trainer Quickstart
|
||||
|
||||
**In this guide we will describe how to scale out PyTorch programs using Nano in 5 simple steps**
|
||||
**In this guide we will describe how to scale out PyTorch programs using Nano Trainer in 5 simple steps**
|
||||
|
||||
### **Step 0: Prepare Environment**
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,18 @@
|
|||
Nano PyTorch API
|
||||
==================
|
||||
|
||||
bigdl.nano.pytorch
|
||||
bigdl.nano.pytorch.Trainer
|
||||
---------------------------
|
||||
|
||||
.. autoclass:: bigdl.nano.pytorch.Trainer
|
||||
:members:
|
||||
:undoc-members:
|
||||
:exclude-members: accelerator_connector, checkpoint_connector, reload_dataloaders_every_n_epochs, limit_val_batches, logger, logger_connector, state
|
||||
|
||||
bigdl.nano.pytorch.TorchNano
|
||||
---------------------------
|
||||
|
||||
.. autoclass:: bigdl.nano.pytorch.TorchNano
|
||||
:members:
|
||||
:undoc-members:
|
||||
:exclude-members: run
|
||||
|
|
|
|||
Loading…
Reference in a new issue