Skip to content

Commit 5cd255e

Browse files
yiliu30XuehaoSun
andauthored
HPU only release binary (#302)
Signed-off-by: yiliu30 <[email protected]> Signed-off-by: Sun, Xuehao <[email protected]> Co-authored-by: Sun, Xuehao <[email protected]>
1 parent c5687ba commit 5cd255e

File tree

19 files changed

+339
-54
lines changed

19 files changed

+339
-54
lines changed

.azure-pipelines/scripts/ut/run_ut.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ LOG_DIR=/auto-round/log_dir
1818
mkdir -p ${LOG_DIR}
1919
ut_log_name=${LOG_DIR}/ut.log
2020

21-
find . -name "test*.py" | sed "s,\.\/,python -m pytest --cov=\"${auto_round_path}\" --cov-report term --html=report.html --self-contained-html --cov-report xml:coverage.xml --cov-append -vs --disable-warnings ,g" > run.sh
21+
find . -name "test*.py" ! -name "*hpu_only*.py" | sed "s,\.\/,python -m pytest --cov=\"${auto_round_path}\" --cov-report term --html=report.html --self-contained-html --cov-report xml:coverage.xml --cov-append -vs --disable-warnings ,g" > run.sh
2222
cat run.sh
2323
bash run.sh 2>&1 | tee ${ut_log_name}
2424

@@ -33,4 +33,4 @@ fi
3333
# if ut pass, collect the coverage file into artifacts
3434
cp .coverage ${LOG_DIR}/.coverage
3535

36-
echo "UT finished successfully! "
36+
echo "UT finished successfully! "
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/bin/bash
2+
set -xe
3+
4+
# install requirements
5+
echo "set up UT env..."
6+
pip install pytest-cov pytest-html
7+
pip list
8+
9+
cd /auto-round/test || exit 1
10+
find . -type f -exec sed -i '/sys\.path\.insert(0, "\.\.")/d' {} +
11+
12+
export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
13+
export FORCE_BF16=1
14+
export COVERAGE_RCFILE=/auto-round/.azure-pipelines/scripts/ut/.coverage
15+
auto_round_path=$(python -c 'import auto_round; print(auto_round.__path__[0])')
16+
17+
LOG_DIR=/auto-round/log_dir
18+
mkdir -p ${LOG_DIR}
19+
ut_log_name=${LOG_DIR}/ut.log
20+
21+
find . -name "test*hpu_only.py" | sed "s,\.\/,python -m pytest --cov=\"${auto_round_path}\" --cov-report term --html=report.html --self-contained-html --cov-report xml:coverage.xml --cov-append -vs --disable-warnings ,g" > run.sh
22+
cat run.sh
23+
bash run.sh 2>&1 | tee ${ut_log_name}
24+
25+
cp report.html ${LOG_DIR}/
26+
cp coverage.xml ${LOG_DIR}/
27+
28+
if [ $(grep -c '== FAILURES ==' ${ut_log_name}) != 0 ] || [ $(grep -c '== ERRORS ==' ${ut_log_name}) != 0 ] || [ $(grep -c ' passed' ${ut_log_name}) == 0 ]; then
29+
echo "Find errors in pytest case, please check the output..."
30+
exit 1
31+
fi
32+
33+
# if ut pass, collect the coverage file into artifacts
34+
cp .coverage ${LOG_DIR}/.coverage
35+
36+
echo "UT finished successfully! "

.azure-pipelines/template/docker-template.yml

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ parameters:
1616
- name: repo
1717
type: string
1818
default: "https://github.com/intel/auto-round"
19+
- name: imageSource
20+
type: string
21+
default: "build"
1922

2023
steps:
2124
- task: Bash@3
@@ -24,7 +27,7 @@ steps:
2427
script: |
2528
docker ps -a
2629
if [[ $(docker ps -a | grep -i '${{ parameters.containerName }}'$) ]]; then
27-
docker start $(docker ps -aq)
30+
docker start ${{ parameters.containerName }}
2831
echo "remove left files through container ..."
2932
docker exec ${{ parameters.containerName }} bash -c "ls -a /auto-round && rm -fr /auto-round/* && rm -fr /auto-round/.* && ls -a /auto-round || true"
3033
fi
@@ -33,7 +36,6 @@ steps:
3336
- ${{ if eq(parameters.dockerConfigName, 'commonDockerConfig') }}:
3437
- script: |
3538
rm -fr ${BUILD_SOURCESDIRECTORY} || sudo rm -fr ${BUILD_SOURCESDIRECTORY} || true
36-
echo y | docker system prune
3739
displayName: "Clean workspace"
3840
3941
- checkout: self
@@ -45,7 +47,6 @@ steps:
4547
rm -fr ${BUILD_SOURCESDIRECTORY} || sudo rm -fr ${BUILD_SOURCESDIRECTORY} || true
4648
mkdir ${BUILD_SOURCESDIRECTORY}
4749
chmod 777 ${BUILD_SOURCESDIRECTORY}
48-
echo y | docker system prune
4950
displayName: "Clean workspace"
5051
5152
- checkout: none
@@ -57,20 +58,26 @@ steps:
5758
git checkout main
5859
displayName: "Checkout out main"
5960
60-
- script: |
61-
if [[ ! $(docker images | grep -i ${{ parameters.repoName }}:${{ parameters.repoTag }}) ]]; then
62-
cd ${BUILD_SOURCESDIRECTORY}
63-
docker build -f .azure-pipelines/docker/${{parameters.dockerFileName}}.devel -t ${{ parameters.repoName }}:${{ parameters.repoTag }} .
64-
fi
65-
docker images | grep -i ${{ parameters.repoName }}
66-
if [[ $? -ne 0 ]]; then
67-
echo "NO Such Repo"
68-
exit 1
69-
fi
70-
displayName: "Build develop docker image"
61+
- ${{ if eq(parameters.imageSource, 'build') }}:
62+
- script: |
63+
docker image prune -a -f
64+
if [[ ! $(docker images | grep -i ${{ parameters.repoName }}:${{ parameters.repoTag }}) ]]; then
65+
docker build -f ${BUILD_SOURCESDIRECTORY}/.azure-pipelines/docker/${{parameters.dockerFileName}}.devel -t ${{ parameters.repoName }}:${{ parameters.repoTag }} .
66+
fi
67+
docker images | grep -i ${{ parameters.repoName }}
68+
if [[ $? -ne 0 ]]; then
69+
echo "NO Such Repo"
70+
exit 1
71+
fi
72+
displayName: "Build develop docker image"
73+
74+
- ${{ if eq(parameters.imageSource, 'pull') }}:
75+
- script: |
76+
docker pull vault.habana.ai/gaudi-docker/1.18.0/ubuntu22.04/habanalabs/pytorch-installer-2.4.0:latest
77+
displayName: "Pull habana docker image"
7178
7279
- script: |
73-
docker stop $(docker ps -aq)
80+
docker stop ${{ parameters.containerName }}
7481
docker rm -vf ${{ parameters.containerName }} || true
7582
env | sort
7683
displayName: "Clean docker container"
@@ -80,8 +87,15 @@ steps:
8087
inputs:
8188
targetType: "inline"
8289
script: |
83-
docker run -dit --disable-content-trust --privileged --name=${{ parameters.containerName }} --shm-size="2g" \
84-
-v ${BUILD_SOURCESDIRECTORY}:/auto-round -v /tf_dataset:/tf_dataset -v /tf_dataset2:/tf_dataset2 ${{ parameters.repoName }}:${{ parameters.repoTag }}
90+
if [[ "${{ parameters.imageSource }}" == "build" ]]; then
91+
docker run -dit --disable-content-trust --privileged --name=${{ parameters.containerName }} --shm-size="2g" \
92+
-v ${BUILD_SOURCESDIRECTORY}:/auto-round -v /tf_dataset:/tf_dataset -v /tf_dataset2:/tf_dataset2 \
93+
${{ parameters.repoName }}:${{ parameters.repoTag }}
94+
else
95+
docker run -dit --disable-content-trust --privileged --name=${{ parameters.containerName }} --shm-size="2g" \
96+
--runtime=habana -e HABANA_VISIBLE_DEVICES=all -e OMPI_MCA_btl_vader_single_copy_mechanism=none --cap-add=sys_nice --net=host --ipc=host \
97+
-v ${BUILD_SOURCESDIRECTORY}:/auto-round vault.habana.ai/gaudi-docker/1.18.0/ubuntu22.04/habanalabs/pytorch-installer-2.4.0:latest
98+
fi
8599
echo "Show the container list after docker run ... "
86100
docker ps -a
87101
displayName: "Docker run - ${{ parameters.containerName }} Container"

.azure-pipelines/template/ut-template.yml

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ parameters:
1717
- name: utContainerName
1818
type: string
1919
default: "AutoRoundUnitTest"
20+
- name: imageSource
21+
type: string
22+
default: "build"
2023

2124
steps:
2225
- template: docker-template.yml
@@ -27,14 +30,23 @@ steps:
2730
dockerFileName: "Dockerfile"
2831
containerName: ${{ parameters.utContainerName }}
2932
repo: ${{ parameters.repo }}
33+
imageSource: ${{ parameters.imageSource }}
3034

31-
- script: |
32-
docker exec ${{ parameters.utContainerName }} bash -c "cd /auto-round \
33-
&& pip install -r requirements.txt \
34-
&& python setup.py bdist_wheel && rm -rf build \
35-
&& pip install dist/auto_round*.whl \
36-
&& pip list"
37-
displayName: "Env Setup"
35+
- ${{ if eq(parameters.imageSource, 'build') }}:
36+
- script: |
37+
docker exec ${{ parameters.utContainerName }} bash -c "cd /auto-round \
38+
&& pip install -r requirements.txt \
39+
&& python setup.py bdist_wheel && rm -rf build \
40+
&& pip install dist/auto_round*.whl \
41+
&& pip list"
42+
displayName: "Env Setup"
43+
44+
- ${{ if eq(parameters.imageSource, 'pull') }}:
45+
- script: |
46+
docker exec ${{ parameters.utContainerName }} bash -c "cd /auto-round \
47+
&& python setup.py install hpu \
48+
&& pip list"
49+
displayName: "HPU Env Setup"
3850
3951
- script: |
4052
docker exec ${{ parameters.utContainerName }} bash -c "cd /auto-round/.azure-pipelines/scripts \
@@ -54,4 +66,6 @@ steps:
5466
targetType: "inline"
5567
script: |
5668
docker exec ${{ parameters.utContainerName }} bash -c "rm -rf /auto-round/* && rm -rf /auto-round/.* || true"
69+
docker stop ${{ parameters.utContainerName }}
70+
docker rm -vf ${{ parameters.utContainerName }} || true
5771
displayName: "Docker clean up"

.azure-pipelines/unit-test-hpu.yml

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
trigger: none
2+
3+
pr:
4+
autoCancel: true
5+
drafts: false
6+
branches:
7+
include:
8+
- main
9+
paths:
10+
include:
11+
- auto_round
12+
- test/test*hpu*'
13+
- setup.py
14+
- requirements-hpu.txt
15+
- .azure-pipelines/scripts/ut
16+
exclude:
17+
- auto_round/export/export_to_autogptq
18+
- auto_round/export/export_to_awq
19+
20+
pool: GAUDI
21+
22+
variables:
23+
IMAGE_NAME: "auto-round"
24+
IMAGE_TAG: "py310"
25+
UPLOAD_PATH: $(Build.SourcesDirectory)/log_dir
26+
DOWNLOAD_PATH: $(Build.SourcesDirectory)/log_dir
27+
ARTIFACT_NAME: "UT_coverage_report"
28+
REPO: $(Build.Repository.Uri)
29+
30+
stages:
31+
- stage: Unit_test
32+
displayName: Unit Test
33+
dependsOn: []
34+
jobs:
35+
- job:
36+
displayName: Unit Test
37+
steps:
38+
- template: template/ut-template.yml
39+
parameters:
40+
imageSource: "pull"
41+
dockerConfigName: "commonDockerConfig"
42+
utScriptFileName: "run_ut_hpu"
43+
uploadPath: $(UPLOAD_PATH)
44+
utArtifact: "ut"
45+
46+
- stage: Unit_test_baseline
47+
displayName: Unit Test Baseline
48+
dependsOn: []
49+
jobs:
50+
- job:
51+
displayName: Unit Test
52+
steps:
53+
- template: template/ut-template.yml
54+
parameters:
55+
imageSource: "pull"
56+
dockerConfigName: "gitCloneDockerConfig"
57+
utScriptFileName: "run_ut_hpu"
58+
uploadPath: $(UPLOAD_PATH)
59+
utArtifact: "ut_baseline"
60+
repo: $(REPO)
61+
62+
- stage: Coverage
63+
displayName: "Coverage Compare"
64+
pool:
65+
vmImage: "ubuntu-latest"
66+
dependsOn: [Unit_test, Unit_test_baseline]
67+
jobs:
68+
- job: CollectDatafiles
69+
steps:
70+
- script: |
71+
if [[ ! $(docker images | grep -i ${IMAGE_NAME}:${IMAGE_TAG}) ]]; then
72+
docker build -f ${BUILD_SOURCESDIRECTORY}/.azure-pipelines/docker/Dockerfile.devel -t ${IMAGE_NAME}:${IMAGE_TAG} .
73+
fi
74+
docker images | grep -i ${IMAGE_NAME}
75+
if [[ $? -ne 0 ]]; then
76+
echo "NO Such Repo"
77+
exit 1
78+
fi
79+
displayName: "Build develop docker image"
80+
81+
- task: DownloadPipelineArtifact@2
82+
inputs:
83+
artifact:
84+
patterns: "*_coverage/.coverage"
85+
path: $(DOWNLOAD_PATH)
86+
87+
- script: |
88+
echo "--- create container ---"
89+
docker run -d -it --name="collectLogs" -v ${BUILD_SOURCESDIRECTORY}:/auto-round ${IMAGE_NAME}:${IMAGE_TAG} /bin/bash
90+
echo "--- docker ps ---"
91+
docker ps
92+
echo "--- collect logs ---"
93+
docker exec collectLogs bash -c "cd /auto-round \
94+
&& python setup.py install hpu \
95+
&& pip list"
96+
docker exec collectLogs /bin/bash +x -c "cd /auto-round/.azure-pipelines/scripts \
97+
&& bash ut/collect_log.sh"
98+
displayName: "Collect UT Coverage"
99+
100+
- task: PublishPipelineArtifact@1
101+
condition: succeededOrFailed()
102+
inputs:
103+
targetPath: $(UPLOAD_PATH)
104+
artifact: $(ARTIFACT_NAME)
105+
publishLocation: "pipeline"
106+
107+
- task: Bash@3
108+
condition: always()
109+
inputs:
110+
targetType: "inline"
111+
script: |
112+
docker exec collectLogs bash -c "rm -fr /auto-round/* && rm -fr /auto-round/.* || true"
113+
displayName: "Docker clean up"

.azure-pipelines/unit-test.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ pr:
1212
- auto_round_extension
1313
- test
1414
- setup.py
15-
- requirements_pt.txt
15+
- requirements.txt
1616
- .azure-pipelines/scripts/ut
17+
exclude:
18+
- test/test*hpu*
1719

1820
pool: ICX-16C
1921

auto_round/auto_quantizer.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,6 @@
4646

4747
from auto_round.backend import get_layer_backend, dynamic_import_inference_linear
4848

49-
import auto_round_extension.qbits.qlinear_qbits as qlinear_qbits
50-
import auto_round_extension.qbits.qlinear_qbits_gptq as qlinear_qbits_gptq
51-
import auto_round_extension.ipex.qlinear_ipex_gptq as qlinear_ipex_gptq
52-
import auto_round_extension.ipex.qlinear_ipex_awq as qlinear_ipex_awq
5349
from auto_round.backend import BackendInfos
5450
from transformers.utils.versions import require_version
5551
from enum import Enum
@@ -110,9 +106,6 @@ def is_auto_round_available():
110106
)
111107

