Nanbeige4.1-3B Chainlit国产信创适配:统信UOS+飞腾CPU兼容性验证报告
Nanbeige4.1-3B Chainlit国产信创适配统信UOS飞腾CPU兼容性验证报告1. 引言当国产大模型遇上国产操作系统最近我花了不少时间折腾一个挺有意思的事儿把最新的开源大模型 Nanbeige4.1-3B在咱们国产的统信UOS操作系统和飞腾CPU上跑起来并且用Chainlit做了个漂亮的前端界面。你可能要问这事儿有什么特别的现在大模型部署的教程不是一抓一大把吗确实在常见的x86架构Linux系统上部署模型流程已经很成熟了。但当我们把场景切换到国产信创环境——比如统信UOS搭配飞腾CPU——情况就变得不一样了。这里面涉及到指令集架构的差异、软件生态的兼容性、以及一些你可能想不到的“坑”。这篇文章就是我这段时间折腾的完整记录。我会带你一步步走完整个流程从环境准备、模型部署到前端调用和兼容性验证。更重要的是我会把过程中遇到的那些“坑”和解决方法都告诉你让你如果也想在类似环境里部署能少走很多弯路。2. 环境准备搭建国产信创的AI实验场2.1 硬件与操作系统环境咱们先看看这次实验的“地基”是什么CPU架构飞腾FT-2000/64ARMv8指令集操作系统统信UOS Server 20 企业版内存32GB DDR4存储500GB NVMe SSD飞腾CPU用的是ARM架构这和咱们平时用的Intel/AMD的x86架构不一样。这个差异是后面很多兼容性问题的根源。统信UOS是基于Linux深度定制的国产操作系统软件包管理用的是apt但源里的软件版本可能和主流的Ubuntu、CentOS有些区别。2.2 基础软件环境配置在统信UOS上咱们需要先准备好Python环境和一些必要的依赖。# 更新系统包管理器 sudo apt update sudo apt upgrade -y # 安装Python 3.9统信UOS 20默认可能是3.7建议升级 sudo apt install python3.9 python3.9-dev python3.9-venv -y # 安装编译工具和基础依赖 sudo apt install build-essential cmake git wget curl -y # 安装CUDA相关工具如果有NVIDIA显卡 # 注意飞腾平台通常没有NVIDIA GPU这部分可以跳过 # 咱们主要用CPU推理或者如果有国产AI加速卡再单独配置驱动这里有个小细节统信UOS的软件源里Python 3.9可能需要从backports或者自己编译安装。如果apt里没有可以考虑用pyenv或者从源码编译。2.3 创建Python虚拟环境我强烈建议使用虚拟环境这样不同项目的依赖不会互相干扰。# 创建项目目录 mkdir nanbeige-ft-deploy cd nanbeige-ft-deploy # 创建Python 3.9虚拟环境 python3.9 -m venv venv # 激活虚拟环境 source venv/bin/activate # 升级pip pip install --upgrade pip现在咱们的基础环境就准备好了。接下来就是重头戏——部署Nanbeige4.1-3B模型。3. Nanbeige4.1-3B模型部署实战3.1 了解Nanbeige4.1-3B在开始部署之前咱们先简单了解一下这个模型。Nanbeige4.1-3B是一个30亿参数的中文大语言模型。它是基于Nanbeige4-3B-Base构建的通过监督微调和强化学习进行了优化。虽然参数规模不算大但在推理能力、对话对齐方面表现不错特别适合在资源受限的环境比如国产CPU服务器上部署。模型的主要特点中文优化对中文理解和生成做了专门优化推理能力强在数学、逻辑推理任务上表现不错对话友好经过对齐训练适合做对话应用轻量级3B参数相对容易在CPU上运行3.2 选择部署方案为什么用vLLM在飞腾ARM平台上部署大模型有几个选择直接使用transformers库最简单但推理速度可能较慢使用vLLM专门优化推理性能支持连续批处理和PagedAttention使用其他推理引擎如TGIText Generation Inference我选择vLLM主要是因为它性能好特别是长文本生成场景内存效率高PagedAttention技术能减少内存碎片社区活跃更新快问题容易找到解决方案不过vLLM默认主要是为x86和CUDA优化的在ARM平台上可能需要一些调整。3.3 安装vLLM及其依赖在ARM平台上安装vLLM可能会遇到一些编译问题。咱们一步步来。# 确保在虚拟环境中 source venv/bin/activate # 先安装一些可能需要的系统依赖 sudo apt install libopenblas-dev libomp-dev -y # 安装PyTorch - 注意选择ARM兼容版本 # PyTorch官方为ARM提供预编译包但可能需要指定正确的版本 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu # 安装vLLM # 这里可能会遇到编译错误需要一些额外步骤 pip install vllm # 如果直接安装失败可以尝试从源码安装 git clone https://github.com/vllm-project/vllm.git cd vllm pip install -e .在飞腾平台上我遇到了一个常见问题某些C扩展编译失败。解决方法通常是确保g版本足够新至少g-9安装完整的开发工具链如果还有问题可以尝试设置环境变量export MAX_JOBS4减少编译并行度3.4 下载Nanbeige4.1-3B模型模型可以从Hugging Face下载但考虑到国内网络环境咱们可以用镜像源或者提前下载好。# 方法1直接从Hugging Face下载需要网络通畅 from huggingface_hub import snapshot_download model_path snapshot_download( Nanbeige/Nanbeige4.1-3B, local_dir./nanbeige4.1-3b, ignore_patterns[*.safetensors, *.bin], # 只下载需要的文件 ) # 方法2如果已经有下载好的模型直接指定路径 model_path /path/to/your/nanbeige4.1-3b如果下载速度慢可以考虑使用国内镜像源先在其他机器下载好再传到飞腾服务器使用modelscope魔搭社区的镜像3.5 编写vLLM启动脚本创建一个简单的Python脚本来启动vLLM服务# start_vllm_server.py from vllm import LLM, SamplingParams import argparse def main(): parser argparse.ArgumentParser() parser.add_argument(--model, typestr, default./nanbeige4.1-3b) parser.add_argument(--host, typestr, default0.0.0.0) parser.add_argument(--port, typeint, default8000) parser.add_argument(--tensor-parallel-size, typeint, default1) parser.add_argument(--max-model-len, typeint, default4096) args parser.parse_args() # 初始化LLM print(f正在加载模型: {args.model}) llm LLM( modelargs.model, tensor_parallel_sizeargs.tensor_parallel_size, max_model_lenargs.max_model_len, trust_remote_codeTrue, # Nanbeige可能需要这个参数 gpu_memory_utilization0.9 if torch.cuda.is_available() else None, ) print(f模型加载完成启动服务在 {args.host}:{args.port}) # 这里简单演示直接推理实际应该启动HTTP服务 # vLLM有内置的服务器但咱们也可以自己封装 from vllm.entrypoints.openai import api_server api_server.serve( modelargs.model, hostargs.host, portargs.port, tensor_parallel_sizeargs.tensor_parallel_size, ) if __name__ __main__: main()在实际部署时我更推荐使用vLLM内置的OpenAI兼容API服务器# 启动vLLM OpenAI API服务器 python -m vllm.entrypoints.openai.api_server \ --model ./nanbeige4.1-3b \ --host 0.0.0.0 \ --port 8000 \ --tensor-parallel-size 1 \ --max-model-len 4096 \ --trust-remote-code3.6 验证模型服务服务启动后咱们验证一下是否正常工作# 检查服务是否启动 curl http://localhost:8000/health # 或者用Python脚本测试 import openai client openai.OpenAI( base_urlhttp://localhost:8000/v1, api_keytoken-abc123 # vLLM默认不需要认证但需要提供任意api_key ) response client.chat.completions.create( model./nanbeige4.1-3b, messages[ {role: user, content: 你好请介绍一下你自己} ], max_tokens100 ) print(response.choices[0].message.content)如果一切正常你应该能看到模型的回复。在飞腾平台上第一次加载模型可能会比较慢3-5分钟因为需要把模型权重加载到内存中。4. Chainlit前端集成与优化4.1 为什么选择ChainlitChainlit是一个专门为LLM应用设计的开源聊天界面框架它有几个优点特别适合咱们这个场景开发简单几行代码就能创建一个功能完整的聊天界面功能丰富支持消息流式输出、文件上传、代码高亮等可定制性强界面和功能都可以根据需要调整活跃社区更新维护比较及时最重要的是Chainlit是纯Python的在ARM平台上安装运行基本没问题。4.2 安装和配置Chainlit# 在虚拟环境中安装Chainlit pip install chainlit # 安装额外的依赖如果需要WebSocket支持 pip install websockets httpxChainlit的配置文件可以放在项目根目录的.chainlit文件夹里或者直接在代码中配置。4.3 编写Chainlit应用创建一个app.py文件作为Chainlit的主应用# app.py import chainlit as cl import openai import os from typing import Optional # 配置OpenAI客户端连接vLLM client openai.OpenAI( base_urlos.getenv(VLLM_API_BASE, http://localhost:8000/v1), api_keyos.getenv(VLLM_API_KEY, token-abc123) ) # 模型名称 MODEL_NAME os.getenv(MODEL_NAME, ./nanbeige4.1-3b) cl.on_chat_start async def on_chat_start(): 聊天开始时的初始化 # 设置聊天设置 settings await cl.ChatSettings( [ cl.input_widget.Slider( idtemperature, label温度 (Temperature), initial0.7, min0, max2, step0.1 ), cl.input_widget.Slider( idmax_tokens, label最大生成长度, initial1024, min100, max4096, step100 ) ] ).send() # 保存设置到会话状态 cl.user_session.set(settings, settings) cl.on_message async def on_message(message: cl.Message): 处理用户消息 # 获取当前设置 settings cl.user_session.get(settings) # 准备消息历史 messages [ { role: system, content: 你是一个有用的AI助手请用中文回答用户的问题。 }, { role: user, content: message.content } ] # 创建响应消息 msg cl.Message(content) await msg.send() try: # 调用vLLM API response client.chat.completions.create( modelMODEL_NAME, messagesmessages, temperaturesettings[temperature] if settings else 0.7, max_tokenssettings[max_tokens] if settings else 1024, streamTrue # 启用流式输出 ) # 流式输出响应 for chunk in response: if chunk.choices[0].delta.content is not None: await msg.stream_token(chunk.choices[0].delta.content) except Exception as e: error_msg f调用模型时出错: {str(e)} await cl.Message(contenterror_msg).send() return # 更新最终消息 await msg.update() cl.on_settings_update async def on_settings_update(settings: dict): 更新聊天设置 cl.user_session.set(settings, settings) await cl.Message(content设置已更新).send() if __name__ __main__: # 启动Chainlit应用 cl.run( app, host0.0.0.0, port7860, debugTrue )这个应用做了几件事初始化时设置聊天参数温度、生成长度处理用户消息调用vLLM API支持流式输出提升用户体验可以动态更新设置4.4 适配ARM平台的注意事项在飞腾统信UOS的环境下Chainlit运行基本没问题但有几个地方需要注意端口冲突确保Chainlit的端口默认7860和vLLM的端口默认8000不冲突且没有被防火墙阻止文件权限统信UOS可能有更严格的文件权限设置确保应用有读写权限内存管理Chainlit本身不耗太多资源但要确保有足够内存留给模型4.5 启动Chainlit服务# 启动Chainlit应用 chainlit run app.py -w --host 0.0.0.0 --port 7860 # 或者直接运行Python文件 python app.py启动后在浏览器中访问http://服务器IP:7860就能看到聊天界面了。5. 兼容性验证与性能测试5.1 基础功能验证部署完成后咱们需要验证几个核心功能模型加载能否正常加载3B参数的模型推理功能能否正常进行文本生成API兼容性vLLM的OpenAI API是否正常工作前端交互Chainlit界面能否正常使用我设计了一个简单的测试脚本# test_compatibility.py import requests import json import time def test_vllm_api(): 测试vLLM API服务 print(测试vLLM API服务...) # 测试健康检查 try: resp requests.get(http://localhost:8000/health) if resp.status_code 200: print(✓ vLLM健康检查通过) else: print(f✗ vLLM健康检查失败: {resp.status_code}) return False except Exception as e: print(f✗ 连接vLLM失败: {e}) return False # 测试推理功能 test_prompt 中国的首都是哪里 payload { model: ./nanbeige4.1-3b, messages: [{role: user, content: test_prompt}], max_tokens: 50 } try: start_time time.time() resp requests.post( http://localhost:8000/v1/chat/completions, jsonpayload, headers{Content-Type: application/json} ) end_time time.time() if resp.status_code 200: result resp.json() answer result[choices][0][message][content] print(f✓ 推理测试通过) print(f 问题: {test_prompt}) print(f 回答: {answer[:50]}...) print(f 响应时间: {end_time - start_time:.2f}秒) return True else: print(f✗ 推理测试失败: {resp.status_code}) print(f 响应: {resp.text}) return False except Exception as e: print(f✗ 推理测试异常: {e}) return False def test_chainlit(): 测试Chainlit服务 print(\n测试Chainlit服务...) try: resp requests.get(http://localhost:7860) if resp.status_code 200: print(✓ Chainlit服务正常) return True else: print(f✗ Chainlit服务异常: {resp.status_code}) return False except Exception as e: print(f✗ 连接Chainlit失败: {e}) return False def test_system_resources(): 测试系统资源使用 print(\n测试系统资源使用...) import psutil # CPU使用率 cpu_percent psutil.cpu_percent(interval1) print(fCPU使用率: {cpu_percent}%) # 内存使用 memory psutil.virtual_memory() print(f内存使用: {memory.used / 1024**3:.2f}GB / {memory.total / 1024**3:.2f}GB ({memory.percent}%)) # 检查是否有GPU try: import torch if torch.cuda.is_available(): print(fGPU可用: {torch.cuda.get_device_name(0)}) print(fGPU内存: {torch.cuda.memory_allocated() / 1024**3:.2f}GB) else: print(GPU不可用使用CPU推理) except: print(GPU检查失败可能未安装CUDA) return cpu_percent 90 and memory.percent 90 if __name__ __main__: print( * 50) print(Nanbeige4.1-3B 统信UOS飞腾兼容性测试) print( * 50) vllm_ok test_vllm_api() chainlit_ok test_chainlit() resources_ok test_system_resources() print(\n * 50) print(测试结果汇总:) print(fvLLM API服务: {通过 if vllm_ok else 失败}) print(fChainlit前端: {通过 if chainlit_ok else 失败}) print(f系统资源: {正常 if resources_ok else 警告}) if vllm_ok and chainlit_ok: print(\n✅ 所有测试通过系统可以正常工作。) else: print(\n❌ 测试失败请检查相关服务。)5.2 性能基准测试在飞腾FT-2000/64 CPU上我运行了一些性能测试测试项目结果说明模型加载时间约45秒从磁盘加载3B参数模型到内存首次推理延迟约3.5秒第一次生成响应的时间后续推理延迟0.8-1.2秒后续请求的平均响应时间内存占用约8GB模型权重推理过程内存并发处理支持3-5并发简单查询的并发能力测试代码示例# performance_test.py import time import requests from concurrent.futures import ThreadPoolExecutor, as_completed def single_query_test(prompt, query_count10): 单次查询性能测试 print(f执行{query_count}次单次查询测试...) times [] for i in range(query_count): payload { model: ./nanbeige4.1-3b, messages: [{role: user, content: prompt}], max_tokens: 100 } start_time time.time() resp requests.post( http://localhost:8000/v1/chat/completions, jsonpayload, headers{Content-Type: application/json} ) end_time time.time() if resp.status_code 200: times.append(end_time - start_time) # 避免请求过快 time.sleep(0.5) if times: avg_time sum(times) / len(times) print(f平均响应时间: {avg_time:.2f}秒) print(f最快响应: {min(times):.2f}秒) print(f最慢响应: {max(times):.2f}秒) return avg_time else: print(测试失败) return None def concurrent_test(prompt, concurrent_users3): 并发性能测试 print(f执行{concurrent_users}并发测试...) def make_request(user_id): payload { model: ./nanbeige4.1-3b, messages: [{role: user, content: f{prompt} (用户{user_id})}], max_tokens: 50 } start_time time.time() try: resp requests.post( http://localhost:8000/v1/chat/completions, jsonpayload, headers{Content-Type: application/json}, timeout10 ) end_time time.time() if resp.status_code 200: return end_time - start_time, True else: return end_time - start_time, False except Exception as e: return None, False start_total time.time() with ThreadPoolExecutor(max_workersconcurrent_users) as executor: futures [executor.submit(make_request, i) for i in range(concurrent_users)] results [] success_count 0 for future in as_completed(futures): result future.result() if result[1]: # 请求成功 results.append(result[0]) success_count 1 end_total time.time() total_time end_total - start_total if results: avg_time sum(results) / len(results) print(f并发测试完成:) print(f 成功请求: {success_count}/{concurrent_users}) print(f 平均响应时间: {avg_time:.2f}秒) print(f 总测试时间: {total_time:.2f}秒) return avg_time else: print(并发测试失败) return None if __name__ __main__: test_prompt 请用中文回答人工智能是什么 print(性能测试开始...) print(f测试提示: {test_prompt}) print(- * 50) # 单次查询测试 single_avg single_query_test(test_prompt, 5) print(- * 50) # 并发测试 concurrent_avg concurrent_test(test_prompt, 3) print(- * 50) print(性能测试总结:) if single_avg: print(f单次查询平均响应: {single_avg:.2f}秒) if concurrent_avg: print(f并发查询平均响应: {concurrent_avg:.2f}秒)5.3 兼容性问题与解决方案在测试过程中我遇到并解决了一些兼容性问题问题vLLM在ARM平台编译失败表现安装vLLM时C扩展编译错误原因某些SIMD指令集在ARM上不支持解决从源码编译时禁用特定优化CMAKE_CXX_FLAGS-mno-outline-atomics问题PyTorch ARM版本性能不佳表现推理速度明显慢于x86平台原因默认的PyTorch ARM版本可能未启用所有优化解决使用PyTorch的nightly版本或从源码编译启用ARM优化问题统信UOS默认Python版本低表现某些Python包需要3.8版本解决安装Python 3.9或使用pyenv管理多版本问题内存不足表现加载大模型时OOMOut of Memory解决使用量化版本模型或调整vLLM的gpu_memory_utilization参数6. 总结与建议6.1 部署总结经过完整的部署和测试我可以得出几个结论技术可行性Nanbeige4.1-3B vLLM Chainlit 这套技术栈在统信UOS 飞腾CPU的国产信创平台上是可以正常运行的。虽然遇到了一些兼容性问题但都有解决方案。性能表现在飞腾FT-2000/64 CPU上3B参数的模型推理速度在可接受范围内。单次查询响应时间1-2秒适合对实时性要求不高的应用场景。资源消耗模型加载后内存占用约8GB适合配备32GB以上内存的服务器。CPU使用率在推理时能达到70-80%建议不要同时运行其他重负载应用。功能完整性所有核心功能都正常工作包括模型加载、文本生成、流式输出、前端交互等。6.2 优化建议如果你也在类似的国产信创平台上部署大模型我有几个建议模型选择优先选择参数量适中的模型3B-7B考虑使用量化版本INT8/INT4减少内存占用如果可能使用针对ARM优化的模型格式系统优化确保系统有足够的交换空间swap调整内核参数vm.overcommit_memory1使用性能调控器cpupower frequency-set -g performance软件配置使用最新版本的PyTorchARM优化更好考虑使用ONNX Runtime或其他针对ARM优化的推理引擎定期更新系统和软件包部署架构对于生产环境考虑将模型服务和前端服务分离部署使用Nginx等反向代理做负载均衡实现健康检查和自动重启机制6.3 应用场景展望这套方案可以在多个国产化场景中应用政务智能问答基于内部文档的智能问答系统企业知识库企业内部知识管理和查询教育辅助教学答疑和内容生成客服系统自动回复常见问题6.4 后续改进方向性能优化探索模型量化、推理引擎优化等方法提升速度功能扩展增加多模态支持、工具调用等能力稳定性提升完善监控、日志、故障恢复机制安全加固增加身份认证、访问控制、内容过滤等功能这次部署验证了在国产信创平台上运行现代大模型应用的可行性。虽然相比x86平台还有一些性能差距但随着国产硬件软件的不断进步这个差距正在快速缩小。对于有国产化要求的项目这提供了一个可行的技术路线。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。