-
资源购买资源名称规格操作系统存储ECS鲲鹏内存优化型 km1.xlarge.8 4vCPUs 32GiBHuawei Cloud EulerOS 2.0 标准版 64位 ARM版系统盘:超高IO,100GiB基础软件安装Condamkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh -O ~/miniconda3/miniconda.sh bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3 rm -f ~/miniconda3/miniconda.sh source ~/miniconda3/bin/activate conda init --allPython & Pip官方默认安装的python版本为3.99,版本比较低,这里使用Conda创建一个3.10的虚拟环境。conda create -n QAnything python=3.10 conda activate QAnything # 设置 pip软件源 pip config set global.index-url https://repo.huaweicloud.com/repository/pypi/simple python -m pip install --upgrade pipDocker & Docker Compose官方默认安装的docker版本为18.09.0,版本比较低,很多新的特性无法使用,如docker-buildx等,建议升级到最新版本。因为官方并未提供Huawei Cloud EulerOS 2.0的repo支持,所以可以采取以下方式进行安装。如果之前安装过docker,要先删掉之后再安装依赖sudo dnf remove docker docker-ce-cli docker-selinux docker-engine下载repo文件wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo sudo sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo sudo sed -i 's+$releasever+9.9+' /etc/yum.repos.d/docker-ce.repo安装新版本sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin设置开机启动sudo systemctl enable --now docker配置镜像加速器vi /etc/docker/daemon.json # 粘贴以下配置,保存退出,镜像地址可替换成自己在华为云申请的镜像加速器地址 { "registry-mirrors": [ "https://docker.1ms.run", "https://docker.xuanyuan.me"] } 重启dockersystemctl restart docker下载QAnything源码git clone https://github.com/netease-youdao/QAnything.git官方的docker镜像xixihahaliu01/qanything-linux:v1.5.1 是在X86的服务器下构建的,无法在ARM架构下运行,需要手动构建Docker镜像。构建QAnything镜像进入build_images,查看Dockerfile,可以得到以下几点信息Dockerfile文件要移动到父目录下才能构建需要准备models、nltk_data文件夹数据# 复制 requirements.txt 文件到容器中 COPY requirements.txt /tmp/requirements.txt # 复制 models 文件夹到 /root 目录 COPY models /root/models COPY nltk_data /root/nltk_data想知道model文件夹下要准备什么数据就要看这个文件复制到容器后是如何使用的,通过docker-compose-linux.yaml 可知,运行qanything-container-local容器时会执行/bin/bash -c "cd /workspace/QAnything && bash scripts/entrypoint.sh",打开script/entrypoint.sh,其中跟/root/models和/root/nltk_data有关的信息如下:# 创建软连接 if [ ! -L "/workspace/QAnything/qanything_kernel/dependent_server/embedding_server/embedding_model_configs_v0.0.1" ]; then # 如果不存在软连接 cd /workspace/QAnything/qanything_kernel/dependent_server/embedding_server && ln -s /root/models/linux_onnx/embedding_model_configs_v0.0.1 . fi if [ ! -L "/workspace/QAnything/qanything_kernel/dependent_server/rerank_server/rerank_model_configs_v0.0.1" ]; then # 如果不存在软连接 cd /workspace/QAnything/qanything_kernel/dependent_server/rerank_server && ln -s /root/models/linux_onnx/rerank_model_configs_v0.0.1 . fi if [ ! -L "/workspace/QAnything/qanything_kernel/dependent_server/ocr_server/ocr_models" ]; then # 如果不存在软连接 cd /workspace/QAnything/qanything_kernel/dependent_server/ocr_server && ln -s /root/models/ocr_models . # 创建软连接 fi if [ ! -L "/workspace/QAnything/qanything_kernel/dependent_server/pdf_parser_server/pdf_to_markdown/checkpoints" ]; then # 如果不存在软连接 cd /workspace/QAnything/qanything_kernel/dependent_server/pdf_parser_server/pdf_to_markdown/ && ln -s /root/models/pdf_models checkpoints # 创建软连接 fi if [ ! -L "/workspace/QAnything/nltk_data" ]; then # 如果不存在软连接 cd /workspace/QAnything/ && ln -s /root/nltk_data . # 创建软连接 fi从脚本内容结合官方README可知,models文件夹中要准备embedding、rerank、ocr、pdf四个模型,nltk_data下要准备nltk 数据model文件夹下要准备的数据下面下载模型数据都是在QAnything目录下执行安装modelscopepip install modelscopebce-embedding-base_v1modelscope download --model netease-youdao/bce-embedding-base_v1 --local_dir ./models/linux_onnx/embedding_model_configs_v0.0.1bce-reranker-base_v1modelscope download --model netease-youdao/bce-reranker-base_v1 --local_dir ./models/linux_onnx/rerank_model_configs_v0.0.1pdf_models和ocr_modelmodelscope download --model netease-youdao/QAnything-pdf-parser --local_dir ./models/pdf_modelspdf_models中已经包含了ocr,可以重用,这里要改下entrypoint.sh中ocr_models路径if [ ! -L "/workspace/QAnything/qanything_kernel/dependent_server/ocr_server/ocr_models" ]; then # 如果不存在软连接 cd /workspace/QAnything/qanything_kernel/dependent_server/ocr_server && ln -s /root/models/pdf_models/ocr ocr_models # 创建软连接 finltk_data文件夹下要准备的数据modelscope download --dataset CaiJichang/nltk_data --local_dir ./nltk_data构建之前需要对项目中的一些文件做些优化。Dockfile优化在QAnything目录下创建新的Dockerfilevi Dockerfile # 添加以下内容 # 使用官方 Python 3.10.14 镜像作为基础镜像 FROM python:3.10-slim # 替换APT源 RUN sed -i 's/http:\/\/deb.debian.org\//https:\/\/mirrors.huaweicloud.com\//g' /etc/apt/sources.list.d/debian.sources # 设置时区 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 安装 RUN apt-get update && apt-get install -y \ vim \ wget \ htop \ build-essential \ procps \ && rm -rf /var/lib/apt/lists/\* # 创建TikToken缓存目录 RUN mkdir /opt/tiktoken_cache # 下载TikToken模型缓存 ARG TIKTOKEN_URL="https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken" RUN wget -O /opt/tiktoken_cache/$(echo -n $TIKTOKEN_URL | sha1sum | head -c 40) "$TIKTOKEN_URL" # 设置环境变量指向TikToken缓存目录 ENV TIKTOKEN_CACHE_DIR=/opt/tiktoken_cache # 复制 requirements.txt 文件到容器中 COPY requirements.txt /tmp/requirements.txt RUN pip config set global.index-url https://repo.huaweicloud.com/repository/pypi/simple \ && python -m pip install --upgrade pip # 安装 Python 依赖(torch单独安装CPU版本) RUN pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu \ && pip install -r /tmp/requirements.txt # 复制 models 文件夹到 /root 目录 COPY models /root/models COPY nltk_data /root/nltk_data # 设置工作目录 WORKDIR /workspace # 清理 APT 缓存 RUN apt-get clean && rm -rf /var/lib/apt/lists/\* # 设置默认命令 CMD ["/bin/bash"] requirements.txt优化默认的依赖包中会安装CUDA依赖,本次我们是纯CPU部署,不需要这些。vi requirements.txt # 添加以下内容 onnxruntime==1.17.1 xgboost-cpu==3.0.0 concurrent-log-handler==0.9.25 boto3==1.34.79 sanic==23.6.0 sanic_ext==23.6.0 langchain-openai==0.3.7 langchain_elasticsearch==0.3.2 langchain-community==0.3.18 unstructured==0.12.4 unstructured[pptx]==0.12.4 unstructured[md]==0.12.4 opencv-python-headless==4.9.0.80 python-dotenv==1.0.1 mysql-connector-python==8.2.0 pymilvus==2.5.5 aiomysql==0.2.0 PyMuPDF==1.24.4 openpyxl==3.1.2 python-docx==1.1.0 newspaper4k==0.9.3.1 newspaper4k[zh]==0.9.3.1 duckduckgo-search==5.3.0b4 html2text==2024.2.26 mistune==3.0.2 flair==0.13.0 nltk==3.8.1 pandas==2.1.1 scikit-learn==1.3.2 chardet==5.2.0 scipy==1.10.1 fastchat==0.1.0 wikipedia==1.4.0 Wikipedia-API==0.6.0 rouge-score==0.1.2 toml==0.10.2 tqdm==4.66.1 anthropic==0.25.7 streamlit==1.34.0 zhipuai==2.0.1.20240429 tiktoken==0.7.0 modelscope==1.13.0 cryptography==42.0.8 shapely==2.0.4 pyclipper==1.3.0.post5 pdfplumber==0.11.0 markdownify==0.12.1 datrie==0.8.2 hanziconv==0.3.2 PyPDF2==3.0.1 lxml_html_clean==0.1.1 docx2txt==0.8 构建docker镜像# 在QAnything目录下执行 docker build -t xixihahaliu01/qanything-linux:v1.5.1 . docker-compose-linux.yaml优化在qanything_local下的volumes,其实不用把整个QAnything映射到容器中,只需要映射需要的文件即可 volumes: - ${DOCKER_VOLUME_DIRECTORY:-.}/qanything_kernel:/workspace/QAnything/qanything_kernel - ${DOCKER_VOLUME_DIRECTORY:-.}/logs:/workspace/QAnything/logs - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes:/workspace/QAnything/volumes - ${DOCKER_VOLUME_DIRECTORY:-.}/QANY_DB:/workspace/QAnything/QANY_DB - ${DOCKER_VOLUME_DIRECTORY:-.}/scripts/entrypoint.sh:/workspace/QAnything/scripts/entrypoint.sh代码优化qanything_kernel/core/retriever/vectorstore.py@get_time def delete_expr(self, expr): # 如果expr为空,则不执行删除操作 result = self.get_local_chunks(expr) if result is None or len(result) == 0: debug_logger.info(f'expr: {expr} not found in local milvus') return qanything_kernel/dependent_server/embedding_server/embedding_server.py 和 qanything_kernel/dependent_server/rerank_server/rerank_server.py增加以下代码from sanic.worker.manager import WorkerManager WorkerManager.THRESHOLD = 600 qanything_kernel/configs/model_config.py增加以下配置DEFAULT_PROMPT_TEMPLATE = """ 参考信息: {{context}} --- 我的问题或指令: {{question}} --- 请根据上述参考信息回答我的问题或回复我的指令。前面的参考信息可能有用,也可能没用,你需要从我给出的参考信息中选出与我的问题最相关的那些,来为你的回答提供依据。回答一定要忠于原文,简洁但不丢信息,不要胡乱编造。我的问题或指令是什么语种,你就用什么语种回复,你的回复: """ # 匹配后单段上下文长度 CHUNK_SIZE = 800 修改以下配置# 知识库检索时返回的匹配内容条数 VECTOR_SEARCH_TOP_K = 5 # embedding检索的相似度阈值,归一化后的L2距离,设置越大,召回越多,设置越小,召回越少 VECTOR_SEARCH_SCORE_THRESHOLD = 0.5 qanything_kernel/core/local_doc_qa.py # 在下面语句后增加 DEFAULT_PROMPT_TEMPLATE from qanything_kernel.configs.model_config import DEFAULT_PROMPT_TEMPLATE # 586~592做以下修改 if custom_prompt: # prompt_template = CUSTOM_PROMPT_TEMPLATE.replace("{{custom_prompt}}", custom_prompt) prompt_template = custom_prompt else: # system_prompt = SYSTEM.replace("{{today_date}}", today).replace("{{current_time}}", now) # prompt_template = PROMPT_TEMPLATE.replace("{{system}}", system_prompt).replace("{{instructions}}",INSTRUCTIONS) prompt_template = DEFAULT_PROMPT_TEMPLATE 启动项目run.sh 修改# 修改run.sh 93行 source ./.env启动# 在QAnything目录下执行 bash run.sh出现以下信息表示启动成功了访问项目在运行run.sh过程中会询问是在本地部署还是云服务上部署,如果是云服务器部署,就填入弹性IP的地址即可。体验项目新建知识库上传文档目前支持文件格式md、txt、pdf、jpg、png、jpeg、docx、xlsx、pptx、eml、csv, 单个文档小于30M, 单张图片小于5M, 文件总大小不得超过125M.文档越大,处理时间越长.备注中可以看大部分时间都耗费在embedding中,如果文档太大也可能会超时导致失败.预览切片结果PDF文件的解析原理是将其转换成Markedown文件,这可以最大限度保证原版的样式和内容.可以对照源文件对比查看,支持编辑修改.配置LLM大模型这里使用华为云ModelArts Studio大模型服务来作为LLM的提供商进入产品官网ModelArts Studio在API Key管理菜单项中申请一个Api Key进入在线推理菜单项,领取大模型服务免费额度进入对应服务的调用说明获取调用参数配置模型提供商问答会话接下来就可以进行问答会话了,这里用的是外部LLM服务,响应还是非常快的.
-
人工智能-02 准备开发环境持续更新,欢迎批评指正。创建服务器先准备一个服务器,最好能独立使用,方便后续开发和调试,也便于能随时对环境做更改且不影响其他人。通过ecs购买服务器参考官网的指导购买一个ECS服务器。cid:link_10注意:1、CPU、内存、存储资源以满足基本使用即可,根据自己情况选择,可以留一点余量,不用太大,以免造成浪费,后续有扩容需求,还可以继续扩充。如果是经常用可以选包周期,如果偶尔用,可以选按需购买。2、操作系统根据需求选择对应的镜像和版本。3、如果需要通过SSH登录Linux弹性云服务器时,弹性云服务器必须绑定弹性公网IP(EIP),其他参数如果没有特殊要求参考链接选择默认即可,确认购买的服务器参数,创建服务器。4、服务器不用的时候,可以先关机,节省费用。安全设置为了服务器安全,可以通过安全组配置网络策略,防止服务器被入侵。默认安全组的规则是在出方向上的数据报文全部放行,入方向访问受限,所以重点配置入方向的安全策略,可以以最小策略为原则,即只开放指定的用途(端口和协议)给指定的来源(IP),后面有其他需求的时候再开放。如:TCP:22端口,允许SSH远程连接Linux弹性云服务器。TCP:20-21端口,允许通过FTP上传和下载文件。ICMP,允许ping程序测试弹性云服务器的连通。服务器基本配置登录服务器通过轻量级的putty或者专业的Xshell、MobaXterm等其他工具,连接即可。在公司的工具网站上下载使用。cid:link_18 PING操作ping提供了基本的网络问题定位功能。如果不能使用ping操作,首先,检查ECS服务器的安全组是否放通ICMP协议。如果想让远端ping通服务器,需要放通入规则,如果服务器本地想ping通,需要放通出规则。再次,检查是否禁用了ping命令。临时允许PING操作的命令排查一下,命令重启失效:#echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all其他,检查防火墙配置等。参考:cid:link_1Windows下的ping操作默认ping 4次,Linux默认会一直执行,通过- c参数可以指定ping多少次后自动终止。DNS解析上面ping用的IP地址,有时我们经常使用域名去ping,但域名却无法ping通,再结合提示信息大概率可以看出是没有做域名解析。临时生效:在/etc/resolv.conf 配置公司内网域名服务器后,可以解析域名。如果没有配置NDS域名解析服务器,ping域名的时候就会报Could not resolve 'xx域名',域名解析服务器可以在电脑上通过ipconfig –all查询后填上去,也可以内网上找一些。参考:cid:link_11永久生效(~不知道为什么实际操作不生效,暂时还是用临时方法~):/etc/resolv.conf是一个软连接,所以上面的方法会在重启服务器后失效。如果想永久生效就在/etc/resolvconf/resolv.conf.d/base文件中配置,然后使用sudo resolvconf -u使配置生效。 永久生效:找了DNS和OS的oncall同事帮定位后找到了解决方法。再次cat /etc/resolv.conf,文件里面写了关键信息,只是一开始不太懂,信息提示:1、不要编辑这个文件,因为会被覆盖2、这是一个软连接文件,实际指向了../run/resolvconf/resolv.conf3、运行systemd-resolve –status查看实际的nameservers执行systemd-resolve --status,发现:这里的DNS是创建服务器的时候,弹性网卡上绑定的子网对应的DNS,重新创建子网,修改DNS服务器地址,更换服务器的VPC,重启机器,DNS解析正确,ping域名正常,NDS永久生效。python开发环境安装配置配置华为内源新环境安装后,很多软件都是操作系统自带的。可以先更新一次。默认系统的安装包地址是国外的地址,下载会很慢或者直接下载失败,因此需要先替换软件包下载源地址,这里替换为公司的地址。华为开源镜像站的地址:https://mirrors.huaweicloud.com(公网)https://repo.huaweicloud.com(公网)首先ping一下内网镜像地址,看看服务器和内网镜像是否连通。 备份配置文件:sudo cp -a /etc/apt/sources.list /etc/apt/sources.list.bak修改sources.list文件,将http://archive.ubuntu.com和http://security.ubuntu.com替换成http://mirrors.tools.huawei.com,可以参考如下命令:sudo sed -i "s@http://.*archive.ubuntu.com@http://mirrors.tools.huawei.com@g" /etc/apt/sources.listsudo sed -i "s@http://.*security.ubuntu.com@http://mirrors.tools.huawei.com@g" /etc/apt/sources.listapt-get update #同步/etc/apt/sources.list,更新最新的软件包apt-get upgrade #对已经安装的软件包进行升级,如果出现/var/lib/dpkg/info相关问题参考:cid:link_7下载并更新软件:参考:DevEnvSetup - PerformanceQuickFeedback_VsCode (huawei.com)cid:link_12安装python安装系统时会默认自带python,但是版本会比较旧。通过which python命令查看当前python的路径。Whereis python可以看出系统安装了2.7和3.6的版本。查看python版本以及python路径:对于安装指定的python版本,可以下载源码后编译安装。参考:cid:link_81、安装编译依赖:sudo apt install -y wget build-essential libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev2、下载对应版本的python包cid:link_21,选择Gzipped source tarball,并上传到服务器并解压tar -zxvf Python-3.9.5.tgz。 3、cd Python-3.9.5/,进入解压后的Python-3.9.5目录,进行编译安装。执行如下命令编译安装:./configure --prefix=/usr/local/python39make && make install--prefix是Python的安装目录,同时安装了setuptools和pip工具,编译后提示安装成功,但是系统这里提示还没有环境变量。参考:cid:link_20配置软连接查看一下python的软连接,python、python2会进入安装的python2.7版本,python3会进入安装的python3.6版本。为了能使用我们自行安装的python3.9,这里需要把原来的软连接删除掉,添加python3.9的软连接。执行ll /usr/bin | grep python和ll /usr/bin | grep pip查看设置后的软链接删除原来的软连接:sudo rm pythonsudo rm python3 #删除软连接,并不会删除安装的python2.7和python3.5版本 创建新的软连接sudo ln -s /usr/local/python39/bin/python3.9 /usr/bin/python #创建软连接sudo ln -s /usr/local/python39/bin/python3.9 /usr/bin/python3 #创建软连接 配置后即可通过python直接进入python3.9运行环境。 同样,为pip命令创建软连接:sudo ln -s /usr/local/python39/bin/pip3.9 /usr/bin/pip #为 pip 设置软链接sudo ln -s /usr/local/python39/bin/pip3.9 /usr/bin/pip3 #为 pip 设置软链接重新安装python并更换软连接后,pip list命令会报错。此时把/usr/local/bin/pip的版本改成安装的版本即可。或者通过环境变量,把新安装的python放环境变量里(这里和上面的操作二选一)。配置环境变量,只修改当前用户的PATH并永久生效。echo $PATH #打印环境变量vim .bashrc #修改环境变量的配置文件source ~/.bashrc #配置文件参数立即生效参考:cid:link_15配置pip内源安装python三方库时,pip install命令仍然报错,网络一直发生重试。这是因为linux上下载/更新python库(pip install),默认会直接访问国外的镜像源地址,经常由于无法下载而安装失败,可以用公司的源下载安装。更新下载镜像的python三方库source源即可。更新源后,可正常下载安装python三方库。参考:cid:link_16安装pytorchpytorch官网:cid:link_22。官网提供了非常多的案例和文档,可以了解一下。可以在官网找到安装的命令和安装的要求,如建议Ubuntu的最低版本是13.04,python的最低版本是3.7。所以在安装环境前先确认好Linux、python、torch之间的版本依赖。pip install torch,同理安装torchvision、torchaudio库,安装完后通过pip查看包和版本。torchvision是pytorch的一个图形库,它服务于PyTorch深度学习框架的,主要用来构建计算机视觉模型。torchaudio是pytorch的一个音频库。pytorch基础参考:cid:link_14Pycharm远程连接服务器配置解释器pycharm远程连接服务器本地pycharm IDE远程连接服务器,这样可以多个人同时在相同的环境上开发调试。通过Tools->Deployment->Configuration,进入远程连接配置。首先配置连接,配置SSH登录信息并测试连通性。配置服务器远端的代码目录,本地代码将上传到这个目录。添加远程服务器的python解释器进入下一步输入密码,配置服务器上python解释器的路径,如果需要自动上传本地文件到服务器,可以勾上自动上传勾选框。添加成功后,自动显示读取到的服务器上安装的pip三方库。初次运行时确实用了服务器的解释器,但是运行报没有文件,这是因为前面我们可能没有选择自动上传,手动上传文件后运行成功。手动upload后,运行成功。参考:cid:link_17通过pycharm同步本地和服务器的文件pycharm连接esc服务器后,可以通过pycharm同步本地和服务器上的文件。本地和服务器上的文件映射关系是上面的mappings配置。上传:上面配置时勾选自动上传,在本地新建文件后,IDE会自动上传。下载:在服务器上新增文件后,需要通过IDE手动同步到本地。环境备份与保护通过镜像或快照可以快速、方便的恢复环境到备份时的状态。通过镜像创建ecs服务器创建镜像:cid:link_91、选择创建私有镜像,类型为系统盘镜像,为云服务器创建镜像。命名可以带上日期,或者其他易于辨识的标志,创建镜像即可。 2、用创建的镜像购买ECS云服务器,其他网络、硬盘配置参考原来的ecs配置。登录两个环境,看看安装的软件是否一样。推荐及时创建备份镜像,以镜像形式恢复环境,系统盘镜像是免费的。镜像计费标准:cid:link_3通过快照恢复环境在新建的环境上创建快照, 或者在首页快速进入快照页面。快照恢复:需要先关机、然后卸载磁盘后,再通过快照回滚。通过快照恢复数据:cid:link_5卸载一些安装包后,通过快照恢复,查看是否恢复环境。通过外部镜像创建ecs服务器参考:cid:link_61、准备镜像,准备将要创建服务器的镜像2、上传镜像,把外部镜像上传到obs3、注册镜像,通过镜像服务注册镜像4、创建ecs服务器,用注册的镜像创建ecs服务器如果想克隆他人环境,可以把他人的环境制作的镜像导出后作为外部镜像,然后基于这个镜像创建自己的服务器。Linux常用命令基本命令xxcommand –help #帮助命令,查询xxcommand的用法reboot #重启系统cat /proc/version #查看版本信息,lsb_release –a #查看Linux发行版,cat /etc/issue #查看Linux发行版echo $PATH #打印环境变量vim .bashrc #修改环境变量的配置文件source ~/.bashrc #配置文件参数立即生效vim /etc/hostname #修改主机名find /xx -name test01 #在根目录下查找test01这个文件夹ls /xx -lR|grep "^-"|wc –l #查看数据多少du -sh /xx #查看数据大小网络命令ifconfig #查看ip信息systemd-resolve --status #查看DNS服务状态systemd-resolve DOMAIN #解析域名,如systemd-resolve baidu.comdig #dig是一个给力DNS查询工具curl #网络连通测试、下载等工具
-
人工智能-01 AI基础持续更新,欢迎批评指正。本文旨在抛砖引玉,更详细的介绍仍然需要大家参考其他专业资料。AI初识人工智能、机器学习是一个大的研究领域,涉及计算机、软件、数理统计、概率论、模式识别等多个学科,应用范围也非常广泛,如图像分类、人脸识别、物体检测、语音识别、自然语言处理、计算机视觉等。首先大概了解一下人工智能、机器学习、深度学习的概念和相互关系。人工智能:希望机器能够像人类的大脑一样思考,并作出反应。机器学习:从大量的数据中找出规律,自动地学习出算法所需的参数。深度学习:机器学习的技术分支之一,主要是通过搭建深层的人工神经网络来进行知识的学习,输入数据通常较为复杂、计算量大。参考:cid:link_17AI发展历程人工智能发展简史:cid:link_38cid:link_12cid:link_19cid:link_25浅谈人工智能的下一个十年:cid:link_6什么是机器学习:cid:link_20AI工程应用:cid:link_21AI技术业界洞察分析:https://linstar.huawei.com/TI/report/details/529362f318cf4bfba1e75c1641b2060fAI应用开发流程AI应用生命周期参考华为云的软件全生命周期管理,软件生命周期经历了需求/规划、开发、测试、发布、运维、运营6个主要阶段,和传统产品的生命周期基本能一一对应起来。AI应用的开发也属于软件开发范畴,所以这里主要看一下AI应用的开发上线阶段。机器学习需要大量的数据做训练,并持续去迭代模型,所以AI应用和其他应用的开发略有差异,参考华为云的Modelarts一站式AI开发平台介绍,看看AI应用的开发有哪些流程。 从上图可以看出,首先需要训练数据,然后根据网络设计模型结构,把数据送给设计的网络去训练得到模型,训练过程中不断迭代优化模型,最终将模型部署上线提供服务,最后进入运维环节。Modelarts还提供了市场功能,可以把你的数据集、算法、模型等资产发布出去供其他人订阅使用,这样对于类似的应用场景(如车牌识别、人脸检测、花卉识别等)就增大了资产的复用性。Modelarts官方文档:cid:link_14数据集准备机器学习开发首先需要准备数据集,数据尽可能来源于真实场景。模型的质量越高,对数据集的需求量就越大、数据质量要求也就越高,比如物体识别场景就需要尽可能收集不同角度、背景、光照的样本数据。当数据采集和接入之后,数据一般是不能直接满足训练要求的。为了保障数据质量,数据准备工作还包括收集数据、标注数据、清洗数据、提取特征、存储数据等。数据集可以是业界共用的(比如手写数字识别数据集),也可以是自己采集、制作的,也可以是网络爬虫获取的,等等。注意一点,数据收集需要保证合法性,满足隐私保护等相关法律条例,不泄露用户数据和隐私,保证数据的安全性,境外收集数据还有其他法律法规需要关注。参考:cid:link_3模型训练AI模型的本质是一个函数,函数包含大量的参数,凭借我们熟悉的知道自变量和因变量,逻辑推导y=f(x)的表达式这种方式是不可行的,因为数据量太大了,这时只能通过训练的方式来拟合一个比较接近的函数。所以,模型训练也称模型开发,简单点说就是从数据中找算法,这个算法和传统的贪心、穷举算法不同,不是人为设计的,而是从数据中来的。模型开发过程实际就是构建一种模型结构,基于种深度学习框架搭建模型,接着在计算资源上训练模型,得到模型后对其测试比较不同模型的性能。性能指标除正确率、错误率、准确率、召回率这些基本指标外,还有训练时间、预测时间、CPU/GPU资源效率等。模型结构:贝叶斯、线性模型、支持向量机、全连接神经网络、卷积神经网络等。深度学习框架(引擎):pytorch、tensflow、caffe、mindspore、keras等计算资源:CPU/GPU/Ascend、单机/分布式除上面基本模型训练操作,模型开发过程中对模型的版本管理、增量训练、模型评估、元数据管理、可视化这些都属于训练的工作。推理预测AI模型开发完成后,可以将模型创建为AI应用,将AI应用快速部署为推理/预测服务,通过web应用或者API的形式对外提供服务。其他产品可以调用API的方式把AI推理能力集成到自己的IT平台中。部署方式常用在线服务、批量服务、边缘服务。简单理解,在线服务就是把服务部署在云端,大家都去云端请求服务;批量服务就是可以对批量数据进行推理;边缘服务就是把服务部署到带有计算能力的边缘设备上,在靠近用户侧提供算力把数据处理了,如手机设备。例如智能音箱,可以在设备端部署一个简单模型来接收唤醒指令,而将后续复杂的语音交互发送到云端的复杂模型进行处理。服务部署后还需要运维监控,通常可以部署在自己的服务器上,也可以部署到华为云、阿里云、AWS等云平台上,将环境的维护交给第三方云厂商托管。(欧洲电信标准协会(ETSI)对边缘计算的定义:在移动网络边缘提供IT服务环境和计算能力,强调靠近移动用户,以减少网络操作和服务交付的时延,提高用户体验。)边缘服务:cid:link_24华为modelarts技术架构:cid:link_29IEF边缘部署平台:cid:link_9MLOps从AI开发流程看,从零开始到上线一个模型,主要经历了系统设计、数据集准备、模型训练、模型评估、服务部署、运维监控等阶段。这几个阶段都需要专业的工具和知识,业界基于不同AI开发阶段,整合了人工智能一站式开发平台,将设计、开发、运维有机结合起来,你可以在一个平台上完成这一系列动作。MLOps,机器学习操作,就是机器学习时代的DevOps。主要作用就是建立一个标注化的模型开发、部署、运维流程,通过缩短开发部署的时间来更快的软件迭代。MLOps的迭代开发模式和上面modelarts平台提供的的开发流程是不是很相似呢。现在谷歌、亚马逊、阿里、华为等都有自己的AI开发平台,如华为modelarts平台提供的内置模块workflow。AI开发平台提供的关键作用有:数据处理:实现数据集的特征组合、筛选和转换,从数据集中提取关键特征,供模型训练使用。模型训练:提供AI算法框架,提交训练任务,提供GPU、CPU训练计算供开发者选择。模型管理:查看模型包的详细信息、删除模型、下载模型等管理。推理服务:模型发布到推理框架上,开始对外提供AI服务。 MLOps介绍:cid:link_15MLOps平台对比:cid:link_28ML开发流程:cid:link_0ML涉及的模块:cid:link_1AI开发基本过程:cid:link_26AIOps业界洞察:cid:link_7从听云科技看AIOps: cid:link_8ModelOps行业洞察与模型开发流水线AI Factory介绍:cid:link_4AI应用类型AI模型分为判别式AI(Discriminative AI)和生成式AI(Generative AI)。判别式AI关注的是对数据进行分类或建立模式识别的任务。它的目标是学习输入数据与其对应的标签或类别之间的关系。判别式模型直接对条件概率分布进行建模,例如给定输入x,预测输出y的条件概率P(y|x)。常见的判别式模型包括逻辑回归、支持向量机(SVM)、神经网络等,常见的应用如图像分类、物体检测、房间预测、物体跟踪等。生成式AI关注的是对数据进行建模,以便能够生成新的具有相似分布的数据样本。生成式AI(生成式人工智能)是指使用AI 来创作新内容,例如文本、图片、音乐、音频和视频。生成式模型的目标是学习联合概率分布P(x, y),其中x是输入数据,y是对应的标签或类别。生成式模型可以通过学习数据的分布特征来生成新的数据样本,例如生成对抗网络(GAN)、变分自编码器(VAE)等,常见的应用如ChatGPT、Sora等。随着ChatGPT、Sora的迅猛发展,生成式AI逐渐成为研究新热点。AI开发平台架构以Modelarts的架构为例理解AI平台架构,如下图所示,从底层往上次看,依次是硬件提供计算、网络、存储等基础资源;异构计算架构提供分布式调度能力;AI计算框架支持多种引擎,如常用的pytorch、tensflow、mindspore等;上层是数据管理、训练、推理等微服务。基于这些微服务就可以开发各种各样的行业应用。 硬件基础硬件基础资源包括计算、存储、网络等,这里重点介绍一下计算资源。深度学习最重要的就是数据和运算。数据越多,理论上模型就越精确;运算更快,模型迭代就越快,服务上线周期越短。人工神经网络就是通过构建具有很多隐层的模型,通过海量的训练数据,来确定模型参数,最终提升模型性能。这种算法的特点决定了对训练数据量和计算能力的要求。算力方面,当前流行的X86和ARM的传统CPU处理器架构往往需要数百甚至上千条指令才能完成一个神经元的处理,但对于并不需要太多的程序指令,却需要海量数据运算的深度学习的计算需求,这种CPU结构就略显吃力,因此GPU处理器在这种特殊的计算模式下就显示出了优势。图形处理器GPU最初是运行绘图运算工作的微处理器,可以快速地处理图像数据。后来科学家发现,其海量数据并行运算的能力与深度学习需求不谋而合,因此,被最先引入深度学习。如同线性代数,只需要基本的加减乘除方法即可快速的解决线性方程求解问题。分布式计算能力也应用于处理海量数据,提升计算速度。分布式训练:cid:link_10CPU/GPU/NP:http://3ms.huawei.com/km/groups/3823811/blogs/details/9090571?l=zh-cn&ctype=nullcid:link_22深度学习框架什么是深度学习框架?百度百科介绍:在深度学习初始阶段,每个深度学习研究者都需要写大量的重复代码。为了提高工作效率,这些研究者就将这些代码写成了一个框架放到网上让所有研究者一起使用。接着,网上就出现了不同的框架。随着时间的推移,最为好用的几个框架被大量的人使用从而流行了起来。简单来说就是工具、库、算法,作一个简单的比喻,一套深度学习框架就是一套积木,各个组件就是某个模型或算法的一部分,你可以自己设计如何使用积木去堆积符合你的工程。常用的深度学习框架有pytorch 、tensorflow、caffe、spark、mxnet等,不同框架有其自身的优缺点,选择一个合适的框架能起到事半功倍的作用,开发者可以根据业务和自身对框架的熟悉程度选择,用户可以在各个框架的官网上了解框架的详细信息。明确这些流行的框架都支持在不同计算资源上训练、推理。 深度学习框架:cid:link_11上层服务AI开发流程主要包括数据集准备、训练和推理,其实这三个大类细分还有很多地方可以深入研究。比如在数据管理里面涉及数据集标记、数据处理、团队标注等;在训练里面包括算法开发管理、分布式训练、训练版本/实验对比、模型评估等;在推理里面包括在线部署、边缘部署、模型管理、模型转换、模型压缩等。这些服务可以独立提供使用,也可以有机地组合起来,提升了通用场景的开发效率。再加上AI应用市场gallery,把算法、模型、数据集等作为资产发布到市场,让他人可以订阅使用,提升资产的复用性。其他参考资料机器学习首先是数学问题,或者说是概率问题。了解甚至掌握一些数学基础对学习和理解AI是十分必要的。基础教程Pytorch深度学习实践:cid:link_27AI基本概念:cid:link_18孙健老师课程(数据推导过程居多) cid:link_37机器学习笔记:cid:link_23重要理论马尔可夫链:cid:link_30神经网络:cid:link_33BP算法:cid:link_34卷积:cid:link_31傅里叶变换:cid:link_16cid:link_32小波变换:cid:link_35cid:link_36
-
我想使用Ascend资源搭建一个支持 PyTorch-Ascend 的Notebook环境,将 A800上训练的模型直接部署在昇腾计算卡上,期望在 Ubuntu 20.04 LTS上 使用 PyTorch 2.4.0 + CANN >= 8.0.RC3 (参考昇腾辅助软件)。目前现有的公有云镜像中CANN的版本为 8.0.RC2,不太能满足我的需求。我在阅读 在Notebook中通过Dockerfile从0制作自定义镜像 和 从0制作自定义镜像用于创建训练作业(Pytorch+Ascend) 、编写Dockerfile时遇到以下问题:我没有获得 CANN商业版 的资格,无法下载,能直接使用 CANN 社区版吗?是否需要安装NPU驱动?如何确保在使用自定义镜像时能正确识别到Ascend资源?以及想请问是否有相关的帖子或开源dockerfile可供参考?
-
在ModelArt的notebook创建了基于Ascend 910B4的环境,运行代码时在npu上的计算非常慢,显示npu AI core占用率为0%,但是如下的代码中torch.npu.is_available()的输出为Trueprint("torch.npu.is_available(): ",torch.npu.is_available()) torch.npu.set_device('npu:0') torch_npu.npu.set_device('npu:0') device = torch.device('npu:0' if torch.npu.is_available() else 'cpu') print("devise:----------", device)另外,我运行下面这个简单的测试脚本用了二十多秒:import torch import torch_npu device = torch.device('npu:0' if torch.npu.is_available() else 'cpu') torch.npu.set_device(device) #创建一个简单的张量并在NPU上进行计算 a = torch.randn(1000, 1000, device=device) print(a) b = torch.randn(1000, 1000, device=device) print(b) c = a + b print(c)求助怎么解决训练模型时npu AI core占用0%的问题
-
mindspore如何使用优化器进行参数更新和梯度清零,Adam和optimizer都找不到相关功能和范例
-
arm架构BC-Linux,启动ascend-pytorch镜像失败# docker run -it -e ASCEND_VISIBLE_DEVICES=0 ascendhub.huawei.com/public-ascendhub/ascend-pytorch:23.0.0-A2-1.11.0-centos7 /bin/bash standard_init_linux.go:219: exec user process caused "exec format error" libcontainer: container start initialization failed: standard_init_linux.go:219: exec user process caused "exec format error"
-
Open-Sora(Gradio版本)文生视频不久前,OpenAI Sora以其惊人的视频生成效果迅速走红,在众多文本转视频模型中脱颖而出,成为全球关注的焦点。继两周前推出用于训练和推理过程的Sora Replication,成本降低46%。之后,Colossal-AI团队又推出了新的开源解决方案“Open-Sora 1.0”,涵盖了整个训练过程,包括数据处理、所有训练细节和模型检查点,与世界各地的AI爱好者携手推进视频创作的新时代。详细内容请参考:https://hpc-ai.com/blog/open-sora-v1.0可以点击我发布的Notebook在AI Gallery中一键运行!
-
如题,pytorch cpu训练很慢,使用的是开源的wenet语音识别框架,搭了一个nvidia/cuda:11.6.1-cudnn8-runtime-ubuntu20.04镜像,但用的是cpu,训练可以正常运行,性能表现是模型前向计算很慢,一个小时的训练数据,batchsize 16, num_worker 4, 模型参数量80M, 需要一个小时才能跑一个batch,16小时跑一个epoch,这是因为什么问题导致的呢,大佬们帮忙看看我仔细分析了下,发现是torch.nn.Conv1d这个函数跑的慢, X86跑了0.016秒,arm跑了0.254秒,这是测试代码: import torch import time # Create random input input_data = torch.randn(1, 256, 1000) # Create convolutional layer #conv1d_layer = torch.nn.Conv1d(in_channels=1, out_channels=1, kernel_size=3) #start_time_x86 = time.time() conv1d_layer = torch.nn.Conv1d( 256, 256, 15, stride=1, padding=0, groups=256, bias=True, ) # Perform convolution on x86 start_time_x86 = time.time() output_x86 = conv1d_layer(input_data) end_time_x86 = time.time() time_elapsed_x86 = end_time_x86 - start_time_x86 print('Time elapsed on x86:', time_elapsed_x86) print(output_x86)
-
问题显示: File "/home/ma-user/work/DDA6/src/models.py", line 99, in backward loss.backward() File "/home/ma-user/anaconda3/envs/Pytorch-1.8.1/lib/python3.7/site-packages/torch/tensor.py", line 245, in backward torch.autograd.backward(self, gradient, retain_graph, create_graph, inputs=inputs) File "/home/ma-user/anaconda3/envs/Pytorch-1.8.1/lib/python3.7/site-packages/torch/autograd/__init__.py", line 147, in backward allow_unreachable=True, accumulate_grad=True) # allow_unreachable flag RuntimeError: The size of tensor a (256) must match the size of tensor b (64) at non-singleton dimension 3问题描述:在pytorch框架下的代码,从cuda往cann迁移,在cuda正常运行,而在cann中可以开始训练,但会卡在 loss.backward() 求大佬帮忙
-
[问题求助] Yolov7_for_PyTorch 在Atlas 800 上训练出现RuntimeError: ACL stream synchronize failed, error code:507018环境:Atlas800 算力卡910CANN 版本为6.3.RC1 训练容器为:pytorch-modelzoo:23.0.RC1-1.11.0训练代码Yolov7_for_PyTorch下载地址https://gitee.com/ascend/modelzoo-GPL/tree/master/built-in/PyTorch/Official/cv/object_detection/Yolov7_for_PyTorch训练样本coco现象:
-
训练框架版本: Pytorch-1.11 训练硬件: 910B训练insightface 中的 partial_fc 报错:IndexPutTraceback (most recent call last): File "train.py", line 214, in <module> main(parser.parse_args()) File "train.py", line 157, in main loss: torch.Tensor = module_partial_fc(local_embeddings, local_labels, opt) File "/home/ma-user/anaconda3/envs/Pytorch-1.11.0/lib/python3.7/site-packages/torch/nn/modules/module.py", line 1110, in _call_impl return forward_call(*input, **kwargs) File "/cache/development-space/arcface_torch/partial_fc.py", line 213, in forward loss = self.dist_cross_entropy(logits, labels) File "/home/ma-user/anaconda3/envs/Pytorch-1.11.0/lib/python3.7/site-packages/torch/nn/modules/module.py", line 1110, in _call_impl return forward_call(*input, **kwargs) File "/cache/development-space/arcface_torch/partial_fc.py", line 498, in forward return DistCrossEntropyFunc.apply(logit_part, label_part) File "/cache/development-space/arcface_torch/partial_fc.py", line 464, in forward loss[index] = logits[index].gather(1, label[index])RuntimeError: Run:/usr1/workspace/FPTA_Daily_open_pytorchv1.11.0-3.0.tr6/CODE/torch_npu/csrc/framework/OpParamMaker.cpp:136 NPU error,NPU error code is:500002EZ9999: Inner Error, Please contact support engineer!EZ9999 The input dtype of x1 x2 y is equal, please check![FUNC:IndexPutVerify][FILE:matrix_calculation_ops.cc][LINE:4676] TraceBack (most recent call last): Verifying IndexPut failed.[FUNC:InferShapeAndType][FILE:infershape_pass.cc][LINE:135] Call InferShapeAndType for node:IndexPut(IndexPut) failed[FUNC:Infer][FILE:infershape_pass.cc][LINE:117] process pass InferShapePass on node:IndexPut failed, ret:4294967295[FUNC:RunPassesOnNode][FILE:base_pass.cc][LINE:530] build graph failed, graph id:140, ret:1343242270[FUNC:BuildModel][FILE:ge_generator.cc][LINE:1484] [Build][SingleOpModel]call ge interface generator.BuildSingleOpModel failed. ge result = 1343242270[FUNC:ReportCallError][FILE:log_inner.cpp][LINE:161] [Build][Op]Fail to build op model[FUNC:ReportInnerError][FILE:log_inner.cpp][LINE:145] build op model failed, result = 500002[FUNC:ReportInnerError][FILE:log_inner.cpp][LINE:145] build graph failed, graph id:141, ret:1343242270[FUNC:BuildModel][FILE:ge_generator.cc][LINE:1484] build graph failed, graph id:142, ret:1343242270[FUNC:BuildModel][FILE:ge_generator.cc][LINE:1484]
-
用法说明当使用PyTorch实现一个分类器时,通常需要涉及到数据加载、模型定义、损失函数和优化器的选择、训练过程等步骤。本案例采用CIFAR10数据集作为原始图片数据.CIFAR10数据集介绍: 数据集中每张图片的尺寸是3 * 32 * 32, 代表彩色3通道CIFAR10数据集总共有10种不同的分类, 分别是"airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck".导入必要的库:import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms在代码的开头,我们导入了需要使用的PyTorch模块和库。定义数据预处理变换:transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])这里定义了一个数据预处理变换,将输入图像转换为Tensor,并对图像进行归一化处理。加载训练数据集:trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)这段代码加载了CIFAR-10数据集,指定了数据集的路径、训练集标志、数据预处理变换等。然后通过数据加载器(DataLoader)将数据集划分为小批量,以便进行训练。定义一个简单的卷积神经网络模型:class Net(nn.Module): def __init__(self): super(Net, self).__init__() # ...(省略了卷积层、池化层、全连接层的定义) def forward(self, x): # ...(定义前向传播过程)这里定义了一个简单的卷积神经网络模型,包括卷积层、池化层和全连接层。forward方法定义了输入如何通过网络层进行前向传播。定义损失函数和优化器:criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)在这里,我们选择交叉熵损失函数作为分类任务的损失函数,并使用随机梯度下降(SGD)优化器来优化模型参数。学习率设置为0.001,动量设置为0.9。训练网络:for epoch in range(2): # 迭代两次 running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() # 梯度清零 outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 2000 == 1999: print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}') running_loss = 0.0在这个循环中,我们对数据进行迭代,对每个小批量数据进行如下操作:将输入数据传递给网络,得到预测输出。计算预测输出与真实标签之间的交叉熵损失。调用backward方法计算梯度。调用优化器的step方法更新模型参数。输出当前损失值,并在每2000个小批量数据之后重置损失。保存训练好的模型:PATH = './cifar_net.pth' torch.save(net.state_dict(), PATH)最后,我们保存训练好的模型参数到文件中,以便后续的加载和使用。总之,上述代码展示了一个基本的图像分类器的实现流程,但实际应用中可能需要更多的调整和改进,以获得更好的性能。完整代码import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms # 定义数据预处理变换 transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) # 加载训练数据集 trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2) # 定义一个简单的卷积神经网络模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x net = Net() # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) # 训练网络 for epoch in range(2): # 迭代两次 running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() # 梯度清零 outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 2000 == 1999: # 每2000个小批量数据输出一次损失值 print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}') running_loss = 0.0 print('Finished Training') # 保存训练好的模型 PATH = './cifar_net.pth' torch.save(net.state_dict(), PATH)
-
这两个东西是我最近在github查找大模型时发现的,平时在公司开发时很少使用这两个东西,因为都是在内网.TorchServeTorchServe是一个轻量级的模型服务器,可以轻松地将PyTorch模型部署为RESTful API或TorchServe的自定义格式。它支持多模型管理,自动扩展和生命周期管理,可以快速部署和管理模型。TorchServe还支持模型推理缓存、异步推理和自定义处理程序,可以根据需求自由配置。在使用TorchServe部署模型时,需要编写一个模型描述文件,该文件定义了模型的输入输出规格、预处理和后处理步骤、模型推理的超参数等。TorchServe还支持使用Python的torchscript和ONNX格式导出的模型,方便用户使用各种PyTorch模型。除此之外,TorchServe还提供了易于使用的REST API和管理界面,可以轻松地管理模型服务器。TorchRunTorchRun是一个用于本地或远程服务器上运行PyTorch训练作业的工具。它提供了命令行界面,可以轻松地指定训练参数和模型超参数,并跟踪训练进度和性能。TorchRun还支持分布式训练和自动调优,可以帮助用户快速实现高效的训练过程。在使用TorchRun进行训练时,需要指定训练数据集、优化器、损失函数、学习率等训练参数,以及模型的超参数等。TorchRun支持使用多个GPU和多个节点进行分布式训练,还提供了自动调优的功能,可以根据给定的参数范围和搜索策略,自动搜索最优的超参数组合,从而提高训练效率和模型性能。总之,TorchServe和TorchRun都是与PyTorch深度学习框架相关的工具,可以帮助用户快速部署和管理模型服务器,以及实现高效的训练过程。本文来自博客园,作者:海_纳百川,转载请注明原文链接:https://www.cnblogs.com/chentiao/p/17355955.html,如有侵权联系删除
-
近几天处理了几天卷积LSTM,操作的数据格式太复杂,蓦然回首,突然发现自己不明白LSTM中的输入格式是什么了,于是写一篇文章帮助自己回忆一下,也希望能帮助到一起正在机器学习的伙伴。补充一下,在LSTM之后,GRU和LSTM几乎已经取代了传统的RNN,因此在称呼RNN的时候,大多数情况也是在称呼LSTM,下文中可能会提到RNN,也是在说LSTM按照Pytorch 给的文档里格式写一个LSTM# author: https://www.cnblogs.com/danielkung/lstm = torch.nn.LSTM(input_size, # INT,输入的维度 hidden_size, # INT,隐藏层的维度 num_layers, # INT,LSTM的层数 bias, # BOOL,是否需要wx+b中的b batch_first, # BOOL,输入的数据第一维度为batch,与输出无关 dropout, # BOOL,是否需要dropout bidirectional) # BOOL,是否双向RNN,是的话hidden,output都双倍intput = torch.randn(seq_len, batch, input_size) # 三个参数需要定义output, hidden = lstm(input)Q:在处理了无数次以后,我终于有一次懵圈了,啥是seq_len来着?A:seq_len就是输入的sequence_length(序列长度),既然LSTM是处理序列数据的,那么序列就需要一个长度。虽然LSTM处理的序列长度通常是不固定的,但是Pytorch和TensorFlow的集成实现还是固定了input的序列长度,在处理不固定长度的数据(如机器翻译),通常加入开始和结束符号并采用序列的最大长度MAX_LEN作为seq_len来看几个实际的例子:1. 输入长度不固定,输出长度固定我想做一个语句的情感分析(positve,negtive),或者给一串数字,预测这串数字的下一个数字是什么(例如某串长度为N,预测第N+1数字是什么)。在第一个问题中,假设我们拿到了N条数据,每条包含的字数不定,但是可以知道最长的字数为MAX_LEN。首先我们需要进行word embedding,即把每个词转变为长度固定的矩阵。假如每个word被转化为 [1*128] 的矩阵,那我们得到的数据格式就为:[N, MAX_LEN+2, 128]此时你也许会问,那长度不够MAX_LEN的呢?不够的就被填充到MAX_LEN,并且多的2是开头和结尾的'sos''eos'。然后在LSTM中,我们每次取N条中的batch_size条进行训练,并且input的seq_len就是MAX_LEN+2。代码:# author: https://www.cnblogs.com/danielkung/import torchinput_size = 128 # 输入的维度,就是我们word_embedding的长度hidden_size = 64 # 这里我自己定义的,定义的是lstm的hidden也是输出的维度num_layers = 1 # 先定义一层的LSTMlstm = torch.nn.LSTM(input_size, hidden_size, num_layers)input = getFromDataSet() # 函数没定义,就是从data中取batch条数据,input的shape:[seq_len, batch_size, input_size]=[MAX_LEN+2, batch, 128]output, hidden = lstm(input, hidden=None) # Pytorch的LSTM会自己初始化hidden,因此hidden不写一样output1 = output[-1] # 取最后一层的输出作为最终输出,因为只有一层LSTM,output[-1]==output[0]print(output.shape)# RETURN: [seq_len, batch_size, hidden_size]这里发现如果是做postive或者negtive分析的话,我们只需要一个数值,甚至只需要一个BOOL,因此还需要把输出的output结果取最后一份output[-1],然后通过MLP即可,具体分析如图。代码接上面继续:fc = nn.Linear(hidden_size, 1)last_cell = outpu1t[-1] # shape: [batch_size, hidden_size]# 由图可见, 此时的last_cell就是LSTM的最后一次的输出结果。res = fc(last_cell) # shape: [batch_size, 1]# 由此就得出了所有所有batch的预测结果。Q:可能有人要问,输出了那么多的output,只取最后一个用,这样准确吗?不浪费吗?A:不准,浪费。但是可以这么处理。在早期的sequence_to_sequence模型中,就是把encoder RNN的最后一个cell的输出作为context传给decoder,当然后来还有更好的办法,如attention mechanism。在这里只展示最简单的。2. 输入长度不固定,输出长度不固定如果输出长度不固定,我们只需要把<1>中输出中加入'sos''eos',并且去掉最后的全连接层就好了。3. 特殊情况,seq_len的长度特别大这类问题通常出现在文本翻译或者文本处理,以及音频、视频处理中。我们需要把seq_len设置为一个适当的值,并且通过迭代,传递lstm的hidden_state的方式进行训练。这对模型的设计,网络的深度都有一定的要求,博客中就不在展示。
上滑加载中