112108

113-
if is_auto_round_available():
114-
from auto_round_extension.cuda.post_init import autoround_post_init
115-
116109

117110
#
118111
def get_device(obj: Union[torch.Tensor, nn.Module]):
@@ -588,12 +581,14 @@ def cpu_post_init(self, model):
588581

589582
for n, layer in tqdm(layers, desc=message, total=len(layers),
590583
leave=True):
591-
if isinstance(layer, (qlinear_qbits.QuantLinear, qlinear_qbits_gptq.QuantLinear)):
584+
from auto_round_extension.qbits import qbits_qlinear_classes
585+
from auto_round_extension.ipex import ipex_qlinear_classes
586+
if isinstance(layer, qbits_qlinear_classes):
592587
if dep_check:
593588
layer.req_check()
594589
layer.post_init()
595590
dep_check = False
596-
if isinstance(layer, (qlinear_ipex_gptq.QuantLinear, qlinear_ipex_awq.QuantLinear)):
591+
if isinstance(layer, ipex_qlinear_classes):
597592
layer.post_init()
598593

599594
return model
@@ -702,7 +697,7 @@ class StoreAttr(object):
702697
"marlin format requires gptqmodel to be installed, "
703698
"`pip install -v gptqmodel --no-build-isolation `")
704699
self.repack_marlin(model)
705-
700+
from auto_round_extension.cuda.post_init import autoround_post_init
706701
model = autoround_post_init(model)
707702
# there are no side-effects after call qbits_post_init when model quant-type not equal to qbits.
708703
if self.target_device == "cpu":

auto_round/autoround.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1216,7 +1216,7 @@ def save_quantized(self, output_dir=None, format="auto_round", inplace=True, **k
12161216
format = format.split(":")[0]
12171217
if format not in EXPORT_FORMAT:
12181218
logger.error(f"export format only supports {EXPORT_FORMAT.keys()}")
1219-
exit(-1)
1219+
raise ValueError(f"export format only supports {EXPORT_FORMAT.keys()}, but got {format}")
12201220
save_quantized_as_format = EXPORT_FORMAT.get(format)
12211221
if "gptq" in format and not self.sym:
12221222
logger.warning(

0 commit comments

Comments
 (0)