我在Sagemaker推理端点(单实例)上部署了一个自定义模型,在进行负载测试时,我观察到CPU利用率指标达到了100%的最大值,但根据这篇文章,它应该达到#vCPU*100%。我已经通过clowdwatch日志确认推理端点并未使用所有核心。
因此,如果一个预测调用需要一秒钟来处理并给出响应,那么部署的模型只能处理每秒一个API调用,如果使用所有vCPU,这个速度本可以提高到每秒8个调用。
在AWS Sagemaker部署中是否有任何设置可以使用所有vCPU来增加并发性?
或者我们可以在部署时在inference.py
文件中使用多进程Python包,以便每个调用到达默认核心,然后所有计算/预测在那个实例中任何空闲的核心上进行?
回答:
更新
-
设置三个环境变量
- 将ENABLE_MULTI_MODEL设置为”true”(确保它是字符串而不是布尔值),并将SAGEMAKER_HANDLER设置为自定义模型处理程序的Python模块路径,如果是自定义服务则不需要定义。另外,请确保在将模型压缩为tar球并存储在s3之前,模型名称为model.mar
- 将TS_DEFAULT_WORKERS_PER_MODEL设置为vCPU的数量
- 第一个环境变量确保启用torch serve的环境变量,第二个环境变量使用第一个设置并加载请求的工人数量
- 可以通过向PyTorch函数传递env字典参数来进行设置。以下是它为何有效的解释
-
从表面上看,Sagemaker对PyTorch模型的部署,如Sagemaker SDK指南中所述,使用的是这个Dockerfile。在这个Docker中,入口点是torchserve-entrypoint.py,如Dockerfile的第124行所示。
-
这个torchserve-entrypoint.py调用了serving.main(),来自serving.py。这最终调用了torchserve.start_torchserve(handler_service=HANDLER_SERVICE),来自torchserve.py。
-
在torchserve.py的第34行,它定义了”/etc/default-ts.properties”作为DEFAULT_TS_CONFIG_FILE。这个文件位于这里。在这个文件中,enable_envvars_config=true已设置。如果环境变量”ENABLE_MULTI_MODEL”设置为”false”,如这里所述,它将使用这个文件设置。如果设置为”true”,则它将使用/etc/mme-ts.properties
至于问题在AWS Sagemaker部署中是否有任何设置可以使用所有vCPU来增加并发性?
你可以使用各种设置。对于模型,你可以在config.properties中设置default_workers_per_model
,在环境变量中设置TS_DEFAULT_WORKERS_PER_MODEL=$(nproc --all)
。环境变量具有最高优先级。
除此之外,对于每个模型,你可以通过使用管理API来设置工人数量,但遗憾的是在sagemaker中无法通过curl访问管理API。因此,TS_DEFAULT_WORKERS_PER_MODEL是最好的选择。设置这个应该可以确保所有核心都被使用。
但如果你使用的是Docker文件,那么在入口点中,你可以设置脚本,等待模型加载并curl到它以设置工人数量
# 加载模型curl -X POST localhost:8081/models?url=model_1.mar&batch_size=8&max_batch_delay=50# 加载模型后,可以设置min_worker等curl -v -X PUT http://localhost:8081/models/model_1?min_worker=1
关于另一个问题,即日志确认未使用所有核心,我遇到了相同的问题,并认为这是日志系统的问题。请查看这个问题https://github.com/pytorch/serve/issues/782。社区本身同意,如果没有设置线程,那么默认情况下它会打印0,即使默认情况下它使用2*num_cores。
关于所有可能配置的详尽列表
# 参考:https://github.com/pytorch/serve/blob/master/docs/configuration.md# 可以通过config.properties和环境变量配置的变量# 注意:可以通过环境变量配置的变量**应该**有# "TS_"前缀# debuginference_address=http://0.0.0.0:8080management_address=http://0.0.0.0:8081metrics_address=http://0.0.0.0:8082model_store=/opt/ml/modelload_models=model_1.mar# blacklist_env_vars# default_workers_per_model# default_response_timeout# unregister_model_timeout# number_of_netty_threads# netty_client_threads# job_queue_size# number_of_gpu# async_logging# cors_allowed_origin# cors_allowed_methods# cors_allowed_headers# decode_input_request# keystore# keystore_pass# keystore_type# certificate_file# private_key_file# max_request_size# max_response_size# default_service_handler# service_envelope# model_server_home# snapshot_store# prefer_direct_buffer# allowed_urls# install_py_dep_per_model# metrics_format# enable_metrics_api# initial_worker_port# 未通过环境变量文档化或启用的配置# 当下面的变量设置为true时,环境中设置的变量具有更高的优先级。# 例如,环境变量的值覆盖命令行参数和配置文件中的属性。命令行参数的值覆盖配置文件中的值。# 当设置为false时,完全不使用环境变量# use_native_io=# io_ratio=# metric_time_interval=enable_envvars_config=true# model_snapshot=# version=