ServiceContainer

本文介绍了一种利用ServiceContainer类来管理和使用公共服务的方法。通过示例代码展示了如何添加和移除服务,以及如何根据服务的状态改变UI元素的颜色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

把一项公共服务功能定义为一个Service(类);这样可以一次加入(AddService(type ,object)),多次使用(GetService(type))。另外在MSDN中还有其他成员操作ServiceContainer。


例子:

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using System.ComponentModel.Design;

namespace ServiceContainer1
{
    public partial class ServiceContainerTest : DevExpress.XtraEditors.XtraForm
    {
        private ServiceContainer seContainer=new ServiceContainer();
        public ServiceContainerTest()
        {
            InitializeComponent();
        }

        private ServiceState state;
        public ServiceState State
        {
            get { return state; }
            set
            {
                state = value;
                switch (state)
                {
                    case ServiceState.ServiceObtained:
                        this.textBox1.BackColor = Color.Green;
                        break;
                    case ServiceState.ServiceRemoved:
                        this.textBox1.BackColor = Color.Red;
                        break;
                }
            }
        }
        private void btnRemoveService_Click(object sender, EventArgs e)
        {
            RemoveService();
        }

        private void btnAddService_Click(object sender, EventArgs e)
        {
            AddService();
        }

        private void AddService()
        {
            if (seContainer.GetService(typeof(TextService1)) != null)
            {
                var txService = seContainer.GetService(typeof(TextService1));
                this.textBox2.Text = (txService as TextService1).Title + "******" + (txService as TextService1).Content;
               
            }
            else
            {
                seContainer.AddService(typeof(TextService1), new TextService1 { Title = this.textBox1.Text, Content = "Commit" });
                this.textBox1.Text = this.textBox1.Text + "******Commit1";
            }
            State = ServiceState.ServiceObtained;
        }

        private void RemoveService()
        {
            if (seContainer.GetService(typeof(TextService1)) != null)
            {
                seContainer.RemoveService(typeof(TextService1));
                this.textBox1.Text = "RemoveSuccess";

            }
           
            State = ServiceState.ServiceRemoved;
        }
        public enum ServiceState
        {
            ServiceObtained=1,
            ServiceRemoved=2
        }
    }

    public class TextService1
    {
        public string Title { set; get; }
        public string Content { get; set; }
    }
}

<think>我们正在使用Docker Compose来部署vLLM服务,运行Qwen3-14B-AWQ模型。配置文件分为基础配置(docker-compose.base.yml)和模型专用配置(docker-compose.qwen3-14b-awq.yml)。通过组合这两个文件来启动服务。 基础配置(docker-compose.base.yml)设置了通用的服务参数,包括NVIDIA运行时、挂载卷、环境变量、端口映射等。模型专用配置(docker-compose.qwen3-14b-awq.yml)通过`extends`关键字继承基础配置,并指定容器名称和运行命令。 启动命令使用两个配置文件:`docker compose -f docker-compose.base.yml -f docker-compose.qwen3-14b-awq.yml up -d` 这种配置方式的好处是: 1. 基础配置可以复用,多个模型服务可以共享相同的底层设置。 2. 模型专用配置可以独立管理,方便切换模型。 然而,从提供的配置中,我注意到几个潜在的问题和改进点: 1. **挂载卷路径**:在基础配置中,我们挂载了`~/.cache/huggingface`到容器内的`/root/.cache/huggingface`。但需要注意的是,在Docker Compose中,`~`会被解析为当前用户的家目录,但在生产环境中,建议使用绝对路径以避免歧义。 2. **环境变量**:`HUGGING_FACE_HUB_TOKEN`是敏感信息,直接写在Compose文件中可能不安全。建议使用Docker secrets或环境变量文件来管理。 3. **端口固定**:基础配置中固定了端口映射`8000:8000`。这意味着同一时间只能运行一个模型服务。如果需要在同一台机器上运行多个模型服务,需要为每个服务分配不同的端口。 4. **命令参数**:在模型专用配置中,我们只指定了`--model`和`--gpu-memory-utilization`。根据实际需求,可能需要添加更多参数,例如`--max-model-len`(最大上下文长度)等。 5. **资源限制**:基础配置中没有对CPU和内存进行限制,如果服务器上运行多个容器,建议设置资源限制以避免资源竞争。 6. **容器名称**:在模型专用配置中指定了容器名称,如果同时启动多个模型服务,容器名称会冲突。因此,这种配置方式适合一次只运行一个模型服务。 下面是一个改进后的配置示例: **基础配置(docker-compose.base.yml)**: ```yaml version: '3.8' services: vllm-service: image: vllm/vllm-openai:latest runtime: nvidia deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] volumes: - /path/to/huggingface/cache:/root/.cache/huggingface # 使用绝对路径 env_file: - .env # 从.env文件读取环境变量,包括HUGGING_FACE_HUB_TOKEN ports: - "8000:8000" ipc: host restart: unless-stopped ``` **模型专用配置(docker-compose.qwen3-14b-awq.yml)**: ```yaml version: '3.8' services: vllm-service: extends: file: docker-compose.base.yml service: vllm-service container_name: qwen3_14B_vllm_container # 注意:如果同时运行多个,需要不同的名字 command: > --model Qwen/Qwen3-14B-AWQ --gpu-memory-utilization 0.8 --max-model-len 8192 # 添加其他参数 # 可以根据需要添加更多参数 ``` 同时,创建一个`.env`文件来存储敏感信息: ```bash # .env 文件 HUGGING_FACE_HUB_TOKEN=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 ``` 启动命令不变: ```bash docker compose -f docker-compose.base.yml -f docker-compose.qwen3-14b-awq.yml up -d ``` **解释**: - 使用绝对路径挂载卷,避免`~`解析问题。 - 使用`env_file`引入环境变量,将敏感信息放在`.env`文件中(注意不要将`.env`文件提交到版本控制)。 - 在模型专用配置中,可以添加更多运行参数来优化模型服务。 **注意事项**: - 如果需要运行多个模型服务,需要为每个服务创建不同的Compose文件(模型专用配置),并指定不同的容器名称和端口映射(例如,在模型专用配置中覆盖端口映射,如`- "8001:8000"`,然后使用不同的端口启动)。 **相关优化建议**: 1. 使用`--tensor-parallel-size`参数来设置张量并行度,以充分利用多GPU。 2. 根据GPU内存大小调整`--gpu-memory-utilization`,0.8表示使用GPU内存的80%。 3. 如果需要处理大量并发请求,可以添加`--max-parallel-loading-workers`来增加并行加载工作线程数。 ### §§相关问题§§: 1. 如何在同一台服务器上部署多个vLLM模型服务? 2. 如何为vLLM服务设置身份验证? 3. 如何监控vLLM服务的运行状态和性能指标? 4. 如何调整vLLM服务的参数以优化推理速度和资源利用率?</think>### Docker Compose 部署 vLLM 服务优化方案 您当前的 Docker Compose 配置用于部署 Qwen3-14B-AWQ 模型,以下是我对配置的分析和优化建议: #### 1. 当前配置分析 ```yaml # docker-compose.base.yml version: '3.8' services: vllm-service: image: vllm/vllm-openai:latest runtime: nvidia deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] volumes: - ~/.cache/huggingface:/root/.cache/huggingface environment: - HUGGING_FACE_HUB_TOKEN=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 ports: - "8000:8000" ipc: host restart: unless-stopped # docker-compose.qwen3-14b-awq.yml version: '3.8' services: vllm-service: extends: file: docker-compose.base.yml service: vllm-service container_name: qwen3_14B_vllm_container command: > --model Qwen/Qwen3-14B-AWQ --gpu-memory-utilization 0.8 ``` #### 2. 优化建议 ##### 问题 1:安全风险 HF Token 直接暴露在 Compose 文件中存在安全风险 **解决方案**:使用 Docker secrets 或环境变量文件 ```yaml # 修改 docker-compose.base.yml environment: - HUGGING_FACE_HUB_TOKEN_FILE=/run/secrets/hf_token secrets: hf_token: file: ./secrets/hf_token.txt ``` ##### 问题 2:GPU 资源分配 `count: all` 可能过度分配 GPU 资源 **解决方案**:指定 GPU 数量 ```yaml # 修改 docker-compose.base.yml devices: - driver: nvidia count: 1 # 根据实际 GPU 数量调整 capabilities: [gpu] ``` ##### 问题 3:性能优化 缺少关键性能参数 **优化配置**: ```yaml # 修改 docker-compose.qwen3-14b-awq.yml command: > --model Qwen/Qwen3-14B-AWQ --gpu-memory-utilization 0.9 --max-model-len 8192 --tensor-parallel-size 1 --max-num-seqs 256 --max-num-batched-tokens 4096 ``` ##### 问题 4:日志管理 缺少日志配置,不便排查问题 **解决方案**: ```yaml # 修改 docker-compose.base.yml volumes: - ~/.cache/huggingface:/root/.cache/huggingface - ./logs:/var/log/vllm # 添加日志卷 logging: driver: "json-file" options: max-size: "100m" max-file: "3" ``` #### 3. 完整优化配置 **docker-compose.optimized.yml**: ```yaml version: '3.8' services: vllm-service: image: vllm/vllm-openai:latest runtime: nvidia container_name: qwen3_14B_optimized deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] volumes: - ~/.cache/huggingface:/root/.cache/huggingface - ./logs:/var/log/vllm environment: - HUGGING_FACE_HUB_TOKEN_FILE=/run/secrets/hf_token ports: - "8000:8000" ipc: host restart: unless-stopped command: > --model Qwen/Qwen3-14B-AWQ --gpu-memory-utilization 0.9 --max-model-len 8192 --tensor-parallel-size 1 --max-num-seqs 256 --max-num-batched-tokens 4096 --quantization awq --disable-log-requests secrets: - hf_token secrets: hf_token: file: ./secrets/hf_token.txt ``` #### 4. 部署脚本 创建部署脚本 `deploy.sh`: ```bash #!/bin/bash # 创建 secrets 目录 mkdir -p secrets echo "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" > secrets/hf_token.txt # 创建日志目录 mkdir -p logs # 启动服务 docker compose -f docker-compose.optimized.yml up -d # 健康检查 echo "等待服务启动..." sleep 10 curl -X GET "http://localhost:8000/v1/models" | jq . ``` #### 5. 性能监控脚本 创建监控脚本 `monitor.sh`: ```bash #!/bin/bash container_id=$(docker ps -q --filter "name=qwen3_14B_optimized") # 监控 GPU 使用情况 watch -n 1 "docker exec $container_id nvidia-smi --query-gpu=utilization.gpu,memory.used --format=csv" # 监控日志 tail -f logs/*.log ``` ### 关键优化点解释: 1. **GPU 资源管理**: - 明确指定 GPU 数量避免资源冲突 - 内存利用率提高到 0.9(在安全范围内) 2. **性能参数**: - `--max-model-len 8192`:支持更长上下文 - `--max-num-seqs 256`:提高并发处理能力 - `--tensor-parallel-size 1`:单 GPU 优化 3. **安全增强**: - 使用 Docker secrets 管理敏感信息 - 限制日志文件大小防止磁盘溢出 4. **可观测性**: - 独立的日志目录方便问题排查 - 监控脚本实时查看资源使用 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值