-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
一个服务化的可多GPU并行处理的方案(基于LitServe) #667
Comments
你好,我在运行代码时,服务器端一直报Exception: Parsing error: 'Layoutlmv3_Predictor' object has no attribute 'parameters',客户端一直报requests.exceptions.HTTPError: 500 Server Error: Internal Server Error for url: http://127.0.0.1:8000/predict |
看样子是你的处理代码有问题,不是服务的问题 |
使用这个代码后,表格识别变得巨慢,是什么原因呢? |
你不使用服务化的方式,用magic-pdf cli的方式慢吗? |
这样的话速度是正常的,表格识别用的TableMaster |
代码实际上没看懂咋用,就习惯性地先开server.py,把client.py里面的文件路径改成自己的再启动。结果发现报错和small_ocr.pdf有关,明明我要处理的文件都没有small_ocr.pdf了,不知道如何解决。 |
应该是你的代码改错了吧,我这边正常运行,改了文件路径怎么可能还有small_ocr.pdf,这只是个example file @PoisonousBromineChan |
请问您这边跑的时候表格识别速度正常吗? |
感谢,跑通了。额外安装库 pip install python-multipart,然后启动服务器程序就请求成功了。 修改do parse 函数:
|
表格我还没验证过,有时间我试试看 |
问题描述:
系统&环境:
magic-pdf.json配置
实验pdf链接: https://github.com/opendatalab/MinerU/blob/master/demo/demo1.pdf 使用litserve 输出日志为:
使用命令行
输出日志为:
|
确实是这个原因,里面写死了匹配的规则,我们修一下这里 use_gpu = True if device.startswith("cuda") else False |
问题描述: 参考server.py提供接口,15并发4gpu压测,发现gpu[0]总是爆满,其他gpu都是相对空闲。 期望结果: gpu的压力均分 实验过程执行:
输出日志:
|
@234687552 你这边是打开了表格识别了吗,如果打开了可以试试关闭表格识别,再测一下负载均衡,这样可以定位是不是表格识别的问题。 |
简单的方法是在调用client里面的do_parse函数时传入这些参数就可以了,不需要修改server的代码 |
情况描述: 之前是开启了表格识别:"is_table_recog_enable": true, 关闭后测试:gpu[0] 不会一直持续爆满,其他gpu相对均衡运转 关闭表格识别 cat ~/magic-pdf.json
gpu使用情况 nvidia-smi --loop=1
|
这边实际情况是必须开启表格识别的,现在不知道如何处理让表格识别也均衡单机使用多gpu |
看来我的猜测是对的,还是因为表格识别的bug引起的,可能还是在代码的某个地方,表格模型还是以.cuda的方式load的,还是没有正确识别到cuda:1这种。导致所有的表格模型都load到了gpu 0上,因而gpu 0爆满。 |
对于TableMaster表格识别模型,以下是存在bug的地方: 对于struct_eqtable表格模型,以下是存在bug的地方: |
paddle框架指定gpu的方式和torch框架不一致,目前paddle都是使用第一张卡去加速的,目前我们的开发重心还在提高解析质量上,暂时分不出人力优化多卡分配的逻辑,欢迎有能力解决多卡分配问题的开发者提交pr |
server.py import os
import torch
import filetype
import json, uuid
import litserve as ls
from fastapi import HTTPException
from magic_pdf.tools.common import do_parse
from magic_pdf.model.doc_analyze_by_custom_model import ModelSingleton
class MinerUAPI(ls.LitAPI):
def __init__(self, output_dir='/tmp'):
self.output_dir = output_dir
@staticmethod
def clean_memory(device):
import gc
if torch.cuda.is_available():
with torch.cuda.device(device):
torch.cuda.empty_cache()
torch.cuda.ipc_collect()
gc.collect()
def setup(self, device):
device = torch.device(device)
os.environ['CUDA_VISIBLE_DEVICES'] = str(device.index)
model_manager = ModelSingleton()
model_manager.get_model(True, False)
model_manager.get_model(False, False)
print(f'Model initialization complete!')
def decode_request(self, request):
file = request['file'].file.read()
kwargs = json.loads(request['kwargs'])
assert filetype.guess_mime(file) == 'application/pdf'
return file, kwargs
def predict(self, inputs):
try:
pdf_name = str(uuid.uuid4())
do_parse(self.output_dir, pdf_name, inputs[0], [], **inputs[1])
return pdf_name
except Exception as e:
raise HTTPException(status_code=500, detail=f'{e}')
finally:
self.clean_memory(self.device)
def encode_response(self, response):
return {'output_dir': response}
if __name__ == '__main__':
server = ls.LitServer(MinerUAPI(), accelerator='gpu', devices=[0, 1], timeout=False)
server.run(port=8000) magic-pdf.json {
"bucket_info":{
"bucket-name-1":["ak", "sk", "endpoint"],
"bucket-name-2":["ak", "sk", "endpoint"]
},
"models-dir":"/opt/models",
"device-mode":"cuda",
"table-config": {
"model": "TableMaster",
"is_table_recog_enable": true,
"max_time": 400
}
} 试试把server.py改成我提供的新的代码,打开表格识别,再跑一次压测看看,应该是可以了 @234687552 |
情况描述 gpu是均衡分配占用【详看后面的日志和截图】,但是clean_memory有异常堆栈 参考改动如下:
异常堆栈:
gpu使用情况 nvidia-smi --loop=1
|
感谢,看来有进展!试试把with torch.cuda.device(device):这句话删掉@234687552 |
感谢支持,现在是可以多gpu正常运作了。 |
经过昨天的调试我们基本解决了,后续我再测一下,可以的话我提个PR |
@randydl 可以提到dev分支的project目录,参考其他项目创建一个目录放代码文件和readme |
好的 |
@myhloli @234687552 你好,麻烦请看看这个pip安装问题 @897 |
0.10.x版本下, 启动server会报错:ModuleNotFoundError: No module named 'paddleocr.paddleocr'; 'paddleocr' is not a package |
0.10.3已修复 |
请问有大佬能指点一下为什么在LSF集群进行单点多卡的BSUB的时候,并行只在单卡上跑呢?其它卡都没用上 LSF Shell #!/bin/bash
#BSUB -q long
#BSUB -n 4 # Number of cores
#BSUB -o ./lsf_log/gpu_job_%J.out # Output file name (%J is the job ID)
#BSUB -e ./lsf_log/gpu_job_%J.err # Error file name
#BSUB -gpu num=4:gmem=80000:mode=shared
#BSUB -R "span[hosts=1]"
#BSUB -R "rusage[mem=64GB]" # Memory requirement (specify amount needed)
#BSUB -W 24:00 # Wall clock limit (hours:minutes) server.py if __name__ == '__main__':
server = ls.LitServer(
MinerUAPI(output_dir='...'),
accelerator='cuda',
devices=[0,1,2,3],
workers_per_device=1,
timeout=False
)
server.run(port=6000) client.py n_jobs = np.clip(len(files), 1, 8)
results = Parallel(n_jobs, prefer='threads', verbose=10)(
delayed(do_parse)(p) for p in files
) GPU 占用
|
@xcvil Ensuring |
尝试了一下,感觉并不是多张卡分布式运行服务,是每张卡部署一个服务。请问一下有什么解决方案 |
Thanks a lot for replying. Could you please give me some hints about how to set In my scenario, def setup(self, device):
if device.startswith('cuda'):
os.environ['CUDA_VISIBLE_DEVICES'] = device.split(':')[-1]
if torch.cuda.device_count() > 1:
raise RuntimeError("Remove any CUDA actions before setting 'CUDA_VISIBLE_DEVICES'.") MinerU/projects/multi_gpu/server.py Line 20 in b9f3435
I will raise error with these lines of codes. |
我也有类似的问题,当我提交了多卡的工作之后,server只在第一个卡上跑,所有的multiprocessor都在这张卡上跑 |
The check |
@randydl 请问我修改了一下这个代码,这样可以支持多张gpu一起运行吗 class MinerUAPI(ls.LitAPI):
if name == 'main': ` |
你可以试试这个 |
@xcvil 我尝试了一下还是只能一个gpu上运行,不管指定哪几个,最后只在指定的第一个gpu上跑,指定1,3,只跑1,指定0,1,只跑0 |
@234687552 你好,请问我尝试了你发的代码,为什么我跑的时候还是只在一个gpu上运行的 |
看看你代码呗 如果slurm/lsf, shell也发一下 |
@xcvil class MinerUAPI(ls.LitAPI):
if name == 'main': def to_b64(file_path): def do_parse(file_path, url='http://127.0.0.1:8000/predict', **kwargs):
def process_pdf_files_concurrently(pdf_files): def process_files_in_batches(directory, batch_size=20): if name == 'main': |
@zxwsd 你试了这个嘛 |
@xcvil 我更换了一个版本,把MinerU从10.5降到0.9.0,然后就可以正常多卡并行了 |
@randydl 大佬能帮忙看下吗,怎么才能支持multipart/form-data 这种类型的数据呢,想部署一个api服务,直接用的serve.py,但是发现怎么也接收不到数据, 这是请求的格式,不知道decode_request 这个方法怎么才能接收到这两个参数 |
支持传入jpg、png、pdf路径。批量处理的话大家只需要简单的多线程调用客户端的do_parse函数就可以了,服务端会自动在多个GPU上并行处理。
server.py
client.py
The text was updated successfully, but these errors were encountered: