Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
bitsandbytes
Commits
3c9aca91
"...git@developer.sourcefind.cn:renzhc/diffusers_dcu.git" did not exist on "168e5b7ffa4949fca82ed2fcd17d3451c5804401"
Commit
3c9aca91
authored
Aug 03, 2023
by
Tim Dettmers
Browse files
Fixed two bugs in dynamic data type creation.
parent
a06a0f6a
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
24 additions
and
17 deletions
+24
-17
bitsandbytes/functional.py
bitsandbytes/functional.py
+9
-9
tests/test_functional.py
tests/test_functional.py
+15
-8
No files found.
bitsandbytes/functional.py
View file @
3c9aca91
...
@@ -322,10 +322,8 @@ def create_dynamic_map(signed=True, max_exponent_bits=7, total_bits=8):
...
@@ -322,10 +322,8 @@ def create_dynamic_map(signed=True, max_exponent_bits=7, total_bits=8):
# these are additional items that come from the case
# these are additional items that come from the case
# where all the exponent bits are zero and no
# where all the exponent bits are zero and no
# indicator bit is present
# indicator bit is present
non_sign_bits
=
total_bits
-
(
1
if
signed
else
0
)
non_sign_bits
=
total_bits
-
(
1
if
signed
else
1
)
additional_items
=
2
**
(
non_sign_bits
-
max_exponent_bits
)
-
1
additional_items
=
2
**
(
non_sign_bits
-
max_exponent_bits
)
-
1
if
not
signed
:
additional_items
=
2
*
additional_items
for
i
in
range
(
max_exponent_bits
):
for
i
in
range
(
max_exponent_bits
):
fraction_items
=
int
((
2
**
(
i
+
non_sign_bits
-
max_exponent_bits
)
+
1
if
signed
else
2
**
(
i
+
non_sign_bits
-
max_exponent_bits
+
1
)
+
1
))
fraction_items
=
int
((
2
**
(
i
+
non_sign_bits
-
max_exponent_bits
)
+
1
if
signed
else
2
**
(
i
+
non_sign_bits
-
max_exponent_bits
+
1
)
+
1
))
boundaries
=
torch
.
linspace
(
0.1
,
1
,
fraction_items
)
boundaries
=
torch
.
linspace
(
0.1
,
1
,
fraction_items
)
...
@@ -334,16 +332,18 @@ def create_dynamic_map(signed=True, max_exponent_bits=7, total_bits=8):
...
@@ -334,16 +332,18 @@ def create_dynamic_map(signed=True, max_exponent_bits=7, total_bits=8):
if
signed
:
if
signed
:
data
+=
(
-
(
10
**
(
-
(
max_exponent_bits
-
1
)
+
i
))
*
means
).
tolist
()
data
+=
(
-
(
10
**
(
-
(
max_exponent_bits
-
1
)
+
i
))
*
means
).
tolist
()
if
additional_items
>
0
:
if
additional_items
>
0
:
boundaries
=
torch
.
linspace
(
0.1
,
1
,
additional_items
+
1
)
boundaries
=
torch
.
linspace
(
0.1
,
1
,
additional_items
+
1
)
means
=
(
boundaries
[:
-
1
]
+
boundaries
[
1
:])
/
2.0
means
=
(
boundaries
[:
-
1
]
+
boundaries
[
1
:])
/
2.0
data
+=
((
10
**
(
-
(
max_exponent_bits
-
1
)
+
i
))
*
means
).
tolist
()
data
+=
((
10
**
(
-
(
max_exponent_bits
-
1
)
+
i
))
*
means
).
tolist
()
if
signed
:
if
signed
:
data
+=
(
-
(
10
**
(
-
(
max_exponent_bits
-
1
)
+
i
))
*
means
).
tolist
()
data
+=
(
-
(
10
**
(
-
(
max_exponent_bits
-
1
)
+
i
))
*
means
).
tolist
()
data
.
append
(
0
)
data
.
append
(
0
)
data
.
append
(
1.0
)
data
.
append
(
1.0
)
assert
len
(
data
)
==
2
**
total_bits
gap
=
256
-
len
(
data
)
gap
=
256
-
len
(
data
)
for
i
in
range
(
gap
):
for
i
in
range
(
gap
):
data
.
append
(
0
)
data
.
append
(
0
)
...
...
tests/test_functional.py
View file @
3c9aca91
...
@@ -129,6 +129,7 @@ def test_quantile_quantization():
...
@@ -129,6 +129,7 @@ def test_quantile_quantization():
assert
diff
<
0.001
assert
diff
<
0.001
def
test_dynamic_quantization
():
def
test_dynamic_quantization
():
diffs
=
[]
diffs
=
[]
reldiffs
=
[]
reldiffs
=
[]
...
@@ -141,8 +142,8 @@ def test_dynamic_quantization():
...
@@ -141,8 +142,8 @@ def test_dynamic_quantization():
diffs
.
append
(
diff
.
mean
().
item
())
diffs
.
append
(
diff
.
mean
().
item
())
reldiffs
.
append
(
reldiff
.
mean
().
item
())
reldiffs
.
append
(
reldiff
.
mean
().
item
())
assert
diff
.
mean
().
item
()
<
0.0135
assert
diff
.
mean
().
item
()
<
0.0135
#
print(sum(diffs)/len(diffs))
print
(
sum
(
diffs
)
/
len
(
diffs
))
#
print(sum(reldiffs)/len(reldiffs))
print
(
sum
(
reldiffs
)
/
len
(
reldiffs
))
for
i
in
range
(
100
):
for
i
in
range
(
100
):
A1
=
torch
.
rand
(
1024
,
1024
,
device
=
"cuda"
)
A1
=
torch
.
rand
(
1024
,
1024
,
device
=
"cuda"
)
...
@@ -157,7 +158,8 @@ def test_dynamic_quantization():
...
@@ -157,7 +158,8 @@ def test_dynamic_quantization():
@
pytest
.
mark
.
parametrize
(
"dtype"
,
[
torch
.
float32
,
torch
.
float16
,
torch
.
bfloat16
],
ids
=
[
"fp32"
,
"fp16"
,
"bf16"
])
@
pytest
.
mark
.
parametrize
(
"dtype"
,
[
torch
.
float32
,
torch
.
float16
,
torch
.
bfloat16
],
ids
=
[
"fp32"
,
"fp16"
,
"bf16"
])
@
pytest
.
mark
.
parametrize
(
"nested"
,
[
False
,
True
],
ids
=
[
"False"
,
"True"
])
@
pytest
.
mark
.
parametrize
(
"nested"
,
[
False
,
True
],
ids
=
[
"False"
,
"True"
])
@
pytest
.
mark
.
parametrize
(
"blocksize"
,
[
4096
,
2048
,
1024
,
512
,
256
,
128
,
64
])
@
pytest
.
mark
.
parametrize
(
"blocksize"
,
[
4096
,
2048
,
1024
,
512
,
256
,
128
,
64
])
def
test_dynamic_blockwise_quantization
(
dtype
,
nested
,
blocksize
):
@
pytest
.
mark
.
parametrize
(
"signed"
,
[
True
,
False
],
ids
=
[
'signed_True'
,
'signed_False'
])
def
test_dynamic_blockwise_quantization
(
dtype
,
nested
,
blocksize
,
signed
):
#print('')
#print('')
diffs
=
[]
diffs
=
[]
reldiffs
=
[]
reldiffs
=
[]
...
@@ -178,9 +180,10 @@ def test_dynamic_blockwise_quantization(dtype, nested, blocksize):
...
@@ -178,9 +180,10 @@ def test_dynamic_blockwise_quantization(dtype, nested, blocksize):
assert
A2
.
dtype
==
dtype
assert
A2
.
dtype
==
dtype
diffs
=
[]
diffs
=
[]
code
=
F
.
create_dynamic_map
(
signed
=
signed
)
for
i
in
range
(
100
):
for
i
in
range
(
100
):
A1
=
torch
.
rand
(
1024
,
1024
,
device
=
"cuda"
,
dtype
=
dtype
)
A1
=
torch
.
rand
(
1024
,
1024
,
device
=
"cuda"
,
dtype
=
dtype
)
C
,
S
=
F
.
quantize_blockwise
(
A1
,
blocksize
=
blocksize
,
nested
=
nested
)
C
,
S
=
F
.
quantize_blockwise
(
A1
,
blocksize
=
blocksize
,
nested
=
nested
,
code
=
code
)
A2
=
F
.
dequantize_blockwise
(
C
,
S
)
A2
=
F
.
dequantize_blockwise
(
C
,
S
)
diff
=
torch
.
abs
(
A1
-
A2
).
float
()
diff
=
torch
.
abs
(
A1
-
A2
).
float
()
reldiff
=
diff
/
torch
.
abs
(
A1
.
float
()
+
1e-8
)
reldiff
=
diff
/
torch
.
abs
(
A1
.
float
()
+
1e-8
)
...
@@ -189,11 +192,15 @@ def test_dynamic_blockwise_quantization(dtype, nested, blocksize):
...
@@ -189,11 +192,15 @@ def test_dynamic_blockwise_quantization(dtype, nested, blocksize):
#torch.testing.assert_close(A1, A2, atol=1e-2, rtol=0)
#torch.testing.assert_close(A1, A2, atol=1e-2, rtol=0)
abserr
=
sum
(
diffs
)
/
len
(
diffs
)
abserr
=
sum
(
diffs
)
/
len
(
diffs
)
relerr
=
sum
(
reldiffs
)
/
len
(
reldiffs
)
relerr
=
sum
(
reldiffs
)
/
len
(
reldiffs
)
assert
abserr
<
0.0035
if
signed
:
assert
relerr
<
0.015
assert
abserr
<
0.0035
assert
relerr
<
0.015
else
:
assert
abserr
<
0.00175
assert
relerr
<
0.012
assert
A2
.
dtype
==
dtype
assert
A2
.
dtype
==
dtype
#print('nested=', nested, 'rand', blocksize, sum(diffs)/len(diffs))
#print(
'signed=', signed,
'nested=', nested, 'rand', blocksize, sum(diffs)/len(diffs))
#print('nested=', nested, 'rand', blocksize, sum(reldiffs)/len(reldiffs))
#print(
'signed=', signed,
'nested=', nested, 'rand', blocksize, sum(reldiffs)/len(reldiffs))
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment