解决模型仓库带宽瓶颈问题!TorchServe 使用 Dragonfly 加速分发模型

镜像拉取节省 90% 以上,快手基于 Dragonfly 的超大规模分发实践 快手容器云平台旨在为快手不断增长、不断变化和多样化的业务,提供基于容器化部署的超大规模基础设施服务。为了实现这一目标,快手工程师需要解决弹性、稳定性、效率和无服务器架构等挑战,在这些挑战中,镜像分发的稳定性和效率也是最棘手的问题之一。 阅读详情

d0021eeb75158da8cfafd3eb69f85ea4.gif

Dragonfly GitHub:

https://github.com/dragonflyoss/Dragonfly2

本文主要解决在 TorchServe 模型拉取时,存在的中心化的模型仓库带宽瓶颈问题。当在 TorchServe 下载模型的时候,文件相对较大且会有并发下载模型的场景。这样很容易导致存储带宽被打满,从而引起下载过慢的情况,影响推理服务的使用。

e3b5259db968e1fa311887d8acd0485f.png

这种方式比较好的解决方案是使用 Dragonfly 的 P2P 技术利用每个节点的闲置带宽缓解模型仓库的带宽压力,从而达到加速效果。在最理想的情况下 Dragonfly 可以让整个 P2P 集群中只有一个节点回源下载模型,其他节点流量均使用集群内 P2P 内网带宽。

7aefaacb5c84ff1d415c2c99c9d8b71a.png

Part 1. 架构

89c2fb3cf75b8b35a555a331dac259f1.png

TorchServe 通过集成 Dragonfly Endpoint 插件,发送模型下载请求到 Dragonfly,Dragonfly 作为代理去对应的 Object Storage 下载模型并返回。

da2c22c7ad7cd00b612e19fbc559d45e.png

模型下载步骤:

1.TorchServe 发起模型下载请求到 Dragonfly Peer。

2.Dragonfly Peer 会到 Dragonfly Scheduler 注册任务。

3.返回合适的一组父节点给 Dragonfly Peer 进行下载。

4.Dragonfly Peer 从合适的一组父节点分片下载文件。

5.模型下载完成之后,TorchServe 会进行模型注册。

Part 2. 部署

通过集成 Dragonfly Endpoint 到 TorchServe 中,使下载流量通过 Dragonfly 去拉取 S3,OSS,GCS,ABS 中存储的模型文件, 并在 TorchServe 中进行注册。TorchServe 插件维护在 dragonfly-endpoint 仓库中。

2.1 依赖

5a33b36dc5f2ee66440de23c5b96f7a2.png

注意:如果没有可用的 Kubernetes 集群进行测试,推荐使用 Kind。

2.2 Dragonfly Kubernetes 集群搭建

基于 Kubernetes cluster 详细安装文档可以参考 quick-start-kubernetes[1]。

‣ 准备 Kubernetes 集群

创建 Kind 多节点集群配置文件 kind-config.yaml,配置如下:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
  - role: worker
  - role: worker

使用配置文件创建 Kind 集群:

kind create cluster --config kind-config.yaml

切换 Kubectl 的 context 到 Kind 集群:

kubectl config use-context kind-kind

‣ Kind 加载 Dragonfly 镜像

下载 Dragonfly Latest 镜像:

docker pull dragonflyoss/scheduler:latest
docker pull dragonflyoss/manager:latest
docker pull dragonflyoss/dfdaemon:latest

Kind 集群加载 Dragonfly Latest 镜像:

kind load docker-image dragonflyoss/scheduler:latest
kind load docker-image dragonflyoss/manager:latest
kind load docker-image dragonflyoss/dfdaemon:latest

‣ 基于 Helm Charts 创建 Dragonfly 集群

创建 Helm Charts 配置文件 charts-config.yaml。可以根据对象存储的下载路径修改 dfdaemon.config.proxies.regx 来调整路由匹配规则,示例中默认匹配了 AWS S3 的请求,配置如下:

scheduler:
  image: dragonflyoss/scheduler
  tag: latest
  replicas: 1
  metrics:
    enable: true
  config:
    verbose: true
    pprofPort: 18066


seedPeer:
  image: dragonflyoss/dfdaemon
  tag: latest
  replicas: 1
  metrics:
    enable: true
  config:
    verbose: true
    pprofPort: 18066


dfdaemon:
  image: dragonflyoss/dfdaemon
  tag: latest
  metrics:
    enable: true
  config:
    verbose: true
    pprofPort: 18066
    proxy:
      defaultFilter: "Expires&Signature&ns"
      security:
        insecure: true
        cacert: ""
        cert: ""
        key: ""
      tcpListen:
        namespace: ""
        port: 65001
      registryMirror:
        url: https://index.docker.io
        insecure: true
        certs: []
        direct: false
      proxies:
      - regx: blobs/sha256.*
      - regx: .*amazonaws.*


manager:
  image: dragonflyoss/manager
  tag: latest
  replicas: 1
  metrics:
    enable: true
  config:
    verbose: true
    pprofPort: 18066


jaeger:
  enable: true

使用配置文件部署 Dragonfly Helm Charts:

$ helm repo add dragonfly https://dragonflyoss.github.io/helm-charts/
$ helm install --wait --create-namespace --namespace dragonfly-system dragonfly dragonfly/dragonfly -f charts-config.yaml
LAST DEPLOYED: Mon Sep  4 10:24:55 2023
NAMESPACE: dragonfly-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Get the scheduler address by running these commands:
  export SCHEDULER_POD_NAME=$(kubectl get pods --namespace dragonfly-system -l "app=dragonfly,release=dragonfly,component=scheduler" -o jsonpath={.items[0].metadata.name})
  export SCHEDULER_CONTAINER_PORT=$(kubectl get pod --namespace dragonfly-system $SCHEDULER_POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  kubectl --namespace dragonfly-system port-forward $SCHEDULER_POD_NAME 8002:$SCHEDULER_CONTAINER_PORT
  echo "Visit http://127.0.0.1:8002 to use your scheduler"


2. Get the dfdaemon port by running these commands:
  export DFDAEMON_POD_NAME=$(kubectl get pods --namespace dragonfly-system -l "app=dragonfly,release=dragonfly,component=dfdaemon" -o jsonpath={.items[0].metadata.name})
  export DFDAEMON_CONTAINER_PORT=$(kubectl get pod --namespace dragonfly-system $DFDAEMON_POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  You can use $DFDAEMON_CONTAINER_PORT as a proxy port in Node.


3. Configure runtime to use dragonfly:
  https://d7y.io/docs/getting-started/quick-start/kubernetes/




4. Get Jaeger query URL by running these commands:
  export JAEGER_QUERY_PORT=$(kubectl --namespace dragonfly-system get services dragonfly-jaeger-query -o jsonpath="{.spec.ports[0].port}")
  kubectl --namespace dragonfly-system port-forward service/dragonfly-jaeger-query 16686:$JAEGER_QUERY_PORT
  echo "Visit http://127.0.0.1:16686/search?limit=20&lookback=1h&maxDuration&minDuration&service=dragonfly to query download events"

检查 Dragonfly 是否部署成功:

$ kubectl get po -n dragonfly-system
NAME                                 READY   STATUS    RESTARTS      AGE
dragonfly-dfdaemon-7r2cn             1/1     Running   0          3m31s
dragonfly-dfdaemon-fktl4             1/1     Running   0          3m31s
dragonfly-jaeger-c7947b579-2xk44     1/1     Running   0          3m31s
dragonfly-manager-5d4f444c6c-wq8d8   1/1     Running   0          3m31s
dragonfly-mysql-0                    1/1     Running   0          3m31s
dragonfly-redis-master-0             1/1     Running   0          3m31s
dragonfly-redis-replicas-0           1/1     Running   0          3m31s
dragonfly-redis-replicas-1           1/1     Running   0          3m5s
dragonfly-redis-replicas-2           1/1     Running   0          2m44s
dragonfly-scheduler-0                1/1     Running   0          3m31s
dragonfly-seed-peer-0                1/1     Running   0          3m31s

‣ 暴露 Proxy 服务端口

创建 dfstore.yaml 配置文件,暴露 Dragonfly Peer 的 HTTP Proxy 服务监听的端口,用于和 TorchServe 交互。targetPort 如果未在 charts-config.yaml 中修改默认为 65001, port 可根据实际情况设定值,建议也使用 65001。

kind: Service
apiVersion: v1
metadata:
  name: dfstore
spec:
  selector:
    app: dragonfly
    component: dfdaemon
    release: dragonfly


  ports:
  - protocol: TCP
    port: 65001
    targetPort: 65001


  type: NodePort

创建 Service:

kubectl --namespace dragonfly-system apply -f dfstore.yaml

将本地的 65001 端口流量转发至 Dragonfly 的 Proxy 服务: 

kubectl --namespace dragonfly-system port-forward service/dfstore 65001:65001

2.3 安装 Dragonfly Endpoint 插件

‣ 设置 Dragonfly Endpoint 配置的环境变量

创建 config.json 配置文件,并将 DRAGONFLY_ENDPOINT_CONFIG  环境变量配置为 config.json 文件路径。

export DRAGONFLY_ENDPOINT_CONFIG=/etc/dragonfly-endpoint/config.json

默认读取路径为:

  • Linux:

/etc/dragonfly-endpoint/config.json

  • Darwin:  

~/.dragonfly-endpoint/config.json

‣ Dragonfly Endpoint 插件配置

创建 config.json 配置文件,对 Torchserve 插件进行配置。下面是 S3 的配置:

{
  "addr": "http://127.0.0.1:65001",
  "header": {
  },
  "filter": [
    "X-Amz-Algorithm",
    "X-Amz-Credential",
    "X-Amz-Date",
    "X-Amz-Expires",
    "X-Amz-SignedHeaders",
    "X-Amz-Signature"
  ],
  "object_storage": {
    "type": "s3",
    "bucket_name": "your_s3_bucket_name",
    "region": "your_s3_access_key",
    "access_key": "your_s3_access_key",
    "secret_key": "your_s3_access_key"
  }
}
  • addr: Drangonfly 的 Peer 的 HTTP Proxy 的地址。

  • header: 为请求增加请求头。

  • filter: 用于生成唯一的任务,并过滤 URL 中不必要的查询参数。

  • object_storage: 模型文件所在对象存储的配置,其中 type 可为 s3,oss,abs,gcs,具体参考对象存储配置。

配置文件中的 filter 部分, 根据对象存储类型设置不同值:

6eda9f39fca4506a9460e62eac98047e.png

对象存储配置

除 S3 外,Dragonfly 的 TorchServe 插件还支持 OSS,GCS,ABS。不同的对象存储配置如下:

  • OSS(Object Storage Service)

{
  "addr": "http://127.0.0.1:65001",
  "header": {},
  "filter": ["Expires", "Signature"],
  "object_storage": {
    "type": "oss",
    "bucket_name": "your_oss_bucket_name",
    "endpoint": "your_oss_endpoint",
    "access_key_id": "your_oss_access_key_id",
    "access_key_secret": "your_oss_access_key_secret"
  }
}
  • GCS(Google Cloud Storage)

"addr": "http://127.0.0.1:65001",
  "header": {},
  "object_storage": {
    "type": "gcs",
    "bucket_name": "your_gcs_bucket_name",
    "project_id": "your_gcs_project_id",
    "service_account_path": "your_gcs_service_account_path"
  }
}
  • ABS(Azure Blob Storage)

{
  "addr": "http://127.0.0.1:65001",
  "header": {},
  "object_storage": {
    "type": "abs",
    "account_name": "your_abs_account_name",
    "account_key": "your_abs_account_key",
    "container_name": "your_abs_container_name"
  }
}

2.4 TorchServe 集成 Dragonfly Endpoint 插件

TorchServe 在不同生产环境下使用的具体文档可参考 TorchServe 文档[2]。以下提供二种部署方式, 推荐使用 Docker 容器化部署:

部署方案一:二进制安装

依赖:

52963402275dbf8410f15e09307fc93c.png

安装 TorchServe 依赖和 torch-model-archiver:

git clone https://github.com/pytorch/serve.git
cd serve

克隆 TorchServe 存储库:

git clone https://github.com/pytorch/serve.git
cd serve

创建 model-store 目录用来存储模型文件:

mkdir model-store
chmod 777 model-store

创建 plugins-path 目录用来存储插件的二进制文件:

mkdir plugins-path

‣ 打包 Dragonfly Endpoint 插件

下载 dragonfly-endpoint 项目:

git clone https://github.com/dragonflyoss/dragonfly-endpoint.git

打包 dragonfly-endpoint 项目,在 build/libs 目录下生成文件:

cd ./dragonfly-endpoint
gradle shadowJar

注意:因为 TorchServe 自身 JVM 的限制,Gradle 的 Java 版本号最好为 11,版本号过高会导致插件无法解析。

将 Jar 文件放入之前创建好的 plugins-path 目录下:

mv build/libs/dragonfly_endpoint-1.0-all.jar  <your plugins-path>

准备插件的配置文件 config.json,对象存储仍以 S3 为例:

{
  "addr": "http://127.0.0.1:65001",
  "header": {
  },
  "filter": [
    "X-Amz-Algorithm",
    "X-Amz-Credential",
    "X-Amz-Date",
    "X-Amz-Expires",
    "X-Amz-SignedHeaders",
    "X-Amz-Signature"
  ],
  "object_storage": {
    "type": "s3",
    "bucket_name": "your_s3_bucket_name",
    "region": "your_s3_access_key",
    "access_key": "your_s3_access_key",
    "secret_key": "your_s3_access_key"
  }
}

设置配置文件的环境变量:

export DRAGONFLY_ENDPOINT_CONFIG=/etc/dragonfly-endpoint/config.json

--model-store 使用之前创建的存储模型目录,--plugins-path 使用之前创建的存储插件的目录。启动 TorchServe 使用 Dragonfly Endpoint 插件 :

torchserve --start --model-store <path-to-model-store-file> --plugins-path=<path-to-plugin-jars>

‣ 功能验证

准备模型文件。请直接到 Model ZOO [3] 中下载现成的模型文件 .mar 或者参考 Torch Model archiver for TorchServe [4] 打包自己模型文件。


以 squeezenet1_1_scripted.mar 模型为例:

wget https://torchserve.pytorch.org/mar_files/squeezenet1_1_scripted.mar

上传模型到对象存储,以下以 S3 为例,具体参考 S3:

# 下载命令行工具
pip install awscli
# 根据提示配置密钥等
aws configure
# 上传文件
aws s3 cp <本地文件路径> s3://<存储桶名称>/<目标路径>

TorchServe 插件名称为 dragonfly,插件 API 的详细参数请参考 TorchServe Register API,不支持 url 参数,并增加参数 file_name 参数 ,即需要下载的模型文件名称。

发送下载请求进行测试:

curl -X POST  "http://localhost:8081/dragonfly/models?file_name=squeezenet1_1.mar"

正确响应:

{
  "Status": "Model "squeezenet1_1" Version: 1.0 registered with 0 initial workers. Use scale workers API to add workers for the model."
}

增加模型的 Worker 用于推理:

curl -v -X PUT "http://localhost:8081/models/squeezenet1_1?min_worker=1"

模型的 Worker 数量增加成功,响应如下:

* About to connect() to localhost port 8081 (#0)
*   Trying ::1...
* Connected to localhost (::1) port 8081 (#0)
> PUT /models/squeezenet1_1?min_worker=1 HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost:8081
> Accept: */*
> 
< HTTP/1.1 202 Accepted
< content-type: application/json
< x-request-id: 66761b5a-54a7-4626-9aa4-12041e0e4e63
< Pragma: no-cache
< Cache-Control: no-cache; no-store, must-revalidate, private
< Expires: Thu, 01 Jan 1970 00:00:00 UTC
< content-length: 47
< connection: keep-alive
< 
{
  "status": "Processing worker updates..."
}
* Connection #0 to host localhost left intact

调用推理 API:

# 准备需要推理的图片
curl -O  https://raw.githubusercontent.com/pytorch/serve/master/docs/images/kitten_small.jpg
curl -O  https://raw.githubusercontent.com/pytorch/serve/master/docs/images/dogs-before.jpg


# 调用推理 API
curl http://localhost:8080/predictions/squeezenet1_1 -T kitten_small.jpg -T dogs-before.jpg

推理 API 成功调用后的响应:

{
  "lynx": 0.5455784201622009,
  "tabby": 0.2794168293476105,
  "Egyptian_cat": 0.10391931980848312,
  "tiger_cat": 0.062633216381073,
  "leopard": 0.005019133910536766
}

部署方案二:Docker 部署 TorchServe

‣ Docker 配置

拉取自带插件的 dragonflyoss/dragonfly-endpoint 镜像。以下为 CPU 版的 TorchServe 为例子。构建细节参考 Dockerfile [5]。

docker pull dragonflyoss/dragonfly-endpoint

创建 model-store 目录用来存储模型文件:

mkdir model-store
chmod 777 model-store

准备插件的配置文件 config.json,对象存储仍以 S3 为例:

{
  "addr": "http://127.0.0.1:65001",
  "header": {
  },
  "filter": [
    "X-Amz-Algorithm",
    "X-Amz-Credential&X-Amz-Date",
    "X-Amz-Expires",
    "X-Amz-SignedHeaders",
    "X-Amz-Signature"
  ],
  "object_storage": {
    "type": "s3",
    "bucket_name": "your_s3_bucket_name",
    "region": "your_s3_access_key",
    "access_key": "your_s3_access_key",
    "secret_key": "your_s3_access_key"
  }
}

设置配置文件的环境变量:

export DRAGONFLY_ENDPOINT_CONFIG=/etc/dragonfly-endpoint/config.json

运行容器并 mount model-store 和 dragonfly-endpoint 配置目录:

# 使用环境变量的配置路径 
sudo docker run --rm -it --network host -v $(pwd)/model-store:/home/model-server/model-store  -v ${DRAGONFLY_ENDPOINT_CONFIG}:${DRAGONFLY_ENDPOINT_CONFIG} dragonflyoss/dragonfly-endpoint:latest

‣ 功能验证

准备模型文件。请直接到 Model ZOO 中下载现成的模型文件 .mar 或者参考 Torch Model archiver for TorchServe 打包自己模型文件。

以 squeezenet1_1_scripted.mar 模型为例:

wget https://torchserve.pytorch.org/mar_files/squeezenet1_1_scripted.mar

上传模型到对象存储,以下以 S3 为例,具体参考 S3:

# 下载命令行工具
pip install awscli
# 根据提示配置密钥等
aws configure
# 上传文件
aws s3 cp <本地文件路径> s3://<存储桶名称>/<目标路径>

TorchServe 插件名称为 dragonfly,在 TorchServe 的管理接口下监听。插件 API 的详细参数请参考 TorchServe Register API [6] (仅不支持 url 参数),并增加参数 file_name ,即需要下载的模型文件。

发送下载请求进行测试:

curl -X POST  "http://localhost:8081/dragonfly/models?file_name=squeezenet1_1.mar"

正确响应:

{
  "Status": "Model "squeezenet1_1" Version: 1.0 registered with 0 initial workers. Use scale workers API to add workers for the model."
}

增加模型的 Worker 用于推理:

curl -v -X PUT "http://localhost:8081/models/squeezenet1_1?min_worker=1"

模型的 Worker 数量增加成功,响应如下:

* About to connect() to localhost port 8081 (#0)
*   Trying ::1...
* Connected to localhost (::1) port 8081 (#0)
> PUT /models/squeezenet1_1?min_worker=1 HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost:8081
> Accept: */*
> 
< HTTP/1.1 202 Accepted
< content-type: application/json
< x-request-id: 66761b5a-54a7-4626-9aa4-12041e0e4e63
< Pragma: no-cache
< Cache-Control: no-cache; no-store, must-revalidate, private
< Expires: Thu, 01 Jan 1970 00:00:00 UTC
< content-length: 47
< connection: keep-alive
< 
{
  "status": "Processing worker updates..."
}
* Connection #0 to host localhost left intact

调用推理 API:

# 准备需要推理的图片
curl -O  https://raw.githubusercontent.com/pytorch/serve/master/docs/images/kitten_small.jpg
curl -O  https://raw.githubusercontent.com/pytorch/serve/master/docs/images/dogs-before.jpg


# 调用推理 API
curl http://localhost:8080/predictions/squeezenet1_1 -T kitten_small.jpg -T dogs-before.jpg

推理 API 成功调用后的响应:

{
  "lynx": 0.5455784201622009,
  "tabby": 0.2794168293476105,
  "Egyptian_cat": 0.10391931980848312,
  "tiger_cat": 0.062633216381073,
  "leopard": 0.005019133910536766
}

‣ 性能测试

测试在单机情况下,集成 Dragonfly 后下载模型的性能对比。使用的对象存储是 OSS,由于机器本身网络环境、配置等影响,实际下载时间不具有参考价值。不同场景下下载速度对应的比例较有意义。

63de505bd3097058b28fa4b5ff1e5276.png

  • TorchServe API: 直接通过 URL 下载对象存储里的模型文件。

  • TorchServe API & Dragonfly Cold Boot:通过 Dragonfly 代理模式进行回源下载,没有命中任何缓存所花费的时间。

  • Hit Remote Peer: 通过 Dragonfly 代理模式,在命中 Dragonfly 的远端 Peer 缓存的情况下的下载时间。

  • Hit Local Peer: 通过 Dragonfly 代理模式,在命中 Dragonfly 的本地 Peer 缓存的情况下的下载时间。

测试结果表明 TorchServe 集成 Dragonfly,能有效减少下载时间。在命中缓存 ,尤其是本地缓存的情况下有较大的提升。即使是回源下载的性能也和直接下载的相差无几。注意的是本次测试为单机测试,意味着在命中缓存的情况下,性能瓶颈主要在磁盘。如果是多台机器部署的 Dragonfly 进行 P2P 下载的情况,模型下载速度会更快。

Part 3. 相关链接

文章链接

  • [1].quick-start-kubernetes:

    https://d7y.io/zh/docs/getting-started/quick-start/kubernetes/

  • [2].TorchServe 文档:

    https://pytorch.org/serve/

  • [3].Model ZOO:

    https://pytorch.org/serve/model_zoo.html#

  • [4].Torch Model archiver for TorchServe:

    https://github.com/pytorch/serve/tree/master/model-archiver

  • [5].Dockerfile:

    https://github.com/dragonflyoss/dragonfly-endpoint/blob/main/images/Dockerfile

  • [6].TorchServe Register API:

    https://pytorch.org/serve/management_api.html#register-a-model

Dragonfly 社区

  • Website:

    https://d7y.io/

  • Github Repo:

    https://github.com/dragonflyoss/Dragonfly2

  • Dragonfly Endpoint Github Repo: 

    https://github.com/dragonflyoss/dragonfly-endpoint

  • Slack Channel: 

    #dragonfly on CNCF Slack

  • Discussion Group:

    dragonfly-discuss@googlegroups.com

  • Twitter:

    @dragonfly_oss

Pytorch

  • Website:

    https://pytorch.org/

  • Github Repo:

    https://github.com/pytorch/pytorch

  • TorchServe Document: 

    https://pytorch.org/serve/

  • TorchServe Github Repo: 

    https://github.com/pytorch/serve

1338cb7c5ef97b7172174f352582e927.png

【Dragonfly Github 仓库】二维码

  本周推荐阅读  

dbcc7ee92c3568f0808e65a6ba46e3d0.jpeg

Nydus Acceld 去 Containerd 服务化

8639b4e1ac87e132ed2db0a4c6f5addd.png

与 Harbor 构建高效的镜像加速工作流

a1f6d72aed2e32aa2d15e1e5c8beeceb.png

Seata Saga 模式快速入门和最佳实践

d8744ff28f8e0eb91562215cc468b2b1.png

Seata-DTX|分布式事务金融场景案例介绍

fd67c89cba992e88e2dab4f8f0b63258.jpeg

【信息科学与工程学】计算机科学与自动化—第十五篇 云计算 11 算法篇02 但若第一个应用需求40GB/s,第二个10GB/s,总需求50GB/s>40GB/s,第一个得32GB/s,第二个得8GB/s,不公平。但若分区负载不均(分区1-2各有100任务/s,分区3-4各有50任务/s),A负责1-2(200/s),B负责3-4(100/s),仍均衡。任务 τi​ 的计算需求 Wi​(CPU周期),在频率 f 下执行时间 Ti​=Wi​/f,能耗 Ei​=Pdyn​⋅Ti​=Ceff​⋅V2⋅f⋅(Wi​/f)=Ceff​⋅V2⋅Wi​。若 Mneed​>Mi​,需使用远程显存。 阅读详情

相关推荐

【信息科学与工程学】【数据中心】第二十四篇 数据中心DaaS场景及算法

Flink, Kafka Streams, 时序数据库。Flink, Kafka Streams, 流处理引擎。Presto, ClickHouse, 查询加速引擎。Presto, ClickHouse, 查询加速引擎。延迟<50ms,可用性>99.99%,QPS>10K。REST API, GraphQL, API网关。Tableau, Power BI, 自助BI。Tableau, Power BI, 可视化库。Spark, Hadoop, 分布式计算框架。Spark, Hadoop, 分布式计算。

weixin_49199313的博客 1065

【ceph相关】s3预签名url(presign)

一、前言 1、预签名url 当需要将s3资源提供给其他用户访问,但又不想直接通过桶的访问权限,可以通过生成预签名url方式生成一个临时url提供给用户访问。 生成预签名url时,可以通过指定过期时间参数,限制用户访问时间。由于SigV4签名密钥最大有效期为7天,故生成的预签名url有效期最大也只有7天。 2、签名版本 Amazon S3有两个签名版本SigV2和SigV4版本,考虑到安全性和使用效率等因素,目前官方已停止SigV2版本的支持。 可以通过预签名url判断签名版本,通常SigV2预签名url带有

Luxf0的博客 5644

Verilog基本代码结构及常用语句always、begin...end解读

Verilog基本代码结构及常用语句always、begin...end解读 线性反馈以为寄存器(LFSR)

weixin_62380586的博客 1万+

阿里巴巴Dragonfly多机部署实战指南

阿里巴巴Dragonfly多机部署实战指南 前言 Dragonfly是阿里巴巴开源的一款基于P2P技术的智能镜像分发系统,特别适合大规模容器化场景下的镜像分发。本文将详细介绍如何在实际生产环境中部署Dragonfly的多机集群,帮助读者构建高效的镜像分发网络。 部署架构概述 在多机部署场景下,Dragonfly采用典型的客户端-服务器架构: SuperNode:作为中心调度节点,负责协调P2P网...

gitblog_00622的博客 699

PLSQL Developer新手必看:如何避免安装过程中的常见坑

本文为PL/SQL Developer新手提供了详尽的安装与配置避坑指南。从版本选择、注册码使用、汉化包安装到Oracle客户端连接配置,逐一解析常见问题并提供解决方案,帮助开发者快速搭建稳定的PL/SQL开发环境,顺利开启Oracle数据库编程工作。

g9h0i1的博客 651

从飞机翼型仿真到燃烧模拟:Fluent多物理场耦合的3种实战策略

本文深入探讨了Fluent在多物理场耦合仿真中的三种实战策略,涵盖可压缩流动与燃烧耦合、湍流模型选择及网格策略,以及顺序耦合、强耦合和混合耦合方法。通过具体案例和工程实践,帮助中高级用户提升仿真精度和效率,适用于航空航天和能源化工等领域。

aa123的博客 994

http put上传文件到亚马逊云服务器

2:抓包数据来看,file=1234567890abc后面没有其他内容,即没有回车换行、也没有什么结束符。1:Content-Length: 18,计算的是这个“file=1234567890abc”字符串。

weixin_42589744的博客 384

用C#和MQTTnet在WinForm里做个简易物联网监控后台(附完整源码)

本文详细介绍了如何使用C#和MQTTnet库在WinForm中构建一个简易物联网监控后台。通过实战案例,包括环境配置、MQTT服务端实现、客户端监控功能及高级优化技巧,帮助开发者快速搭建高效的物联网监控系统,适用于工业自动化和智能家居场景。

weixin_29540599的博客 392

如何使用 Harbor 和 Dragonfly 优化 Kubernetes 集群镜像拉取速度

公众号关注「奇妙的 Linux 世界」设为「星标」,每天带你玩转 Linux !本篇文章则分享在大规模的 Kubernetes 集群中,通过 Harbor 与 Dragonfly 来优化镜像的拉取速度。Dragonfly(蜻蜓)简介项目地址:https://github.com/dragonflyoss/Dragonfly2官方文档: https://d7y.io/zh/docs/ ...

easylife206的专栏 1299

深入解析MTK DRM初始化流程:从KMS模块到组件框架

本文深入解析了联发科(MTK)平台上DRM显示框架的初始化流程。从内核模块加载、Component框架管理依赖,到核心的mtk_drm_bind函数构建KMS对象(CRTC、Plane、Encoder、Connector),最终完成DRM设备注册并创建用户空间接口。文章结合调试经验,为开发者梳理了从驱动启动到屏幕点亮的完整路径与关键排查点。

onion的博客 767

自动化学报Ctex+texstudio配置方法

自动化学报Latex的模板win10使用方法(CTEX+texstudio)

zxy15924462502的博客 7375

技术解读|Triton Server 基于 Dragonfly 加速分发模型

Dragonfly GitHub:https://github.com/dragonflyoss/Dragonfly2本文主要解决在Triton Server模型拉取时,存在的中心化的模型仓库带宽瓶颈问题。当在 Triton Server 下载模型的时候,文件相对较大且会有并发下载模型的场景。这样很容易导致存储带宽被打满,从而引起下载过慢的情况,影响推理服务的使用。Triton Server ...

金融级分布式架构 926

YOLOv8与UNetV2融合:一种面向目标检测与图像分割的混合方法【附核心代码】

我们提出了一种基于YOLOv8和UNetV2相结合的混合架构。该架构利用YOLOv8作为主干进行目标检测,同时在YOLOv8的特征提取过程中,引入UNetV2来进行图像分割任务的增强。在该架构中,YOLOv8负责大范围目标检测和位置预测,而UNetV2则在检测网络的特征图基础上,通过其高效的上下文信息提取和细节恢复能力,进一步优化分割任务。在本文中,我们提出了一种改进YOLOv8的方法,通过引入图像分割网络UNetV2来提高图像分割检测性能。

一键难忘的博客 3525

Dragonfly 发布 2.3 版本,新增持久化缓存、资源搜索及 Vortex 协议等新特性

Dragonfly 发布 2.3.0 版本,新增多个功能特性并进行安全增强。同时,子项目 Nydus 也增加多个功能特性。本篇博客将介绍最重要的变更。有关功能增强及漏洞修复的完整列表,请查看 d7y.io 官网。

2401_85046472的博客 1039

【人工智能】架构师必读:大模型时代的意图识别 (Intent Recognition) 四大技术流派与实践指南

意图识别没有“银弹”,选择哪种方案取决于具体的业务需求、数据积累以及成本预算。如果追求极简与低成本,BERT 是不二之选。如果业务极其复杂且依赖上下文,RAG 或 Agent 模式更合适。如果追求极致的稳定与效果,基于 LLM 的微调 + Function Calling 是目前的行业最佳实践。参考资源:基于 LLM 的意图识别解决方案(Embedding 相关课程章节)

奶爸的编程之路,也就一周冷个三天 702

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

从崩溃到自愈:Nydus故障转移与热升级的无缝容器体验

你是否曾因容器运行时崩溃导致业务中断而焦头烂额?是否在深夜被紧急升级任务惊醒,担心服务不可用窗口过长?DragonflyOSS Nydus通过创新的故障转移(Failover)与热升级(Hot Upgrade)机制,彻底改变了容器运行时的可靠性与可维护性。本文将深入剖析这两种核心能力的技术实现,展示如何在保障业务连续性的前提下,实现零感知的故障恢复与版本迭代。 读完本文你将获得: - 理解Nyd...

gitblog_01034的博客 558

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Dragonfly服务端部署指南:如何搭建高性能supernode集群

Dragonfly是一个开源的P2P文件分发系统,通过其核心组件supernode(超级节点)集群实现高效的文件下载加速。本文将详细介绍如何搭建高性能的Dragonfly supernode集群,帮助您快速部署企业级的文件分发系统。🚀 ## 📋 准备工作与环境要求 在开始部署Dragonfly服务端之前,需要确保系统满足以下要求: **Docker部署方式**: - Git版本:1.9.

gitblog_00943的博客 573

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

使用TorchServe部署PyTorch模型以进行大规模推理

您今天与之交互的许多服务都依赖于机器学习(ML)。从在线搜索和产品推荐到语音识别和语言翻译,这些服务都需要ML模型来进行预测。随着ML进入更多服务领域,您将面临以下挑战:获得辛勤工作的结果,并快速可靠地将模型部署到生产环境。随着使用这些服务的人数的增加,确保这些模型同时安全可靠地向数百万用户提供低延迟预测变得更具挑战性。 开发人员使用许多不同的开源框架进行模型开发。在过去的几年中,PyTorch已成为许多开发基于ML的应用程序的研究人员,开发人员和数据科学家的首选深度学习框架。他们更喜欢PyTorch,因为

Clement 1万+

AWSS3 iOS 认证方法-V4认证

AWSS3 v4 认证

leleyuan1130的博客 4152

龙翼(Dragonfly):高效、安全的云原生文件分发与镜像加速器

龙翼(Dragonfly):高效、安全的云原生文件分发与镜像加速器 Dragonfly2Dragonfly2 是一个开源的 CDN 加速和负载均衡器,用于加速内容分发和降低网络延迟,支持云原生应用程序。 * CDN 加速、负载均衡器、云原生应用程序加速 * 有什么特点:高性能和可扩展性、支持多种网络协议和云平台、易于集成和部署项目地址:https://gitcode.com/gh_mirro...

gitblog_00071的博客 872

Dragonfly 开源项目教程

Dragonfly 开源项目教程 Dragonfly项目地址:https://gitcode.com/gh_mirrors/dragonfly6/Dragonfly 项目介绍 Dragonfly 是由阿里巴巴开发的一个开源分布式文件分发系统,旨在解决大规模文件分发和镜像分发的问题。它通过 P2P 技术优化文件传输,提高分发效率,减少带宽消耗。Dragonfly 支持 Docker 镜像和普通文件...

gitblog_00512的博客 777

Dragonfly快速入门:5分钟完成P2P文件分发系统安装与配置的完整指南

Dragonfly是一个基于P2P技术的智能文件分发系统,专门用于解决大规模文件分发和容器镜像加速的难题。通过智能调度和节点间协作,Dragonfly能够显著提升下载速度,同时降低源站带宽压力。本指南将带您在5分钟内完成Dragonfly的完整安装与配置,让您快速体验这款强大的文件分发工具。 ## 🚀 Dragonfly核心优势 Dragonfly采用P2P文件分发架构,相比传统下载方式具有

gitblog_00927的博客 497

Dragonfly多机部署实战指南:构建高效P2P镜像分发网络

Dragonfly多机部署实战指南:构建高效P2P镜像分发网络 前言 在现代容器化环境中,镜像分发效率直接影响着应用的部署速度。传统中心化的镜像分发方式在面对大规模集群时常常成为性能瓶颈。Dragonfly作为一款开源的P2P文件分发系统,通过智能的P2P网络技术显著提升了镜像分发效率。本文将详细介绍如何在多机环境中部署Dragonfly系统,构建高效的镜像分发网络。 核心概念解析 在开始部署前,...

gitblog_00302的博客 572

系统设计蓝图 / 备忘单

开发一个强大、可扩展和高效的系统可能会令人望而却步。然而,了解关键概念和组件可以使这个过程更可管理。在本博客文章中,我们将探讨系统设计的关键概念和组件,如DNS、负载均衡、API网关等,以及一个简明的备忘单,可以帮助开发人员设计不同复杂性的系统。系统设计蓝图 / 备忘单这是一份全面的视觉指南,为开发人员提供了一个快速、简单的参考,涵盖了系统设计中的关键概念和最佳实践。这个便捷的备忘单或蓝图涵盖了诸...

小技术君 290

【企业级Web应用中的文件下载处理:从S3预签名URL到压缩状态管理】

文件状态管理至关重要在数据模型中明确文件处理状态前端需根据状态执行不同逻辑预签名URL机制需谨慎使用生成时机应在文件确实可用后需考虑URL过期情况要处理S3错误响应异步任务与状态同步大文件处理应异步进行状态变更需及时通知前端考虑引入事件驱动架构防御性编程不可或缺前端需检查文件状态处理各种错误场景提供友好的用户反馈上述经验不仅适用于S3预签名URL下载场景,也适用于各种涉及文件处理的企业应用。通过合理的架构设计和状态管理,可以显著提升文件处理功能的可靠性和用户体验。

weixin_37342647的博客 1939

springboot整合minio返回url,携带X-Amz的作用,getObjectUrl和getPresignedObjectUrl的区别

这两个方法区别在于,getObjectUrl直接返回文件地址,而getPresignedObjectUrl会返回。的某个版本已被删除,只保留了getPresignedObjectUrl,而这里用的。生成url过期后会失效。但是,把这个url后面的参数去掉,这个url仍然能使用。方法去获取,但是getObjectUrl从minio的。开头的加密、签名、过期时间等信息作为url参数。配置类MinioConfig.class。关于获取返回文件地址的url,可以通过。的版本,两个方法都还有。

qq_39109264的博客 1438
上一篇: KCD 深圳站丨一场有圣诞味儿的技术盛典,快来报名聆听干货!
下一篇: SOFA Weekly|SOFAServerless & Layotto 社区会议预告、社区本周贡献、SOFA 聊天室
SOFAStack
博客等级 码龄7年 747粉丝 389原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值