未验证 提交 955f4ba5 编写于 作者: M Mark Hamilton 提交者: GitHub

ONNX Hub Docs (#3712)

* ONNX Hub Docs
Signed-off-by: NMark <mhamilton723@gmail.com>

* Finish sections
Signed-off-by: NMark <mhamilton723@gmail.com>
上级 be76ca71
<!--- SPDX-License-Identifier: Apache-2.0 -->
# ONNX Model Hub
The ONNX Model Hub is a simple and fast way to get started with state of the art pre-trained
ONNX models from the [ONNX Model Zoo](https://github.com/onnx/models). Furthermore, this allows researchers and model
developers the opportunity to share their pre-trained models with the broader community.
## Install
The ONNX Model hub will be included in the `onnx` package from version 1.11 onwards.
To use the hub before the 1.11 release please install from the weekly build:
```shell script
pip install -i https://test.pypi.org/simple/ onnx-weekly
```
## Basic usage
The ONNX Model Hub is capable of downloading, listing, and querying trained models from any git repository,
and defaults to the official [ONNX Model Zoo](https://github.com/onnx/models). In this section we demonstrate some of the basic functionality.
First please import the hub using:
```python
from onnx import hub
```
#### Downloading a model by name:
The `load` function will default to searching the model zoo for the latest model with a matching name,
download this model to a local cache, and load the model into a `ModelProto`
object for use with the ONNX runtime.
```python
model = hub.load("resnet50")
```
#### Downloading from custom repositories:
Any repository with the proper structure can be a ONNX model hub. To download from other hubs,
or to specify a particular branch or commit on the main model hub one can provide the `repo` parameter:
```python
model = hub.load("resnet50", repo='onnx/models:771185265efbdc049fb223bd68ab1aeb1aecde76')
```
#### Listing and inspecting Models:
The model hub provides APIs for querying the model zoo to learn more about available models.
This does not download the models, but rather just returns information about models matching the given arguments
```python
# List all models in the onnx/models:master repo
all_models = hub.list_models()
# List all versions/opsets of a specific model
mnist_models = hub.list_models(model="mnist")
# List all models matching a given "tag"
vision_models = hub.list_models(tags=["vision"])
```
One can also inspect the metadata of a model prior to download with the `get_model_info` function:
```python
print(hub.get_model_info(model="mnist", opset=8))
```
This will print something like:
```
ModelInfo(
model=MNIST,
opset=8,
path=vision/classification/mnist/model/mnist-8.onnx,
metadata={
'model_sha': '2f06e72de813a8635c9bc0397ac447a601bdbfa7df4bebc278723b958831c9bf',
'model_bytes': 26454,
'tags': ['vision', 'classification', 'mnist'],
'io_ports': {
'inputs': [{'name': 'Input3', 'shape': [1, 1, 28, 28], 'type': 'tensor(float)'}],
'outputs': [{'name': 'Plus214_Output_0', 'shape': [1, 10], 'type': 'tensor(float)'}]},
'model_with_data_path': 'vision/classification/mnist/model/mnist-8.tar.gz',
'model_with_data_sha': '1dd098b0fe8bc750585eefc02013c37be1a1cae2bdba0191ccdb8e8518b3a882',
'model_with_data_bytes': 25962}
)
```
## Local Caching
The ONNX Model hub locally caches downloaded models in a configurable location
so that subsequent calls to `hub.load` do not require network connection.
#### Default cache location
The hub client looks for the following default cache locations in this order:
1) `$ONNX_HOME/hub` if the `ONNX_HOME` environment variable is defined
2) `$XDG_CACHE_HOME/hub` if the `XDG_CACHE_HOME` environment variable is defined
3) `~/.cache/onnx/hub` where `~` is the user home directory
#### Setting the cache location
To manually set the cache location use:
```python
hub.set_dir("my/cache/directory")
```
Additionally one can inspect the cache location with:
```python
print(hub.get_dir())
```
#### Additional cache details
To clear the model cache one can simply delete the cache directory using a python utility like `shutil` or `os`.
Furthermore one can choose to override the cached model using the `force_reload` option:
```python
model = hub.load("resnet50", force_reload=True)
```
We include this flag for completeness but note that models in the cache are disambiguated with sha256 hashes so
the force_reload flag is not necessary for normal use.
Finally we note that the model cache directory structure will mirror the directory structure
specified by the `model_path` field of the manifest, but with file names disambiguated with model SHA256 Hashes.
This way, the model cache is human readable, can disambiguate between multiple versions of models,
and can re-use cached models across different hubs if they have the same name and hash.
## Architecture
![ONNX Hub Architecture](images/onnx_hub_arch.svg)
The ONNX Hub consists of two main components, the client and the server.
The client code currently is included in the `onnx` package and can be pointed at a
server in the form of a hosted `ONNX_HUB_MANIFEST.json` within a github repository
such as [the one in the ONNX Model Zoo](https://github.com/onnx/models/blob/master/ONNX_HUB_MANIFEST.json).
This manifest file is a JSON document which lists all models and their metadata
and is designed to be programming language agnostic. An example of a well formed model manifest entry is as follows:
```json
{
"model": "BERT-Squad",
"model_path": "text/machine_comprehension/bert-squad/model/bertsquad-8.onnx",
"onnx_version": "1.3",
"opset_version": 8,
"metadata": {
"model_sha": "cad65b9807a5e0393e4f84331f9a0c5c844d9cc736e39781a80f9c48ca39447c",
"model_bytes": 435882893,
"tags": ["text", "machine comprehension", "bert-squad"],
"io_ports": {
"inputs": [
{
"name": "unique_ids_raw_output___9:0",
"shape": ["unk__475"],
"type": "tensor(int64)"
},
{
"name": "segment_ids:0",
"shape": ["unk__476", 256],
"type": "tensor(int64)"
},
{
"name": "input_mask:0",
"shape": ["unk__477", 256],
"type": "tensor(int64)"
},
{
"name": "input_ids:0",
"shape": ["unk__478", 256],
"type": "tensor(int64)"
}
],
"outputs": [
{
"name": "unstack:1",
"shape": ["unk__479", 256],
"type": "tensor(float)"
},
{
"name": "unstack:0",
"shape": ["unk__480", 256],
"type": "tensor(float)"
},
{
"name": "unique_ids:0",
"shape": ["unk__481"],
"type": "tensor(int64)"
}
]
},
"model_with_data_path": "text/machine_comprehension/bert-squad/model/bertsquad-8.tar.gz",
"model_with_data_sha": "c8c6c7e0ab9e1333b86e8415a9d990b2570f9374f80be1c1cb72f182d266f666",
"model_with_data_bytes": 403400046
}
}
```
These important fields are:
- `model`: The name of the model used for querying
- `model_path`: The relative path of the model stored in Git LFS.
- `onnx_version`: The ONNX version of the model
- `opset_version`: The version of the opset. The client downloads the latest opset if left unspecified.
- `metadata/model_sha`: Optional model sha specification for increased download security
- `metadata/tags`: Optional high level tags to help users find models by a given type
All other fields in the `metadata` field are optional for the client but provide important details for users.
## Adding to the ONNX Model Hub
#### Contributing an official model
The simplest way to add a model to the official `onnx/models` version model hub is to follow
[these guidelines](https://github.com/onnx/models/blob/master/contribute.md) to contribute your model. Once contributed,
ensure that your model has a markdown table in its `README.md`
([Example](https://github.com/onnx/models/tree/master/vision/classification/mobilenet)). The model hub
manifest generator will pull information from these markdown tables. To run the generator:
```shell script
git clone https://github.com/onnx/models.git
git lfs pull --include="*" --exclude=""
cd models/workflow_scripts
python generate_onnx_hub_manifest.py
```
Once a new manifest is generated add, submit it in a pull request to ``onnx/models``
#### Hosting your own ONNX Model Hub
To host your own model hub, add an `ONNX_HUB_MANIFEST.json` to the top level of your github repository
([Example](https://github.com/onnx/models/blob/master/ONNX_HUB_MANIFEST.json)). At a minimum your
manifest entries should include the fields mentioned in
the [Architecture Section](Hub.md#Architecture) of this document.
Once committed, check that you can download models
using the "Downloading from custom repositories" section of this doc.
\ No newline at end of file
<svg width="3126" height="2133" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" overflow="hidden"><defs><clipPath id="clip0"><rect x="541" y="263" width="3126" height="2133"/></clipPath></defs><g clip-path="url(#clip0)" transform="translate(-541 -263)"><rect x="541" y="272" width="3126" height="2124"/><path d="M2442.5 738.837C2442.5 646.971 2516.97 572.5 2608.84 572.5L3471.16 572.5C3563.03 572.5 3637.5 646.971 3637.5 738.837L3637.5 1404.16C3637.5 1496.03 3563.03 1570.5 3471.16 1570.5L2608.84 1570.5C2516.97 1570.5 2442.5 1496.03 2442.5 1404.16Z" stroke="#FFFFFF" stroke-width="4.58333" stroke-miterlimit="8" fill="#404040" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 2789.98 714)">Git LFS Storage<tspan font-family="Calibri Light,Calibri Light_MSFontService,sans-serif" font-weight="300" font-size="202" x="-1743.23" y="-201">ONNX Hub Architecture</tspan></text><path d="M2534.5 817.667C2534.5 802.663 2546.66 790.5 2561.67 790.5L2842.33 790.5C2857.34 790.5 2869.5 802.663 2869.5 817.667L2869.5 926.333C2869.5 941.337 2857.34 953.5 2842.33 953.5L2561.67 953.5C2546.66 953.5 2534.5 941.337 2534.5 926.333Z" stroke="#2F528F" stroke-width="4.58333" stroke-miterlimit="8" fill="#4472C4" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 2596.49 899)">M1 v2</text><path d="M2534.5 1023.67C2534.5 1008.66 2546.66 996.5 2561.67 996.5L2842.33 996.5C2857.34 996.5 2869.5 1008.66 2869.5 1023.67L2869.5 1132.33C2869.5 1147.34 2857.34 1159.5 2842.33 1159.5L2561.67 1159.5C2546.66 1159.5 2534.5 1147.34 2534.5 1132.33Z" stroke="#2F528F" stroke-width="4.58333" stroke-miterlimit="8" fill="#4472C4" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 2596.49 1105)">M2 v3</text><path d="M2534.5 1379.67C2534.5 1364.66 2546.66 1352.5 2561.67 1352.5L2842.33 1352.5C2857.34 1352.5 2869.5 1364.66 2869.5 1379.67L2869.5 1488.33C2869.5 1503.34 2857.34 1515.5 2842.33 1515.5L2561.67 1515.5C2546.66 1515.5 2534.5 1503.34 2534.5 1488.33Z" stroke="#2F528F" stroke-width="4.58333" stroke-miterlimit="8" fill="#4472C4" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 2590.76 1461)">MN v1</text><path d="M2899.5 817.667C2899.5 802.663 2911.66 790.5 2926.67 790.5L3207.33 790.5C3222.34 790.5 3234.5 802.663 3234.5 817.667L3234.5 926.333C3234.5 941.337 3222.34 953.5 3207.33 953.5L2926.67 953.5C2911.66 953.5 2899.5 941.337 2899.5 926.333Z" stroke="#2F528F" stroke-width="4.58333" stroke-miterlimit="8" fill="#4472C4" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 2961.64 899)">M1 v1</text><path d="M2899.5 1022.83C2899.5 1007.74 2911.74 995.5 2926.83 995.5L3207.17 995.5C3222.26 995.5 3234.5 1007.74 3234.5 1022.83L3234.5 1132.17C3234.5 1147.26 3222.26 1159.5 3207.17 1159.5L2926.83 1159.5C2911.74 1159.5 2899.5 1147.26 2899.5 1132.17Z" stroke="#2F528F" stroke-width="4.58333" stroke-miterlimit="8" fill="#4472C4" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 2961.64 1104)">M1 v2</text><path d="M3264.5 1022.83C3264.5 1007.74 3276.74 995.5 3291.83 995.5L3572.17 995.5C3587.26 995.5 3599.5 1007.74 3599.5 1022.83L3599.5 1132.17C3599.5 1147.26 3587.26 1159.5 3572.17 1159.5L3291.83 1159.5C3276.74 1159.5 3264.5 1147.26 3264.5 1132.17Z" stroke="#2F528F" stroke-width="4.58333" stroke-miterlimit="8" fill="#4472C4" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 3326.79 1104)">M1 v2<tspan font-size="133" x="-682.733" y="175"></tspan></text><path d="M1400.5 736.17C1400.5 645.778 1473.78 572.5 1564.17 572.5L2218.83 572.5C2309.22 572.5 2382.5 645.778 2382.5 736.17L2382.5 1406.83C2382.5 1497.22 2309.22 1570.5 2218.83 1570.5L1564.17 1570.5C1473.78 1570.5 1400.5 1497.22 1400.5 1406.83Z" stroke="#FFFFFF" stroke-width="4.58333" stroke-miterlimit="8" fill="#ED7D31" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 1574.57 714)">onnx<tspan font-size="83" x="165.39" y="0">/models Repo</tspan></text><path d="M1524.67 1515.5C1509.66 1515.5 1497.5 1503.34 1497.5 1488.33L1497.5 817.667C1497.5 802.663 1509.66 790.5 1524.67 790.5L1633.33 790.5C1648.34 790.5 1660.5 802.663 1660.5 817.667L1660.5 1488.33C1660.5 1503.34 1648.34 1515.5 1633.33 1515.5Z" stroke="#2F528F" stroke-width="4.58333" stroke-miterlimit="8" fill="#4472C4" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(-1.83697e-16 -1 1 -1.83697e-16 1606.11 1401)">MANIFEST.json</text><path d="M1757.5 817.667C1757.5 802.663 1769.66 790.5 1784.67 790.5L2293.33 790.5C2308.34 790.5 2320.5 802.663 2320.5 817.667L2320.5 926.333C2320.5 941.337 2308.34 953.5 2293.33 953.5L1784.67 953.5C1769.66 953.5 1757.5 941.337 1757.5 926.333Z" stroke="#2F528F" stroke-width="4.58333" stroke-miterlimit="8" fill="#4472C4" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 1802.57 899)">M1 v2 Pointer</text><path d="M1757.5 1023.67C1757.5 1008.66 1769.66 996.5 1784.67 996.5L2293.33 996.5C2308.34 996.5 2320.5 1008.66 2320.5 1023.67L2320.5 1132.33C2320.5 1147.34 2308.34 1159.5 2293.33 1159.5L1784.67 1159.5C1769.66 1159.5 1757.5 1147.34 1757.5 1132.33Z" stroke="#2F528F" stroke-width="4.58333" stroke-miterlimit="8" fill="#4472C4" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 1802.57 1105)">M2 v3 Pointer</text><path d="M1757.5 1379.67C1757.5 1364.66 1769.66 1352.5 1784.67 1352.5L2293.33 1352.5C2308.34 1352.5 2320.5 1364.66 2320.5 1379.67L2320.5 1488.33C2320.5 1503.34 2308.34 1515.5 2293.33 1515.5L1784.67 1515.5C1769.66 1515.5 1757.5 1503.34 1757.5 1488.33Z" stroke="#2F528F" stroke-width="4.58333" stroke-miterlimit="8" fill="#4472C4" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 1927.54 1412)">MN v1 <tspan font-size="83" x="-10.3812" y="99">Pointer</tspan></text><path d="M2320 865.125 2499.84 865.125 2499.84 878.875 2320 878.875ZM2492.96 851.375 2534.21 872 2492.96 892.625Z" fill="#FFFFFF"/><path d="M2320 1070.12 2499.84 1070.13 2499.84 1083.88 2320 1083.88ZM2492.96 1056.38 2534.21 1077 2492.96 1097.63Z" fill="#FFFFFF"/><path d="M2320 1427.13 2499.84 1427.13 2499.84 1440.88 2320 1440.88ZM2492.96 1413.38 2534.21 1434 2492.96 1454.63Z" fill="#FFFFFF"/><path d="M1666.5 1150.77 1751.73 1399.25 1738.72 1403.71 1653.5 1155.23ZM1762.51 1388.29 1756.38 1434 1723.49 1401.67Z" fill="#FFFFFF"/><path d="M4.22417-5.42421 73.482 48.5112 65.0336 59.3596-4.22417 5.42421ZM76.5061 33.4386 96.3788 75.0562 51.1611 65.9838Z" fill="#FFFFFF" transform="matrix(1 0 0 -1 1660 1152.06)"/><path d="M6.50311-2.2305 91.7294 246.25 78.7232 250.711-6.50311 2.2305ZM102.505 235.286 96.3788 280.996 63.4865 248.669Z" fill="#FFFFFF" transform="matrix(1 0 0 -1 1660 1153)"/><path d="M603.5 695.336C603.5 627.495 658.496 572.5 726.336 572.5L1217.66 572.5C1285.5 572.5 1340.5 627.495 1340.5 695.336L1340.5 1447.66C1340.5 1515.5 1285.5 1570.5 1217.66 1570.5L726.336 1570.5C658.496 1570.5 603.5 1515.5 603.5 1447.66Z" stroke="#FFFFFF" stroke-width="4.58333" stroke-miterlimit="8" fill="#ED7D31" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 695.493 702)">onnx<tspan font-size="83" x="165.39" y="0">/</tspan><tspan font-size="83" x="196.052" y="0">onnx</tspan><tspan font-size="83" x="380.348" y="0">Repo</tspan></text><path d="M663.5 854.834C663.5 833.11 681.11 815.5 702.834 815.5L1237.17 815.5C1258.89 815.5 1276.5 833.11 1276.5 854.834L1276.5 1012.17C1276.5 1033.89 1258.89 1051.5 1237.17 1051.5L702.834 1051.5C681.11 1051.5 663.5 1033.89 663.5 1012.17Z" stroke="#2F528F" stroke-width="4.58333" stroke-miterlimit="8" fill="#4472C4" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 789.11 911)">ONNX Hub <tspan font-size="83" x="-44.7562" y="99">Python Client</tspan></text><path d="M603.5 1831C603.5 1774.39 649.391 1728.5 706 1728.5L3535 1728.5C3591.61 1728.5 3637.5 1774.39 3637.5 1831L3637.5 2241C3637.5 2297.61 3591.61 2343.5 3535 2343.5L706 2343.5C649.391 2343.5 603.5 2297.61 603.5 2241Z" stroke="#FFFFFF" stroke-width="4.58333" stroke-miterlimit="8" fill="#7030A0" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 1879.05 1852)">Local Machine</text><path d="M667.5 1966.17C667.5 1933.21 694.214 1906.5 727.168 1906.5L1959.83 1906.5C1992.79 1906.5 2019.5 1933.21 2019.5 1966.17L2019.5 2204.83C2019.5 2237.79 1992.79 2264.5 1959.83 2264.5L727.168 2264.5C694.214 2264.5 667.5 2237.79 667.5 2204.83Z" stroke="#507E32" stroke-width="4.58333" stroke-miterlimit="8" fill="#70AD47" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 1121.52 2017)">Local Process<tspan font-family="Consolas,Consolas_MSFontService,sans-serif" font-size="69" x="-398.747" y="81">import </tspan><tspan font-family="Consolas,Consolas_MSFontService,sans-serif" font-size="69" x="-134.059" y="81">onnx</tspan><tspan font-family="Consolas,Consolas_MSFontService,sans-serif" font-size="69" x="-398.747" y="169">model = </tspan><tspan font-family="Consolas,Consolas_MSFontService,sans-serif" font-size="69" x="-96.247" y="169">onnx.hub.load</tspan><tspan font-family="Consolas,Consolas_MSFontService,sans-serif" font-size="69" x="395.316" y="169">(‘</tspan><tspan font-family="Consolas,Consolas_MSFontService,sans-serif" font-size="69" x="470.941" y="169">modelN</tspan><tspan font-family="Consolas,Consolas_MSFontService,sans-serif" font-size="69" x="697.816" y="169">’)</tspan></text><path d="M2248.5 1963.17C2248.5 1930.21 2275.21 1903.5 2308.17 1903.5L3539.83 1903.5C3572.79 1903.5 3599.5 1930.21 3599.5 1963.17L3599.5 2201.83C3599.5 2234.79 3572.79 2261.5 3539.83 2261.5L2308.17 2261.5C2275.21 2261.5 2248.5 2234.79 2248.5 2201.83Z" stroke="#507E32" stroke-width="4.58333" stroke-miterlimit="8" fill="#70AD47" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 2797.99 2014)">Model Cache</text><path d="M2535.5 2063.83C2535.5 2048.74 2547.74 2036.5 2562.83 2036.5L2843.17 2036.5C2858.26 2036.5 2870.5 2048.74 2870.5 2063.83L2870.5 2173.17C2870.5 2188.26 2858.26 2200.5 2843.17 2200.5L2562.83 2200.5C2547.74 2200.5 2535.5 2188.26 2535.5 2173.17Z" stroke="#2F528F" stroke-width="4.58333" stroke-miterlimit="8" fill="#4472C4" fill-rule="evenodd"/><text fill="#FFFFFF" font-family="Calibri,Calibri_MSFontService,sans-serif" font-weight="400" font-size="83" transform="matrix(1 0 0 1 2591.27 2145)">MN v1</text><path d="M0.0237067-6.87496 480.989-5.21646 480.942 8.53346-0.0237067 6.87496ZM474.162-18.9901 515.341 1.77703 474.02 22.2597Z" fill="#FFFFFF" transform="matrix(-1 0 0 1 2534.34 2118)"/><path d="M2708.87 1514.99 2709.36 2001.07 2695.61 2001.08 2695.12 1515.01ZM2723.1 1994.18 2702.52 2035.45 2681.85 1994.22Z" fill="#FFFFFF"/><path d="M946.875 1050 946.876 1871.31 933.126 1871.31 933.125 1050ZM960.626 1864.44 940.001 1905.69 919.376 1864.44Z" fill="#FFFFFF"/><path d="M1585.87 1515 1585.88 1870.83 1572.13 1870.83 1572.12 1515ZM1599.63 1863.96 1579 1905.21 1558.38 1863.96Z" fill="#FFFFFF"/></g></svg>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册