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
ModelZoo
Qwen-VL_pytorch
Commits
5e887c2c
Commit
5e887c2c
authored
May 31, 2024
by
wanglch
Browse files
Initial commit
parents
Pipeline
#1060
canceled with stages
Changes
101
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
247 additions
and
0 deletions
+247
-0
web_demo_mm.py
web_demo_mm.py
+247
-0
No files found.
web_demo_mm.py
0 → 100644
View file @
5e887c2c
# Copyright (c) Alibaba Cloud.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
"""A simple web interactive chat demo based on gradio."""
from
argparse
import
ArgumentParser
from
pathlib
import
Path
import
copy
import
gradio
as
gr
import
os
import
re
import
secrets
import
tempfile
from
modelscope
import
(
snapshot_download
,
AutoModelForCausalLM
,
AutoTokenizer
,
GenerationConfig
)
DEFAULT_CKPT_PATH
=
'qwen/Qwen-VL-Chat'
BOX_TAG_PATTERN
=
r
"<box>([\s\S]*?)</box>"
PUNCTUATION
=
"!?。"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛“”„‟…‧﹏."
def
_get_args
():
parser
=
ArgumentParser
()
parser
.
add_argument
(
"-c"
,
"--checkpoint-path"
,
type
=
str
,
default
=
DEFAULT_CKPT_PATH
,
help
=
"Checkpoint name or path, default to %(default)r"
)
parser
.
add_argument
(
"--cpu-only"
,
action
=
"store_true"
,
help
=
"Run demo with CPU only"
)
parser
.
add_argument
(
"--share"
,
action
=
"store_true"
,
default
=
False
,
help
=
"Create a publicly shareable link for the interface."
)
parser
.
add_argument
(
"--inbrowser"
,
action
=
"store_true"
,
default
=
False
,
help
=
"Automatically launch the interface in a new tab on the default browser."
)
parser
.
add_argument
(
"--server-port"
,
type
=
int
,
default
=
8000
,
help
=
"Demo server port."
)
parser
.
add_argument
(
"--server-name"
,
type
=
str
,
default
=
"127.0.0.1"
,
help
=
"Demo server name."
)
args
=
parser
.
parse_args
()
return
args
def
_load_model_tokenizer
(
args
):
tokenizer
=
AutoTokenizer
.
from_pretrained
(
args
.
checkpoint_path
,
trust_remote_code
=
True
,
resume_download
=
True
,
revision
=
'master'
,
)
if
args
.
cpu_only
:
device_map
=
"cpu"
else
:
device_map
=
"cuda"
model
=
AutoModelForCausalLM
.
from_pretrained
(
args
.
checkpoint_path
,
device_map
=
device_map
,
trust_remote_code
=
True
,
resume_download
=
True
,
revision
=
'master'
,
).
eval
()
model
.
generation_config
=
GenerationConfig
.
from_pretrained
(
args
.
checkpoint_path
,
trust_remote_code
=
True
,
resume_download
=
True
,
revision
=
'master'
,
)
return
model
,
tokenizer
def
_parse_text
(
text
):
lines
=
text
.
split
(
"
\n
"
)
lines
=
[
line
for
line
in
lines
if
line
!=
""
]
count
=
0
for
i
,
line
in
enumerate
(
lines
):
if
"```"
in
line
:
count
+=
1
items
=
line
.
split
(
"`"
)
if
count
%
2
==
1
:
lines
[
i
]
=
f
'<pre><code class="language-
{
items
[
-
1
]
}
">'
else
:
lines
[
i
]
=
f
"<br></code></pre>"
else
:
if
i
>
0
:
if
count
%
2
==
1
:
line
=
line
.
replace
(
"`"
,
r
"\`"
)
line
=
line
.
replace
(
"<"
,
"<"
)
line
=
line
.
replace
(
">"
,
">"
)
line
=
line
.
replace
(
" "
,
" "
)
line
=
line
.
replace
(
"*"
,
"*"
)
line
=
line
.
replace
(
"_"
,
"_"
)
line
=
line
.
replace
(
"-"
,
"-"
)
line
=
line
.
replace
(
"."
,
"."
)
line
=
line
.
replace
(
"!"
,
"!"
)
line
=
line
.
replace
(
"("
,
"("
)
line
=
line
.
replace
(
")"
,
")"
)
line
=
line
.
replace
(
"$"
,
"$"
)
lines
[
i
]
=
"<br>"
+
line
text
=
""
.
join
(
lines
)
return
text
def
_remove_image_special
(
text
):
text
=
text
.
replace
(
'<ref>'
,
''
).
replace
(
'</ref>'
,
''
)
return
re
.
sub
(
r
'<box>.*?(</box>|$)'
,
''
,
text
)
def
_launch_demo
(
args
,
model
,
tokenizer
):
uploaded_file_dir
=
os
.
environ
.
get
(
"GRADIO_TEMP_DIR"
)
or
str
(
Path
(
tempfile
.
gettempdir
())
/
"gradio"
)
def
predict
(
_chatbot
,
task_history
):
chat_query
=
_chatbot
[
-
1
][
0
]
query
=
task_history
[
-
1
][
0
]
print
(
"User: "
+
_parse_text
(
query
))
history_cp
=
copy
.
deepcopy
(
task_history
)
full_response
=
""
history_filter
=
[]
pic_idx
=
1
pre
=
""
for
i
,
(
q
,
a
)
in
enumerate
(
history_cp
):
if
isinstance
(
q
,
(
tuple
,
list
)):
q
=
f
'Picture
{
pic_idx
}
: <img>
{
q
[
0
]
}
</img>'
pre
+=
q
+
'
\n
'
pic_idx
+=
1
else
:
pre
+=
q
history_filter
.
append
((
pre
,
a
))
pre
=
""
history
,
message
=
history_filter
[:
-
1
],
history_filter
[
-
1
][
0
]
# response, history = model.chat(tokenizer, message, history=history)
for
response
in
model
.
chat_stream
(
tokenizer
,
message
,
history
=
history
):
_chatbot
[
-
1
]
=
(
_parse_text
(
chat_query
),
_remove_image_special
(
_parse_text
(
response
)))
yield
_chatbot
full_response
=
_parse_text
(
response
)
response
=
full_response
history
.
append
((
message
,
response
))
image
=
tokenizer
.
draw_bbox_on_latest_picture
(
response
,
history
)
if
image
is
not
None
:
temp_dir
=
secrets
.
token_hex
(
20
)
temp_dir
=
Path
(
uploaded_file_dir
)
/
temp_dir
temp_dir
.
mkdir
(
exist_ok
=
True
,
parents
=
True
)
name
=
f
"tmp
{
secrets
.
token_hex
(
5
)
}
.jpg"
filename
=
temp_dir
/
name
image
.
save
(
str
(
filename
))
_chatbot
.
append
((
None
,
(
str
(
filename
),)))
else
:
_chatbot
[
-
1
]
=
(
_parse_text
(
chat_query
),
response
)
# full_response = _parse_text(response)
task_history
[
-
1
]
=
(
query
,
full_response
)
print
(
"Qwen-VL-Chat: "
+
_parse_text
(
full_response
))
yield
_chatbot
def
regenerate
(
_chatbot
,
task_history
):
if
not
task_history
:
return
_chatbot
item
=
task_history
[
-
1
]
if
item
[
1
]
is
None
:
return
_chatbot
task_history
[
-
1
]
=
(
item
[
0
],
None
)
chatbot_item
=
_chatbot
.
pop
(
-
1
)
if
chatbot_item
[
0
]
is
None
:
_chatbot
[
-
1
]
=
(
_chatbot
[
-
1
][
0
],
None
)
else
:
_chatbot
.
append
((
chatbot_item
[
0
],
None
))
return
predict
(
_chatbot
,
task_history
)
def
add_text
(
history
,
task_history
,
text
):
task_text
=
text
if
len
(
text
)
>=
2
and
text
[
-
1
]
in
PUNCTUATION
and
text
[
-
2
]
not
in
PUNCTUATION
:
task_text
=
text
[:
-
1
]
history
=
history
+
[(
_parse_text
(
text
),
None
)]
task_history
=
task_history
+
[(
task_text
,
None
)]
return
history
,
task_history
,
""
def
add_file
(
history
,
task_history
,
file
):
history
=
history
+
[((
file
.
name
,),
None
)]
task_history
=
task_history
+
[((
file
.
name
,),
None
)]
return
history
,
task_history
def
reset_user_input
():
return
gr
.
update
(
value
=
""
)
def
reset_state
(
task_history
):
task_history
.
clear
()
return
[]
with
gr
.
Blocks
()
as
demo
:
gr
.
Markdown
(
"""
\
<p align="center"><img src="https://modelscope.cn/api/v1/models/qwen/Qwen-7B-Chat/repo?
Revision=master&FilePath=assets/logo.jpeg&View=true" style="height: 80px"/><p>"""
)
gr
.
Markdown
(
"""<center><font size=8>Qwen-VL-Chat Bot</center>"""
)
gr
.
Markdown
(
"""
\
<center><font size=3>This WebUI is based on Qwen-VL-Chat, developed by Alibaba Cloud.
\
(本WebUI基于Qwen-VL-Chat打造,实现聊天机器人功能。)</center>"""
)
gr
.
Markdown
(
"""
\
<center><font size=4>Qwen-VL <a href="https://modelscope.cn/models/qwen/Qwen-VL/summary">🤖 </a>
| <a href="https://huggingface.co/Qwen/Qwen-VL">🤗</a>  |
Qwen-VL-Chat <a href="https://modelscope.cn/models/qwen/Qwen-VL-Chat/summary">🤖 </a> |
<a href="https://huggingface.co/Qwen/Qwen-VL-Chat">🤗</a>  |
 <a href="https://github.com/QwenLM/Qwen-VL">Github</a></center>"""
)
chatbot
=
gr
.
Chatbot
(
label
=
'Qwen-VL-Chat'
,
elem_classes
=
"control-height"
,
height
=
750
)
query
=
gr
.
Textbox
(
lines
=
2
,
label
=
'Input'
)
task_history
=
gr
.
State
([])
with
gr
.
Row
():
empty_bin
=
gr
.
Button
(
"🧹 Clear History (清除历史)"
)
submit_btn
=
gr
.
Button
(
"🚀 Submit (发送)"
)
regen_btn
=
gr
.
Button
(
"🤔️ Regenerate (重试)"
)
addfile_btn
=
gr
.
UploadButton
(
"📁 Upload (上传文件)"
,
file_types
=
[
"image"
])
submit_btn
.
click
(
add_text
,
[
chatbot
,
task_history
,
query
],
[
chatbot
,
task_history
]).
then
(
predict
,
[
chatbot
,
task_history
],
[
chatbot
],
show_progress
=
True
)
submit_btn
.
click
(
reset_user_input
,
[],
[
query
])
empty_bin
.
click
(
reset_state
,
[
task_history
],
[
chatbot
],
show_progress
=
True
)
regen_btn
.
click
(
regenerate
,
[
chatbot
,
task_history
],
[
chatbot
],
show_progress
=
True
)
addfile_btn
.
upload
(
add_file
,
[
chatbot
,
task_history
,
addfile_btn
],
[
chatbot
,
task_history
],
show_progress
=
True
)
gr
.
Markdown
(
"""
\
<font size=2>Note: This demo is governed by the original license of Qwen-VL.
\
We strongly advise users not to knowingly generate or allow others to knowingly generate harmful content,
\
including hate speech, violence, pornography, deception, etc.
\
(注:本演示受Qwen-VL的许可协议限制。我们强烈建议,用户不应传播及不应允许他人传播以下内容,
\
包括但不限于仇恨言论、暴力、色情、欺诈相关的有害信息。)"""
)
demo
.
queue
().
launch
(
share
=
args
.
share
,
inbrowser
=
args
.
inbrowser
,
server_port
=
args
.
server_port
,
server_name
=
args
.
server_name
,
)
def
main
():
args
=
_get_args
()
model
,
tokenizer
=
_load_model_tokenizer
(
args
)
_launch_demo
(
args
,
model
,
tokenizer
)
if
__name__
==
'__main__'
:
main
()
Prev
1
2
3
4
5
6
Next
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