Files
paddlepaddle--paddle/ci/windows/build.bat
T
2026-07-13 12:40:42 +08:00

425 lines
16 KiB
Batchfile

setlocal enabledelayedexpansion
call "%PYTHON_VENV_ROOT%\Scripts\activate.bat"
if not defined SCCACHE_ROOT set "SCCACHE_ROOT=D:\sccache"
set "PATH=%SCCACHE_ROOT%;%PATH%"
if "%WITH_SCCACHE%"=="ON" (
cmd /C sccache -V || call :install_sccache
sccache --stop-server 2> NUL
del %SCCACHE_ROOT%\sccache_log.txt
:: Locally storage on windows
if not exist %SCCACHE_ROOT% mkdir %SCCACHE_ROOT%
set "SCCACHE_DIR=%SCCACHE_ROOT%\.cache"
:: Sccache will shut down if a source file takes more than 10 mins to compile
set SCCACHE_IDLE_TIMEOUT=0
set SCCACHE_CACHE_SIZE=100G
set "SCCACHE_ERROR_LOG=%SCCACHE_ROOT%\sccache_log.txt"
set SCCACHE_LOG=quiet
:: Distributed storage on windows
@REM set SCCACHE_ENDPOINT=s3.bj.bcebos.com
@REM set SCCACHE_BUCKET=paddle-github-action
@REM set SCCACHE_S3_KEY_PREFIX=sccache/
@REM set SCCACHE_S3_USE_SSL=true
sccache --start-server
sccache -z
goto :begin_cmake
) else (
del %SCCACHE_ROOT%\sccache.exe 2> NUL
goto :begin_cmake
)
:install_sccache
echo There is not sccache in this PC, will install sccache.
echo Download package from https://paddle-ci.gz.bcebos.com/window_requirement/sccache.exe
python -c "import wget;wget.download('https://paddle-ci.gz.bcebos.com/window_requirement/sccache.exe')"
xcopy sccache.exe %SCCACHE_ROOT%\ /Y
del sccache.exe
goto:eof
:begin_cmake
call :cmake || goto cmake_error
goto :begin_build
:cmake
echo ========================================
echo Step 1. Cmake ...
echo ========================================
mkdir %BUILD_DIR%
rem set vs language to english to block showIncludes, this need vs has installed English language package.
set VSLANG=1033
rem Configure the environment for 64-bit builds. 'DISTUTILS_USE_SDK' indicates that the user has selected the compiler.
if not defined vcvars64_dir set "vcvars64_dir=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" & echo vcvars64_dir=!vcvars64_dir!>> %GITHUB_ENV%
echo %vcvars64_dir%
call "%vcvars64_dir%"
set DISTUTILS_USE_SDK=1
rem Windows 10 Kit bin dir
set "PATH=C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64;%PATH%"
rem Use 64-bit ToolSet to compile
set PreferredToolArchitecture=x64
echo PreferredToolArchitecture=x64>>%GITHUB_ENV%
for /f "usebackq" %%i in (`powershell -NoProfile -Command "Get-Date -Format 'yyyyMMddHHmmss'"`) do set start=%%i
set start=%start:~4,10%
if not defined CUDA_TOOLKIT_ROOT_DIR set "CUDA_TOOLKIT_ROOT_DIR=C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.2"
set "PATH=%TENSORRT_ROOT:/=\%\lib;%CUDA_TOOLKIT_ROOT_DIR:/=\%\bin;%CUDA_TOOLKIT_ROOT_DIR:/=\%\libnvvp;%PATH%"
if "%WITH_GPU%"=="ON" (
set cuda_version=%CUDA_TOOLKIT_ROOT_DIR:~-4%
if "!cuda_version!"=="12.0" (
set "PATH=C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64;%PATH%"
)
)
echo %PATH%
rem CUDA_TOOLKIT_ROOT_DIR in cmake must use / rather than \
set "TENSORRT_ROOT=%TENSORRT_ROOT:\=/%"
set "CUDA_TOOLKIT_ROOT_DIR=%CUDA_TOOLKIT_ROOT_DIR:\=/%"
rem install ninja if GENERATOR is Ninja
if "%GENERATOR%" == "Ninja" (
rem Set the default generator for cmake to Ninja
setx CMAKE_GENERATOR Ninja
pip install ninja==1.11.1.4
if %errorlevel% NEQ 0 (
echo pip install ninja failed!
exit /b 5
)
)
rem ------show summary of current GPU environment----------
cmake --version
if "%WITH_GPU%"=="ON" (
nvcc --version
nvidia-smi 2>NUL
)
rem ------set third_party cache dir------
if "%WITH_TPCACHE%"=="OFF" (
set THIRD_PARTY_PATH=%work_dir:\=/%/%BUILD_DIR%/third_party
echo THIRD_PARTY_PATH=%THIRD_PARTY_PATH%>> %GITHUB_ENV%
goto :cmake_impl
)
rem clear third party cache every ten days
for /f "usebackq" %%i in (`powershell -NoProfile -Command "Get-Date -Format 'yyyyMMddHHmmss'"`) do set datetime=%%i
set day_now=%datetime:~6,2%
set day_before=-1
echo echo [%cache_dir%]
set /p day_before=< %cache_dir%\day_third_party.txt
if %day_now% NEQ %day_before% (
echo %day_now% > %cache_dir%\day_third_party.txt
type %cache_dir%\day_third_party.txt
if %day_now% EQU 21 (
rmdir %cache_dir%\third_party /s/q
)
if %day_now% EQU 11 (
rmdir %cache_dir%\third_party /s/q
)
if %day_now% EQU 01 (
rmdir %cache_dir%\third_party /s/q
)
)
echo set -ex > cache.sh
echo md5_content=$(cat %work_dir:\=/%/cmake/external/*.cmake^|md5sum^|awk '{print $1}')$(git submodule status^|md5sum^|awk '{print $1}')>>cache.sh
echo echo ${md5_content}^>md5.txt>>cache.sh
%cache_dir%\tools\busybox64.exe cat cache.sh
%cache_dir%\tools\busybox64.exe bash cache.sh
set /p md5=< md5.txt
if "%WITH_GPU%"=="ON" (
set cuda_version=%CUDA_TOOLKIT_ROOT_DIR:~-4%
set sub_dir=cuda!cuda_version:.=!
) else (
set sub_dir=cpu
)
cd /d %work_dir%
python -c "import wget;wget.download('https://paddle-github-action.bj.bcebos.com/windows/third_party_code/%sub_dir%/%md5%.tar.zst')"
if !ERRORLEVEL! EQU 0 (
echo Getting source code of third party : extracting ...
zstd -d %md5%.tar.zst && tar -xf %md5%.tar
del %md5%.tar.zst
if !errorlevel! EQU 0 (
echo Getting source code of third party : successful
)
) else (
git config -f .gitmodules submodule.third_party/openvino.update none && git submodule sync third_party/openvino
git submodule update --init --recursive
if !errorlevel! EQU 0 (
set UPLOAD_TP_CODE=ON
)
)
if "%UPLOAD_TP_CODE%"=="ON" (
set BCE_FILE=%cache_dir%\bce-python-sdk-new\BosClient.py
echo Uploading source code of third_party: checking bce ...
if not exist %cache_dir%\bce-python-sdk-new (
echo There is no bce in this PC, will install bce.
cd /d %cache_dir%
echo Download package from https://xly-devops.bj.bcebos.com/home/bos_new.tar.gz
python -c "import wget;wget.download('https://xly-devops.bj.bcebos.com/home/bos_new.tar.gz')"
python -c "import shutil;shutil.unpack_archive('bos_new.tar.gz', extract_dir='./bce-python-sdk-new',format='gztar')"
)
python -m pip install pycryptodome
python -m pip install bce-python-sdk==0.8.74
if !errorlevel! EQU 0 (
cd /d %work_dir%
echo Uploading source code of third party: compressing ...
tar -cf %md5%.tar ./third_party ./.git/modules && zstd %md5%.tar
if !errorlevel! EQU 0 (
echo Uploading source code of third party: uploading ...
python !BCE_FILE! %md5%.tar.zst paddle-github-action/windows/third_party_code/%sub_dir% 1>nul
if !errorlevel! EQU 0 (
echo Upload source code of third party %md5% to bos paddle-github-action/windows/third_party_code/%sub_dir% successfully.
) else (
echo Failed upload source code of third party to bos, reason: upload failed.
)
) else (
echo Failed upload source code of third party to bos, reason: compress failed.
)
del %md5%.tar.zst
) else (
echo Failed upload source code of third party to bos, reason: install bce failed.
)
)
set THIRD_PARTY_HOME=%cache_dir:\=/%/third_party/%sub_dir%
set THIRD_PARTY_PATH=%THIRD_PARTY_HOME%/%md5%
echo this is a CI-Windows task, will try to reuse bos and local third_party cache both.
:cmake_impl
if "%WITH_TESTING%"=="ON" (
cd /d %work_dir%\%BUILD_DIR%
rem whether to run cpp test
python -m pip install PyGithub
python %work_dir%\tools\check_only_change_python_files.py
if exist %work_dir%\%BUILD_DIR%\only_change_python_file.txt set WITH_CPP_TEST=OFF
echo WITH_CPP_TEST: %WITH_CPP_TEST%
)
cd /d %work_dir%\%BUILD_DIR%
echo cmake .. -G %GENERATOR% -DCMAKE_BUILD_TYPE=Release -DWITH_AVX=%WITH_AVX% -DWITH_GPU=%WITH_GPU% -DWITH_MKL=%WITH_MKL% ^
-DWITH_TESTING=%WITH_TESTING% -DWITH_PYTHON=%WITH_PYTHON% -DPYTHON_EXECUTABLE=%PYTHON_EXECUTABLE% -DON_INFER=%ON_INFER% ^
-DWITH_INFERENCE_API_TEST=%WITH_INFERENCE_API_TEST% -DTHIRD_PARTY_PATH=%THIRD_PARTY_PATH% ^
-DINFERENCE_DEMO_INSTALL_DIR=%INFERENCE_DEMO_INSTALL_DIR% -DWITH_STATIC_LIB=%WITH_STATIC_LIB% ^
-DWITH_TENSORRT=%WITH_TENSORRT% -DTENSORRT_ROOT="%TENSORRT_ROOT%" -DMSVC_STATIC_CRT=%MSVC_STATIC_CRT% ^
-DWITH_UNITY_BUILD=%WITH_UNITY_BUILD% -DCUDA_ARCH_NAME=%CUDA_ARCH_NAME% -DCUDA_ARCH_BIN=%CUDA_ARCH_BIN% -DCUB_PATH=%THIRD_PARTY_HOME%/cub ^
-DCUDA_TOOLKIT_ROOT_DIR="%CUDA_TOOLKIT_ROOT_DIR%" -DNEW_RELEASE_ALL=%NEW_RELEASE_ALL% -DNEW_RELEASE_PYPI=%NEW_RELEASE_PYPI% ^
-DNEW_RELEASE_JIT=%NEW_RELEASE_JIT% -DWITH_ONNXRUNTIME=%WITH_ONNXRUNTIME% -DWITH_CPP_TEST=%WITH_CPP_TEST% ^
-DWIN_UNITTEST_LEVEL=%WIN_UNITTEST_LEVEL% -DWITH_NIGHTLY_BUILD=%WITH_NIGHTLY_BUILD% -DWITH_PIP_CUDA_LIBRARIES=%WITH_PIP_CUDA_LIBRARIES% ^
-DWITH_SCCACHE=%WITH_SCCACHE% -DWITH_SHARED_PHI=%WITH_SHARED_PHI% >> %work_dir%\win_cmake.sh
echo cmake .. -G %GENERATOR% -DCMAKE_BUILD_TYPE=Release -DWITH_AVX=%WITH_AVX% -DWITH_GPU=%WITH_GPU% -DWITH_MKL=%WITH_MKL% ^
-DWITH_TESTING=%WITH_TESTING% -DWITH_PYTHON=%WITH_PYTHON% -DPYTHON_EXECUTABLE=%PYTHON_EXECUTABLE% -DON_INFER=%ON_INFER% ^
-DWITH_INFERENCE_API_TEST=%WITH_INFERENCE_API_TEST% -DTHIRD_PARTY_PATH=%THIRD_PARTY_PATH% ^
-DINFERENCE_DEMO_INSTALL_DIR=%INFERENCE_DEMO_INSTALL_DIR% -DWITH_STATIC_LIB=%WITH_STATIC_LIB% ^
-DWITH_TENSORRT=%WITH_TENSORRT% -DTENSORRT_ROOT="%TENSORRT_ROOT%" -DMSVC_STATIC_CRT=%MSVC_STATIC_CRT% ^
-DWITH_UNITY_BUILD=%WITH_UNITY_BUILD% -DCUDA_ARCH_NAME=%CUDA_ARCH_NAME% -DCUDA_ARCH_BIN=%CUDA_ARCH_BIN% -DCUB_PATH=%THIRD_PARTY_HOME%/cub ^
-DCUDA_TOOLKIT_ROOT_DIR="%CUDA_TOOLKIT_ROOT_DIR%" -DNEW_RELEASE_ALL=%NEW_RELEASE_ALL% -DNEW_RELEASE_PYPI=%NEW_RELEASE_PYPI% ^
-DNEW_RELEASE_JIT=%NEW_RELEASE_JIT% -DWITH_ONNXRUNTIME=%WITH_ONNXRUNTIME% -DWITH_CPP_TEST=%WITH_CPP_TEST% ^
-DWIN_UNITTEST_LEVEL=%WIN_UNITTEST_LEVEL% -DWITH_NIGHTLY_BUILD=%WITH_NIGHTLY_BUILD% -DWITH_PIP_CUDA_LIBRARIES=%WITH_PIP_CUDA_LIBRARIES% ^
-DWITH_SCCACHE=%WITH_SCCACHE% -DWITH_SHARED_PHI=%WITH_SHARED_PHI%
cmake .. -G %GENERATOR% -DCMAKE_BUILD_TYPE=Release -DWITH_AVX=%WITH_AVX% -DWITH_GPU=%WITH_GPU% -DWITH_MKL=%WITH_MKL% ^
-DWITH_TESTING=%WITH_TESTING% -DWITH_PYTHON=%WITH_PYTHON% -DPYTHON_EXECUTABLE=%PYTHON_EXECUTABLE% -DON_INFER=%ON_INFER% ^
-DWITH_INFERENCE_API_TEST=%WITH_INFERENCE_API_TEST% -DTHIRD_PARTY_PATH=%THIRD_PARTY_PATH% ^
-DINFERENCE_DEMO_INSTALL_DIR=%INFERENCE_DEMO_INSTALL_DIR% -DWITH_STATIC_LIB=%WITH_STATIC_LIB% ^
-DWITH_TENSORRT=%WITH_TENSORRT% -DTENSORRT_ROOT="%TENSORRT_ROOT%" -DMSVC_STATIC_CRT=%MSVC_STATIC_CRT% ^
-DWITH_UNITY_BUILD=%WITH_UNITY_BUILD% -DCUDA_ARCH_NAME=%CUDA_ARCH_NAME% -DCUDA_ARCH_BIN=%CUDA_ARCH_BIN% -DCUB_PATH=%THIRD_PARTY_HOME%/cub ^
-DCUDA_TOOLKIT_ROOT_DIR="%CUDA_TOOLKIT_ROOT_DIR%" -DNEW_RELEASE_ALL=%NEW_RELEASE_ALL% -DNEW_RELEASE_PYPI=%NEW_RELEASE_PYPI% ^
-DNEW_RELEASE_JIT=%NEW_RELEASE_JIT% -DWITH_ONNXRUNTIME=%WITH_ONNXRUNTIME% -DWITH_CPP_TEST=%WITH_CPP_TEST% ^
-DWIN_UNITTEST_LEVEL=%WIN_UNITTEST_LEVEL% -DWITH_NIGHTLY_BUILD=%WITH_NIGHTLY_BUILD% -DWITH_PIP_CUDA_LIBRARIES=%WITH_PIP_CUDA_LIBRARIES% ^
-DWITH_SCCACHE=%WITH_SCCACHE% -DWITH_SHARED_PHI=%WITH_SHARED_PHI%
goto:eof
:cmake_error
echo 7 > %cache_dir%\error_code.txt
type %cache_dir%\error_code.txt
echo Cmake failed, will exit!
exit /b 7
:begin_build
call :build || goto build_error
goto:eof
:build
echo ========================================
echo Step 2. Build Paddle ...
echo ========================================
for /F %%# in ('powershell -NoProfile -Command "(Get-CimInstance Win32_Processor).NumberOfLogicalProcessors"') do set /a PARALLEL_PROJECT_COUNT=%%#*4/5
echo "PARALLEL PROJECT COUNT is %PARALLEL_PROJECT_COUNT%"
set build_times=1
set retry_times=1
rem MSbuild will build third_party first to improve compiler stability.
if NOT "%GENERATOR%" == "Ninja" (
goto :build_tp
) else (
goto :build_paddle
)
:build_tp
echo Build third_party the %build_times% time:
if "%GENERATOR%" == "Ninja" (
ninja third_party
) else (
MSBuild /m /p:PreferredToolArchitecture=x64 /p:Configuration=Release /verbosity:%LOG_LEVEL% third_party.vcxproj
)
if %ERRORLEVEL% NEQ 0 (
set /a build_times=%build_times%+1
if %build_times% GEQ %retry_times% (
exit /b 7
) else (
echo Build third_party failed, will retry!
goto :build_tp
)
)
echo Build third_party successfully!
set build_times=1
:build_paddle
:: reset clcache zero stats for collect PR's actual hit rate
rem clcache.exe -z
rem -------clean up environment again-----------
taskkill /f /im cmake.exe /t 2>NUL
taskkill /f /im MSBuild.exe /t 2>NUL
taskkill /f /im cl.exe /t 2>NUL
taskkill /f /im lib.exe /t 2>NUL
taskkill /f /im link.exe /t 2>NUL
taskkill /f /im vctip.exe /t 2>NUL
taskkill /f /im cvtres.exe /t 2>NUL
taskkill /f /im rc.exe /t 2>NUL
taskkill /f /im mspdbsrv.exe /t 2>NUL
taskkill /f /im csc.exe /t 2>NUL
taskkill /f /im nvcc.exe /t 2>NUL
taskkill /f /im cicc.exe /t 2>NUL
taskkill /f /im ptxas.exe /t 2>NUL
taskkill /f /im eager_generator.exe /t 2>NUL
taskkill /f /im eager_legacy_op_function_generator.exe /t 2>NUL
wmic process where name="eager_generator.exe" call terminate 2>NUL
wmic process where name="eager_legacy_op_function_generator.exe" call terminate 2>NUL
wmic process where name="cmake.exe" call terminate 2>NUL
wmic process where name="cvtres.exe" call terminate 2>NUL
wmic process where name="rc.exe" call terminate 2>NUL
wmic process where name="cl.exe" call terminate 2>NUL
wmic process where name="lib.exe" call terminate 2>NUL
if "%WITH_TESTING%"=="ON" (
for /F "tokens=1 delims= " %%# in ('tasklist ^| findstr /i test') do taskkill /f /im %%# /t
)
echo Build Paddle the %build_times% time:
if "%GENERATOR%" == "Ninja" (
set > env_vars.txt
ninja all
) else (
MSBuild /m:%PARALLEL_PROJECT_COUNT% /p:PreferredToolArchitecture=x64 /p:TrackFileAccess=false /p:Configuration=Release /verbosity:%LOG_LEVEL% ALL_BUILD.vcxproj
)
if %ERRORLEVEL% NEQ 0 (
set /a build_times=%build_times%+1
if %build_times% GEQ %retry_times% (
exit /b 7
) else (
echo Build Paddle failed, will retry!
goto :build_paddle
)
)
echo Build Paddle successfully!
echo 0 > %cache_dir%\error_code.txt
type %cache_dir%\error_code.txt
echo PATH=%PATH%>> %GITHUB_ENV%
echo THIRD_PARTY_HOME=%THIRD_PARTY_HOME%>> %GITHUB_ENV%
echo THIRD_PARTY_PATH=%THIRD_PARTY_PATH%>> %GITHUB_ENV%
echo CUDA_TOOLKIT_ROOT_DIR=%CUDA_TOOLKIT_ROOT_DIR%>> %GITHUB_ENV%
:: ci will collect sccache hit rate
if "%WITH_SCCACHE%"=="ON" (
call :collect_sccache_hits
)
goto:timesummary
:build_error
echo 7 > %cache_dir%\error_code.txt
type %cache_dir%\error_code.txt
echo Build Paddle failed, will exit!
exit /b 7
:timesummary
for /f "usebackq" %%i in (`powershell -NoProfile -Command "Get-Date -Format 'yyyyMMddHHmmss'"`) do set end=%%i
set end=%end:~4,10%
call :timestamp "%start%" "%end%" "Build"
goto:eof
:timestamp
@ECHO OFF
set start=%~1
set dd=%start:~2,2%
set /a dd=100%dd%%%100
set hh=%start:~4,2%
set /a hh=100%hh%%%100
set nn=%start:~6,2%
set /a nn=100%nn%%%100
set ss=%start:~8,2%
set /a ss=100%ss%%%100
set /a start_sec=dd*86400+hh*3600+nn*60+ss
echo %start_sec%
set end=%~2
set dd=%end:~2,2%
set /a dd=100%dd%%%100
if %start:~0,2% NEQ %end:~0,2% (
set month_day=0
for %%i in (01 03 05 07 08 10 12) DO if %%i EQU %start:~0,2% set month_day=31
for %%i in (04 06 09 11) DO if %%i EQU %start:~0,2% set month_day=30
for %%i in (02) DO if %%i EQU %start:~0,2% set month_day=28
set /a dd=%dd%+!month_day!
)
set hh=%end:~4,2%
set /a hh=100%hh%%%100
set nn=%end:~6,2%
set /a nn=100%nn%%%100
set ss=%end:~8,2%
set /a ss=100%ss%%%100
set /a end_secs=dd*86400+hh*3600+nn*60+ss
set /a cost_secs=end_secs-start_sec
echo "Windows %~3 Time: %cost_secs%s"
set tempTaskName=%~3
echo ipipe_log_param_Windows_%tempTaskName: =_%_Time: %cost_secs%s
goto:eof
:collect_sccache_hits
sccache -s > sccache_summary.txt
echo ========================================
echo sccache statistical summary ...
echo ========================================
type sccache_summary.txt
for /f "tokens=2,3" %%i in ('type sccache_summary.txt ^| findstr "requests hits" ^| findstr /V "executed C/C++ CUDA"') do set %%i=%%j
if %requests% EQU 0 (
echo "sccache hit rate: 0%"
echo ipipe_log_param_sccache_Hit_Hate: 0%
) else (
set /a rate=!hits!*10000/!requests!
echo "sccache hit rate: !rate:~0,-2!.!rate:~-2!%%"
echo ipipe_log_param_sccache_Hit_Hate: !rate:~0,-2!.!rate:~-2!%%
)
goto:eof