mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-05-15 20:50:42 +00:00
update CI for onnxruntime-web (#7497)
This commit is contained in:
parent
0d107bbb73
commit
00aaa6dabb
7 changed files with 193 additions and 43 deletions
|
|
@ -150,6 +150,7 @@ option(onnxruntime_USE_MPI "Build with MPI support" OFF)
|
|||
option(onnxruntime_BUILD_WEBASSEMBLY "Enable this option to create WebAssembly byte codes" OFF)
|
||||
option(onnxruntime_ENABLE_WEBASSEMBLY_THREADS "Enable this option to create WebAssembly byte codes with multi-threads support" OFF)
|
||||
option(onnxruntime_ENABLE_WEBASSEMBLY_EXCEPTION_CATCHING "Enable this option to turn on exception catching" OFF)
|
||||
option(onnxruntime_ENABLE_WEBASSEMBLY_SOURCEMAP "Enable this option to turn on sourcemap" OFF)
|
||||
|
||||
# Enable bitcode for iOS
|
||||
option(onnxruntime_ENABLE_BITCODE "Enable bitcode for iOS only" OFF)
|
||||
|
|
@ -265,9 +266,22 @@ if (NOT MSVC AND NOT onnxruntime_ENABLE_BITCODE)
|
|||
string(APPEND CMAKE_C_FLAGS " -ffunction-sections -fdata-sections")
|
||||
endif()
|
||||
|
||||
# Build WebAssembly source map on debug build.
|
||||
if (onnxruntime_BUILD_WEBASSEMBLY)
|
||||
string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g4 --source-map-base http://localhost:8000/")
|
||||
# Enable LTO for release build
|
||||
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
# we don't set onnxruntime_ENABLE_LTO because it appends flag "-flto=thin"
|
||||
# currently, wasm-ld does not work correctly with "-flto=thin"
|
||||
# instead, we manually set CMAKE_CXX_FLAGS "-flto"
|
||||
string(APPEND CMAKE_CXX_FLAGS " -flto")
|
||||
endif()
|
||||
|
||||
if (onnxruntime_ENABLE_WEBASSEMBLY_SOURCEMAP)
|
||||
# Build with sourcemap support
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "-g4 --source-map-base ${onnxruntime_WEBASSEMBLY_SOURCEMAP_BASE}")
|
||||
else()
|
||||
# override default "-g3" as it generates super huge (1GB+) WASM targets which fails to load
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "-g2")
|
||||
endif()
|
||||
|
||||
# Build WebAssembly with multi-threads support.
|
||||
if (onnxruntime_ENABLE_WEBASSEMBLY_THREADS)
|
||||
|
|
|
|||
|
|
@ -60,8 +60,8 @@ else()
|
|||
endif()
|
||||
|
||||
if (onnxruntime_ENABLE_WEBASSEMBLY_THREADS)
|
||||
set_property(TARGET onnxruntime_wasm APPEND_STRING PROPERTY LINK_FLAGS " -s EXPORT_NAME=onnxWasmThreadsBindingJs -s USE_PTHREADS=1")
|
||||
set_property(TARGET onnxruntime_wasm APPEND_STRING PROPERTY LINK_FLAGS " -s EXPORT_NAME=ortWeb -s USE_PTHREADS=1")
|
||||
set_target_properties(onnxruntime_wasm PROPERTIES OUTPUT_NAME "onnxruntime_wasm_threads")
|
||||
else()
|
||||
set_property(TARGET onnxruntime_wasm APPEND_STRING PROPERTY LINK_FLAGS " -s EXPORT_NAME=onnxWasmBindingJs")
|
||||
set_property(TARGET onnxruntime_wasm APPEND_STRING PROPERTY LINK_FLAGS " -s EXPORT_NAME=ortWebThreads")
|
||||
endif()
|
||||
|
|
|
|||
12
js/README.md
12
js/README.md
|
|
@ -116,15 +116,17 @@ Node.js v12+ (recommended v14+)
|
|||
|
||||
1. Install NPM packages
|
||||
|
||||
1. in `/js/`, run `npm ci`.
|
||||
2. in `/js/common/`, run `npm ci`.
|
||||
3. in `/js/web/`, run `npm ci`.
|
||||
1. in `<ORT_ROOT>/js/`, run `npm ci`.
|
||||
2. in `<ORT_ROOT>/js/common/`, run `npm ci`.
|
||||
3. in `<ORT_ROOT>/js/web/`, run `npm ci`.
|
||||
|
||||
2. Follow [instructions](https://www.onnxruntime.ai/docs/how-to/build.html#apis-and-language-bindings) for building ONNX Runtime WebAssembly.
|
||||
|
||||
3. Copy files `onnxruntime_wasm.*` from build output folder to `<ORT_ROOT>/js/web/lib/wasm/binding/`.
|
||||
3. Copy files `onnxruntime_wasm*.wasm` from build output folder to `<ORT_ROOT>/js/web/dist/`.
|
||||
|
||||
4. Use following command in folder `<ORT_ROOT>/js/web` to build:
|
||||
4. Copy files `onnxruntime_wasm*.js` from build output folder to `<ORT_ROOT>/js/web/lib/wasm/binding/`.
|
||||
|
||||
5. Use following command in folder `<ORT_ROOT>/js/web` to build:
|
||||
```
|
||||
npm run build
|
||||
```
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@ if (['prod', 'dev', 'test'].indexOf(MODE) === -1) {
|
|||
// Path variables
|
||||
const WASM_BINDING_FOLDER = path.join(__dirname, '..', 'lib', 'wasm', 'binding');
|
||||
const WASM_JS_PATH = path.join(WASM_BINDING_FOLDER, 'onnxruntime_wasm.js');
|
||||
const WASM_PATH = path.join(WASM_BINDING_FOLDER, 'onnxruntime_wasm.wasm');
|
||||
const WASM_DIST_FOLDER = path.join(__dirname, '..', 'dist');
|
||||
const WASM_DIST_PATH = path.join(WASM_DIST_FOLDER, 'onnxruntime_wasm.wasm');
|
||||
|
||||
|
|
@ -26,19 +25,15 @@ try {
|
|||
if (!fs.pathExistsSync(WASM_JS_PATH)) {
|
||||
throw new Error(`file does not exist: ${WASM_JS_PATH}`);
|
||||
}
|
||||
npmlog.info('Build', `Ensure file: ${WASM_PATH}`);
|
||||
if (!fs.pathExistsSync(WASM_PATH)) {
|
||||
throw new Error(`file does not exist: ${WASM_PATH}`);
|
||||
npmlog.info('Build', `Ensure file: ${WASM_DIST_PATH}`);
|
||||
if (!fs.pathExistsSync(WASM_DIST_PATH)) {
|
||||
throw new Error(`file does not exist: ${WASM_DIST_PATH}`);
|
||||
}
|
||||
} catch (e) {
|
||||
npmlog.error('Build', `WebAssembly files are not ready. build WASM first. ERR: ${e}`);
|
||||
throw e;
|
||||
}
|
||||
|
||||
npmlog.info('Build', `Copying file "${WASM_PATH}" to "${WASM_DIST_PATH}"...`);
|
||||
fs.ensureDirSync(WASM_DIST_FOLDER);
|
||||
fs.copyFileSync(WASM_PATH, WASM_DIST_PATH);
|
||||
|
||||
npmlog.info('Build', 'Building bundle...');
|
||||
{
|
||||
npmlog.info('Build.Bundle', '(1/2) Retrieving npm bin folder...');
|
||||
|
|
|
|||
|
|
@ -21,13 +21,13 @@
|
|||
"test_atan",
|
||||
"test_averagepool_1d_default",
|
||||
"test_averagepool_2d_default",
|
||||
"test_averagepool_2d_pads",
|
||||
"test_averagepool_2d_precomputed_pads",
|
||||
"test_averagepool_2d_precomputed_same_upper",
|
||||
"test_averagepool_2d_precomputed_strides",
|
||||
"test_averagepool_2d_same_upper",
|
||||
"test_averagepool_2d_same_lower",
|
||||
"test_averagepool_2d_strides",
|
||||
//"v12/test_averagepool_2d_pads", // TODO: fix avgpool and maxpool on VM
|
||||
"v12/test_averagepool_2d_precomputed_pads",
|
||||
"v12/test_averagepool_2d_precomputed_same_upper",
|
||||
"v12/test_averagepool_2d_precomputed_strides",
|
||||
"v12/test_averagepool_2d_same_upper",
|
||||
"v12/test_averagepool_2d_same_lower",
|
||||
"v12/test_averagepool_2d_strides",
|
||||
"test_averagepool_3d_default",
|
||||
"test_basic_conv_with_padding",
|
||||
"test_basic_conv_without_padding",
|
||||
|
|
@ -93,13 +93,13 @@
|
|||
"test_matmul_4d",
|
||||
"test_maxpool_1d_default",
|
||||
"test_maxpool_2d_default",
|
||||
"test_maxpool_2d_pads",
|
||||
"test_maxpool_2d_precomputed_pads",
|
||||
"test_maxpool_2d_precomputed_same_upper",
|
||||
"test_maxpool_2d_precomputed_strides",
|
||||
"test_maxpool_2d_same_lower",
|
||||
"test_maxpool_2d_same_upper",
|
||||
"test_maxpool_2d_strides",
|
||||
"v12/test_maxpool_2d_pads",
|
||||
"v12/test_maxpool_2d_precomputed_pads",
|
||||
"v12/test_maxpool_2d_precomputed_same_upper",
|
||||
"v12/test_maxpool_2d_precomputed_strides",
|
||||
"v12/test_maxpool_2d_same_lower",
|
||||
"v12/test_maxpool_2d_same_upper",
|
||||
"v12/test_maxpool_2d_strides",
|
||||
"test_maxpool_3d_default",
|
||||
"test_mul_bcast",
|
||||
"test_mul_example",
|
||||
|
|
|
|||
|
|
@ -340,6 +340,12 @@ def parse_arguments():
|
|||
parser.add_argument(
|
||||
"--enable_wasm_threads", action='store_true',
|
||||
help="Enable WebAssembly multi-threads support")
|
||||
parser.add_argument(
|
||||
"--enable_wasm_sourcemap", action='store_true',
|
||||
help="Build WebAssembly with source map")
|
||||
parser.add_argument(
|
||||
"--wasm_sourcemap_base", default="http://localhost:9876/onnxruntime/",
|
||||
help="Set base URL of the source map")
|
||||
|
||||
# Arguments needed by CI
|
||||
parser.add_argument(
|
||||
|
|
@ -734,6 +740,8 @@ def generate_build_tree(cmake_path, source_dir, build_dir, cuda_home, cudnn_home
|
|||
"-Donnxruntime_ENABLE_WEBASSEMBLY_EXCEPTION_CATCHING=" + ("OFF" if args.disable_wasm_exception_catching
|
||||
else "ON"),
|
||||
"-Donnxruntime_ENABLE_WEBASSEMBLY_THREADS=" + ("ON" if args.enable_wasm_threads else "OFF"),
|
||||
"-Donnxruntime_ENABLE_WEBASSEMBLY_SOURCEMAP=" + ("ON" if args.enable_wasm_sourcemap else "OFF"),
|
||||
"-Donnxruntime_WEBASSEMBLY_SOURCEMAP_BASE=" + (args.wasm_sourcemap_base if args.enable_wasm_sourcemap else ""),
|
||||
]
|
||||
|
||||
if acl_home and os.path.exists(acl_home):
|
||||
|
|
|
|||
|
|
@ -1,13 +1,26 @@
|
|||
jobs:
|
||||
- job: 'build'
|
||||
- job: build_WASM
|
||||
pool: 'Win-CPU-2019'
|
||||
strategy:
|
||||
maxParallel: 2
|
||||
maxParallel: 4
|
||||
matrix:
|
||||
debug:
|
||||
'debug':
|
||||
BuildConfig: 'Debug'
|
||||
release:
|
||||
CmdParams: ''
|
||||
WasmFileName: 'onnxruntime_wasm'
|
||||
'release':
|
||||
BuildConfig: 'Release'
|
||||
CmdParams: '--skip_tests --disable_wasm_exception_catching --disable_rtti'
|
||||
WasmFileName: 'onnxruntime_wasm'
|
||||
'threads debug':
|
||||
BuildConfig: 'Debug'
|
||||
CmdParams: '--enable_wasm_threads'
|
||||
WasmFileName: 'onnxruntime_wasm_threads'
|
||||
'threads release':
|
||||
BuildConfig: 'Release'
|
||||
CmdParams: '--enable_wasm_threads --skip_tests --disable_wasm_exception_catching --disable_rtti'
|
||||
WasmFileName: 'onnxruntime_wasm_threads'
|
||||
|
||||
variables:
|
||||
OnnxRuntimeBuildDirectory: '$(Build.BinariesDirectory)'
|
||||
EnvSetupScript: setup_env.bat
|
||||
|
|
@ -21,30 +34,33 @@ jobs:
|
|||
versionSpec: '3.7'
|
||||
addToPath: true
|
||||
architecture: $(buildArch)
|
||||
|
||||
- task: NodeTool@0
|
||||
inputs:
|
||||
versionSpec: '14.x'
|
||||
|
||||
- task: BatchScript@1
|
||||
displayName: 'setup env'
|
||||
inputs:
|
||||
filename: '$(Build.SourcesDirectory)\tools\ci_build\github\windows\$(EnvSetupScript)'
|
||||
modifyEnvironment: true
|
||||
workingFolder: '$(Build.BinariesDirectory)'
|
||||
|
||||
- script: |
|
||||
python -m pip install -q pyopenssl setuptools wheel numpy ninja flake8
|
||||
workingDirectory: '$(Build.BinariesDirectory)'
|
||||
displayName: 'Install python modules'
|
||||
|
||||
- task: PythonScript@0
|
||||
displayName: 'Build and test'
|
||||
inputs:
|
||||
scriptPath: '$(Build.SourcesDirectory)\tools\ci_build\build.py'
|
||||
arguments: '--config $(BuildConfig) --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_wasm --cmake_generator "Visual Studio 16 2019"'
|
||||
arguments: '--config $(BuildConfig) --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_wasm --cmake_generator "Visual Studio 16 2019" $(CmdParams)'
|
||||
workingDirectory: '$(Build.BinariesDirectory)'
|
||||
|
||||
- script: |
|
||||
copy $(Build.BinariesDirectory)\$(BuildConfig)\$(WasmFileName)*.* $(Build.ArtifactStagingDirectory)
|
||||
displayName: 'Create Artifacts'
|
||||
- task: PublishPipelineArtifact@0
|
||||
displayName: 'Publish Pipeline Artifact'
|
||||
inputs:
|
||||
artifactName: '$(BuildConfig)_$(WasmFileName)'
|
||||
targetPath: '$(Build.ArtifactStagingDirectory)'
|
||||
- task: PublishTestResults@2
|
||||
displayName: 'Publish unit test results'
|
||||
inputs:
|
||||
|
|
@ -52,11 +68,126 @@ jobs:
|
|||
searchFolder: '$(Build.BinariesDirectory)'
|
||||
testRunTitle: 'Unit Test Run'
|
||||
condition: succeededOrFailed()
|
||||
|
||||
- template: templates/component-governance-component-detection-steps.yml
|
||||
parameters :
|
||||
condition : 'succeeded'
|
||||
|
||||
- task: mspremier.PostBuildCleanup.PostBuildCleanup-task.PostBuildCleanup@3
|
||||
displayName: 'Clean Agent Directories'
|
||||
condition: always()
|
||||
|
||||
- job: build_onnxruntime_web
|
||||
dependsOn: build_WASM
|
||||
pool: 'Win-CPU-2019'
|
||||
strategy:
|
||||
maxParallel: 2
|
||||
matrix:
|
||||
'debug':
|
||||
BuildConfig: 'Debug'
|
||||
'release':
|
||||
BuildConfig: 'Release'
|
||||
|
||||
timeoutInMinutes: 30
|
||||
workspace:
|
||||
clean: all
|
||||
steps:
|
||||
- checkout: self
|
||||
submodules: false
|
||||
- script: |
|
||||
git submodule sync -- cmake\external\onnx
|
||||
git submodule update --init -- cmake\external\onnx
|
||||
workingDirectory: '$(Build.SourcesDirectory)'
|
||||
displayName: 'Checkout submodule onnx'
|
||||
- task: NodeTool@0
|
||||
inputs:
|
||||
versionSpec: '14.x'
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
patterns: '$(BuildConfig)_*/**/*'
|
||||
path: $(Pipeline.Workspace)\artifacts
|
||||
displayName: 'Download WebAssembly artifacts'
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Pipeline.Workspace)\artifacts
|
||||
contents: |
|
||||
**\*.wasm
|
||||
**\*.worker.js
|
||||
targetFolder: $(Build.SourcesDirectory)\js\web\dist
|
||||
flattenFolders: true
|
||||
displayName: 'Binplace dist files'
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Pipeline.Workspace)\artifacts
|
||||
contents: |
|
||||
**\*.js
|
||||
!**\*.worker.js
|
||||
targetFolder: $(Build.SourcesDirectory)\js\web\lib\wasm\binding
|
||||
flattenFolders: true
|
||||
displayName: 'Binplace js files'
|
||||
- script: |
|
||||
npm ci
|
||||
workingDirectory: '$(Build.SourcesDirectory)\js'
|
||||
displayName: 'npm ci /js/'
|
||||
- script: |
|
||||
npm ci
|
||||
workingDirectory: '$(Build.SourcesDirectory)\js\common'
|
||||
displayName: 'npm ci /js/common/'
|
||||
- script: |
|
||||
npm ci
|
||||
workingDirectory: '$(Build.SourcesDirectory)\js\web'
|
||||
displayName: 'npm ci /js/web/'
|
||||
- script: |
|
||||
npm run lint
|
||||
workingDirectory: '$(Build.SourcesDirectory)\js'
|
||||
displayName: 'ESLint'
|
||||
- script: |
|
||||
npm run format
|
||||
workingDirectory: '$(Build.SourcesDirectory)\js'
|
||||
displayName: 'Clang-format'
|
||||
- script: |
|
||||
node -e "a=require('child_process').execSync('git ls-files -m').toString();if(a)throw new Error('Following source files are not formatted:\n'+a)"
|
||||
workingDirectory: '$(Build.SourcesDirectory)\js'
|
||||
displayName: 'Check unformatted files'
|
||||
- script: |
|
||||
npm run build
|
||||
workingDirectory: '$(Build.SourcesDirectory)\js\web'
|
||||
displayName: 'Build ort-web'
|
||||
- script: |
|
||||
npm test
|
||||
workingDirectory: '$(Build.SourcesDirectory)\js\web'
|
||||
displayName: 'Run ort-web tests'
|
||||
- script: |
|
||||
npm pack
|
||||
workingDirectory: '$(Build.SourcesDirectory)\js\common'
|
||||
displayName: 'Generate NPM package (onnxruntime-common)'
|
||||
condition: and(succeeded(), eq(variables['BuildConfig'], 'Release'))
|
||||
- script: |
|
||||
npm pack
|
||||
workingDirectory: '$(Build.SourcesDirectory)\js\web'
|
||||
displayName: 'Generate NPM package (onnxruntime-web)'
|
||||
condition: and(succeeded(), eq(variables['BuildConfig'], 'Release'))
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)\js\common
|
||||
contents: onnxruntime-common-*.tgz
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)
|
||||
displayName: 'Create Artifacts (onnxruntime-common)'
|
||||
condition: and(succeeded(), eq(variables['BuildConfig'], 'Release'))
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)\js\web
|
||||
contents: onnxruntime-web-*.tgz
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)
|
||||
displayName: 'Create Artifacts (onnxruntime-web)'
|
||||
condition: and(succeeded(), eq(variables['BuildConfig'], 'Release'))
|
||||
- task: PublishPipelineArtifact@0
|
||||
inputs:
|
||||
artifactName: 'NPM_packages'
|
||||
targetPath: '$(Build.ArtifactStagingDirectory)'
|
||||
displayName: 'Publish Pipeline Artifact'
|
||||
condition: and(succeeded(), eq(variables['BuildConfig'], 'Release'))
|
||||
- template: templates/component-governance-component-detection-steps.yml
|
||||
parameters :
|
||||
condition : 'succeeded'
|
||||
- task: mspremier.PostBuildCleanup.PostBuildCleanup-task.PostBuildCleanup@3
|
||||
displayName: 'Clean Agent Directories'
|
||||
condition: always()
|
||||
|
|
|
|||
Loading…
Reference in a new issue