Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2d0082e16b | |||
| 9583d28ec8 | |||
| 240731f9f8 | |||
| ed94885bc1 | |||
| 85a25ba942 | |||
| 9b26464a4f |
+21
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2023 Lingxi Xie
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
@@ -2,23 +2,103 @@
|
|||||||
|
|
||||||
This is the official repository for the Pangu-Weather paper.
|
This is the official repository for the Pangu-Weather paper.
|
||||||
|
|
||||||
Resources including pseudocode and pre-trained models will be updated. Stay tuned!
|
[Pangu-Weather: A 3D High-Resolution Model for Fast and Accurate Global Weather Forecast](https://arxiv.org/abs/2211.02556), arXiv preprint: 2211.02556, 2022.
|
||||||
|
|
||||||
#### Policy of using the contents
|
by Kaifeng Bi, Lingxi Xie, Hengheng Zhang, Xin Chen, Xiaotao Gu and Qi Tian
|
||||||
|
|
||||||
All models are trained using the ERA5 dataset provided by ECMWF. Please follow their policy and note that commercial use of these models are forbidden.
|
Resources including pseudocode, pre-trained models, and inference code are released.
|
||||||
|
|
||||||
More policy to be updated.
|
## Installation
|
||||||
|
|
||||||
#### Pseudocode and how to use
|
The downloaded files shall be organized as the following hierarchy:
|
||||||
|
|
||||||
To be updated.
|
```plain
|
||||||
|
├── root
|
||||||
|
│ ├── input_data
|
||||||
|
│ │ ├── input_surface.npy
|
||||||
|
│ │ ├── input_upper.npy
|
||||||
|
│ ├── output_data
|
||||||
|
│ ├── model_jit_cpu_1.onnx
|
||||||
|
│ ├── model_jit_cpu_3.onnx
|
||||||
|
│ ├── model_jit_cpu_6.onnx
|
||||||
|
│ ├── model_jit_cpu_24.onnx
|
||||||
|
│ ├── inference_cpu.py
|
||||||
|
│ ├── inference_gpu.py
|
||||||
|
│ ├── inference_iterative.py
|
||||||
|
```
|
||||||
|
|
||||||
#### Pre-trained models
|
If you use a CPU environment, please run:
|
||||||
|
```
|
||||||
|
pip install -r requirement_cpu.txt
|
||||||
|
```
|
||||||
|
|
||||||
To be updated.
|
If you use a GPU environment, please first confirm that the cuda version is 11.6 and the cudnn version is the 8.2.4 for Linux and 8.5.0.96 for Windows (please see [this page](https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html) for details). Then, please run:
|
||||||
|
```
|
||||||
|
pip install -r requirement_gpu.txt
|
||||||
|
```
|
||||||
|
|
||||||
#### References
|
## Global weather forecasting (inference) using the trained models
|
||||||
|
|
||||||
|
#### Downloading trained models
|
||||||
|
|
||||||
|
Please download the four pre-trained models (~1.1GB each) from the Google drive:
|
||||||
|
|
||||||
|
The 1-hour model: [model_jit_cpu_1.onnx](https://drive.google.com/file/d/1fg5jkiN_5dHzKb-5H9Aw4MOmfILmeY-S/view?usp=share_link)
|
||||||
|
|
||||||
|
The 3-hour model: [model_jit_cpu_3.onnx](https://drive.google.com/file/d/1EdoLlAXqE9iZLt9Ej9i-JW9LTJ9Jtewt/view?usp=share_link)
|
||||||
|
|
||||||
|
The 6-hour model: [model_jit_cpu_6.onnx](https://drive.google.com/file/d/1a4XTktkZa5GCtjQxDJb_fNaqTAUiEJu4/view?usp=share_link)
|
||||||
|
|
||||||
|
The 24-hour model: [model_jit_cpu_24.onnx](https://drive.google.com/file/d/1lweQlxcn9fG0zKNW8ne1Khr9ehRTI6HP/view?usp=share_link)
|
||||||
|
|
||||||
|
These models are stored using the ONNX format, and thus can be used via different languages such as Python, C++, C#, Java, etc.
|
||||||
|
|
||||||
|
#### Input data preparation using Python
|
||||||
|
|
||||||
|
Please prepare the input data using [numpy](https://numpy.org/). There are two files that shall be put under the `input_data` folder, namely, `input_surface.npy` and `input_upper.npy`.
|
||||||
|
|
||||||
|
`input_surface.npy` stores the input surface variables. It is a numpy array shaped (4,721,1440) where the first dimension represents the 4 surface variables (MSLP, U10, V10, T2M *in the exact order*).
|
||||||
|
|
||||||
|
`input_upper.npy` stores the upper-air variables. It is a numpy array shaped (5,13,721,1440) where the first dimension represents the 5 surface variables (Z, Q, T, U and V *in the exact order*), and the second dimension represents the 13 pressure levels (1000hPa, 925hPa, 850hPa, 700hPa, 600hPa, 500hPa, 400hPa, 300hPa, 250hPa, 200hPa, 150hPa, 100hPa and 50hPa *in the exact order*).
|
||||||
|
|
||||||
|
In both cases, the dimensions of 721 and 1440 represent the size along the latitude and longitude, where the numerical range is [90,-90] degree and [0,359.75] degree, respectively, and the spacing is 0.25 degrees. For each 721x1440 slice, the data format is exactly the same as the `.nc` file download from the ERA5 official website.
|
||||||
|
|
||||||
|
Note that the numpy arrays should be in single precision (`.astype(np.float32)`), not in double precision.
|
||||||
|
|
||||||
|
We support ERA5 initial fields and ECMWF initial fields (e.g., the initial fields of the HRES forecast), where the latter often leads to a slight accuracy drop (mainly for T2M because the two fields are quite different in temperature). A `.nc` file of ERA5 can be transformed into a `.npy` file using the netCDF4 package, and a `.grib` file of the ECMWF initial fields can be transformed into a `.npy` file using the pygrib package. Note that Z represents geopotential, not geopotential height, so a factor of 9.80665 should be multiplied if the raw data contains the geopotential height.
|
||||||
|
|
||||||
|
We temporarily do not support other kinds of initial fields due to the possibly dramatic differences in the fields when Z<0.
|
||||||
|
|
||||||
|
We provide an example of transferred input files, `input_surface.npy` and `input_upper.npy`, which correspond to the ERA5 initial fields of at 12:00UTC, 2018/09/27. Please download them using Google drive:
|
||||||
|
|
||||||
|
[`input_surface.npy`](https://drive.google.com/file/d/1pj8QEVNpC1FyJfUabDpV4oU3NpSe0BkD/view?usp=share_link)
|
||||||
|
|
||||||
|
[`input_upper.npy`](https://drive.google.com/file/d/1--7xEBJt79E3oixizr8oFmK_haDE77SS/view?usp=share_link)
|
||||||
|
|
||||||
|
#### Inference
|
||||||
|
|
||||||
|
After the above steps are finished, please check `inference_cpu.py` for an example of making a 24-hour weather forecast on CPU with the 24-hour model, and `inference_gpu.py` for the GPU version.
|
||||||
|
|
||||||
|
For example, running the following command, one can get the 24-hour forecast in the `output_data` folder:
|
||||||
|
```
|
||||||
|
python inference_cpu.py # python inference_gpu.py for gpu environment
|
||||||
|
```
|
||||||
|
|
||||||
|
Also, `inference_iterative.py` shows an example to generate per-6-hour forecast within a week.
|
||||||
|
|
||||||
|
## Pseudocode and how to use
|
||||||
|
|
||||||
|
`pseudocode.py` contains the pseudocode that elaborates our main algorithm. It is written in Python and can be implemented using any deep learning library, e.g. PyTorch and TensorFlow.
|
||||||
|
|
||||||
|
Note that one needs to download about 60TB of ERA5 data and prepare for computational resource of 3000 GPU-days (in V100) to train each model.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Pangu-Weather is released under the MIT license.
|
||||||
|
|
||||||
|
Also, please note that all models were trained using the ERA5 dataset provided by ECMWF. Please do follow their policy and note that commercial use of these models is forbidden.
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
If you use the resource in your research, please cite our paper:
|
If you use the resource in your research, please cite our paper:
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
import os
|
||||||
|
import numpy as np
|
||||||
|
import onnx
|
||||||
|
import onnxruntime as ort
|
||||||
|
|
||||||
|
|
||||||
|
# The directory of your input and output data
|
||||||
|
input_data_dir = 'input_data'
|
||||||
|
output_data_dir = 'output_data'
|
||||||
|
model_24 = onnx.load('pangu_weather_24.onnx')
|
||||||
|
|
||||||
|
# Set the behavier of onnxruntime
|
||||||
|
options = ort.SessionOptions()
|
||||||
|
options.enable_cpu_mem_arena=False
|
||||||
|
options.enable_mem_pattern = False
|
||||||
|
options.enable_mem_reuse = False
|
||||||
|
# Increase the number for faster inference and more memory consumption
|
||||||
|
options.intra_op_num_threads = 1
|
||||||
|
|
||||||
|
# Set the behavier of cuda provider
|
||||||
|
cuda_provider_options = {'arena_extend_strategy':'kSameAsRequested',}
|
||||||
|
|
||||||
|
# Initialize onnxruntime session for Pangu-Weather Models
|
||||||
|
ort_session_24 = ort.InferenceSession('pangu_weather_24.onnx', sess_options=options, provider=['CPUExecutionProvider'])
|
||||||
|
|
||||||
|
# Load the upper-air numpy arrays
|
||||||
|
input = np.load(os.path.join(input_data_dir, 'input_upper.npy')).astype(np.float32)
|
||||||
|
# Load the surface numpy arrays
|
||||||
|
input_surface = np.load(os.path.join(input_data_dir, 'input_surface.npy')).astype(np.float32)
|
||||||
|
|
||||||
|
# Run the inference session
|
||||||
|
output, output_surface = ort_session_24.run(None, {'input':input, 'input_surface':input_surface})
|
||||||
|
|
||||||
|
# Save the results
|
||||||
|
np.save(os.path.join(output_data_dir, 'output_upper'), output)
|
||||||
|
np.save(os.path.join(output_data_dir, 'output_surface'), output_surface)
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
import os
|
||||||
|
import numpy as np
|
||||||
|
import onnx
|
||||||
|
import onnxruntime as ort
|
||||||
|
|
||||||
|
|
||||||
|
# The directory of your input and output data
|
||||||
|
input_data_dir = 'input_data'
|
||||||
|
output_data_dir = 'output_data'
|
||||||
|
model_24 = onnx.load('pangu_weather_24.onnx')
|
||||||
|
|
||||||
|
# Set the behavier of onnxruntime
|
||||||
|
options = ort.SessionOptions()
|
||||||
|
options.enable_cpu_mem_arena=False
|
||||||
|
options.enable_mem_pattern = False
|
||||||
|
options.enable_mem_reuse = False
|
||||||
|
# Increase the number for faster inference and more memory consumption
|
||||||
|
options.intra_op_num_threads = 1
|
||||||
|
|
||||||
|
# Set the behavier of cuda provider
|
||||||
|
cuda_provider_options = {'arena_extend_strategy':'kSameAsRequested',}
|
||||||
|
|
||||||
|
# Initialize onnxruntime session for Pangu-Weather Models
|
||||||
|
ort_session_24 = ort.InferenceSession('pangu_weather_24.onnx', sess_options=options, provider=[('CUDAExecutionProvider', cuda_provider_options)])
|
||||||
|
|
||||||
|
# Load the upper-air numpy arrays
|
||||||
|
input = np.load(os.path.join(input_data_dir, 'input_upper.npy')).astype(np.float32)
|
||||||
|
# Load the surface numpy arrays
|
||||||
|
input_surface = np.load(os.path.join(input_data_dir, 'input_surface.npy')).astype(np.float32)
|
||||||
|
|
||||||
|
# Run the inference session
|
||||||
|
output, output_surface = ort_session_24.run(None, {'input':input, 'input_surface':input_surface})
|
||||||
|
# Save the results
|
||||||
|
np.save(os.path.join(output_data_dir, 'output_upper'), output)
|
||||||
|
np.save(os.path.join(output_data_dir, 'output_surface'), output_surface)
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
import os
|
||||||
|
import numpy as np
|
||||||
|
import onnx
|
||||||
|
import onnxruntime as ort
|
||||||
|
|
||||||
|
|
||||||
|
# The directory of your input and output data
|
||||||
|
input_data_dir = 'input_data'
|
||||||
|
output_data_dir = 'output_data'
|
||||||
|
model_24 = onnx.load('pangu_weather_24.onnx')
|
||||||
|
model_6 = onnx.load('pangu_weather_6.onnx')
|
||||||
|
|
||||||
|
# Set the behavier of onnxruntime
|
||||||
|
options = ort.SessionOptions()
|
||||||
|
options.enable_cpu_mem_arena=False
|
||||||
|
options.enable_mem_pattern = False
|
||||||
|
options.enable_mem_reuse = False
|
||||||
|
# Increase the number for faster inference and more memory consumption
|
||||||
|
options.intra_op_num_threads = 1
|
||||||
|
|
||||||
|
# Set the behavier of cuda provider
|
||||||
|
cuda_provider_options = {'arena_extend_strategy':'kSameAsRequested',}
|
||||||
|
|
||||||
|
# Initialize onnxruntime session for Pangu-Weather Models
|
||||||
|
ort_session_24 = ort.InferenceSession('pangu_weather_24.onnx', sess_options=options, provider=[('CUDAExecutionProvider', cuda_provider_options)])
|
||||||
|
ort_session_6 = ort.InferenceSession('pangu_weather_6.onnx', sess_options=options, provider=[('CUDAExecutionProvider', cuda_provider_options)])
|
||||||
|
|
||||||
|
# Load the upper-air numpy arrays
|
||||||
|
input = np.load(os.path.join(input_data_dir, 'input_upper.npy')).astype(np.float32)
|
||||||
|
# Load the surface numpy arrays
|
||||||
|
input_surface = np.load(os.path.join(input_data_dir, 'input_surface.npy')).astype(np.float32)
|
||||||
|
|
||||||
|
# Run the inference session
|
||||||
|
input_24, input_surface_24 = input, input_surface
|
||||||
|
for i in range(28):
|
||||||
|
if (i+1) % 4 == 0:
|
||||||
|
output, output_surface = ort_session_24.run(None, {'input':input_24, 'input_surface':input_surface_24})
|
||||||
|
input_24, input_surface_24 = output, output_surface
|
||||||
|
else:
|
||||||
|
output, output_surface = ort_session_6.run(None, {'input':input, 'input_surface':input_surface})
|
||||||
|
input, input_surface = output, output_surface
|
||||||
|
# Your can save the results here
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
numpy
|
||||||
|
onnx==1.13.1
|
||||||
|
onnxruntime==1.14.0
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
numpy
|
||||||
|
onnx==1.12.0
|
||||||
|
onnxruntime-gpu==1.14.0
|
||||||
Reference in New Issue
Block a user