当前位置: 首页 > news >正文

兰州seo整站优化服务商为什么建设部网站进不去

兰州seo整站优化服务商,为什么建设部网站进不去,网站制作定制,莆田网站建设多少钱介绍#xff1a; 在机器学习的动态世界中#xff0c;从开发模型到将其投入生产的过程通常被认为是复杂且多方面的。 然而#xff0c;随着 Docker、Kubernetes 等工具以及 FastAPI、Streamlit 和 Gradio 等用户友好的 Web 框架的出现#xff0c;这一过程变得比以往更加简化…介绍 在机器学习的动态世界中从开发模型到将其投入生产的过程通常被认为是复杂且多方面的。 然而随着 Docker、Kubernetes 等工具以及 FastAPI、Streamlit 和 Gradio 等用户友好的 Web 框架的出现这一过程变得比以往更加简化。 再加上 GitHub Actions 持续集成和部署的强大功能我们现在拥有一个支持快速、高效和可扩展的机器学习应用程序的生态系统。 本文提供了有关这些工具的基本命令的简明指南旨在弥合模型开发和无缝部署之间的差距。 无论您是一位想要涉足部署领域的经验丰富的数据科学家还是一位渴望将机器学习集成到 Web 应用程序中的新手开发人员本指南都提供了基础知识来推动您的努力。 Docker: 什么是 Docker 定义Docker是一个允许开发人员将应用程序及其依赖项打包到容器中的平台。 容器化与传统虚拟化不同Docker容器共享主机系统的操作系统内核而不是包含自己的操作系统。 这使得它们轻便且快速。 可移植性容器确保应用程序在多个环境中一致运行从开发人员的本地计算机到各种生产设置。 为什么 Docker 对于 ML 部署至关重要 环境一致性确保模型在开发、测试和生产中使用相同的依赖项和库运行。 减少“它可以在我的机器上运行”问题。 可扩展性Docker 容器可以根据应用程序的需求轻松扩展或缩小。 隔离ML 模型尤其是微服务架构中的模型可能具有不同的依赖关系。 Docker 隔离了这些依赖关系以避免冲突。 环境的版本控制就像代码一样Docker 允许对环境进行版本控制。 如果较新的库版本破坏了模型人们可以轻松恢复到旧的工作容器版本。 高效的资源利用Docker 容器是轻量级的可以高效地使用资源这对于在同一基础设施上部署多个 ML 模型至关重要。 与现代部署管道集成Docker 与 CI/CD 工具和编排系统如 Kubernetes无缝集成促进自动化测试和部署。 协作数据科学家、机器学习工程师和开发人员可以共享 Docker 容器确保每个人都在一致的环境中工作。 Docker 版本: $ docker --version 为 Python 和机器学习创建 Dockerfile Dockerfile 定义了容器中的内容。 以下是 Python 机器学习环境的 Dockerfile 示例 # Use an official Python runtime as base image FROM python:3.8-slim# Set the working directory inside the container WORKDIR /usr/src/app# Install essential libraries and tools RUN apt-get update \apt-get install -y build-essential# Copy the requirements.txt into the container COPY requirements.txt .# Install Python dependencies RUN pip install --no-cache-dir -r requirements.txt# Command to run when the container starts CMD [python, your_script.py] Dockerfile Breakdown: 基础 Image: FROM python:3.8-slim 这指示 Docker 使用“slim”变体中的官方 Python 3.8 映像作为该容器的起点。 slim 版本是镜像的轻量版本预装工具较少尺寸较小。 设置工作目录 WORKDIR /usr/src/app 这会将容器内的工作目录设置为 /usr/src/app。 所有后续命令都将从该目录运行。 安装必要的库 RUN apt-get update \ apt-get install -y build-essential 这将更新升级和新软件包安装的软件包列表。 更新后它会安装“build-essential”包其中包含构建软件所必需的编译器和库。 复印要求 COPY requirements.txt . 此命令从当前目录在主机上获取requirements.txt 文件并将其复制到容器内的工作目录/usr/src/app。 安装 Python 依赖项 RUN pip install --no-cache-dir -r requirements.txt 使用 pip此命令会安装requirements.txt 文件中列出的Python 库。 --no-cache-dir 选项确保 pip 不会存储任何缓存从而保持容器的轻量级。 启动命令 CMD [python, your_script.py] 指定容器启动时应运行的命令。 在本例中它运行 Python 脚本 your_script.py。 需求文件 对于机器学习项目您的 requests.txt 可能如下所示 numpy1.19.5 pandas1.1.5 tensorflow2.4.1 scikit-learn0.24.1 构建 Docker 镜像 要从 Dockerfile 创建 Docker 映像 $ docker build -t ml-python-image . -t 标志为图像分配标签或名称而 . 指定包含 Dockerfile 的目录。 运行 Docker 容器 要从您的映像启动容器 $ docker run --name ml-python-container ml-python-image 查看正在运行的容器 要查看所有正在运行的容器的列表 $ docker ps 对于所有容器包括那些未运行的容器 $ docker ps -a 停止和移除容器 要停止正在运行的容器 $ docker stop ml-python-container 要删除已停止的容器 $ docker rm ml-python-container 分享您的 Docker 镜像 您可以使用 Docker Hub一种用于共享容器映像的云服务来共享 Docker 映像。 首先登录 $ docker login 然后标记您的图像 $ docker tag ml-python-image:latest username/ml-python-image:latest 最后推送Image $ docker push username/ml-python-image:latest 拉取并运行共享Image 然后您或其他人可以拉取该image $ docker pull username/ml-python-image:latest 运行它: $ docker run --name new-ml-python-container username/ml-python-image:latest All in one # General docker --version # Version Information docker info # Docker Configuration Info# Images docker images # List Images docker build -t [image-name]:[tag] . # Build an Image docker rmi [image-name]:[tag] # Remove an Image docker pull [image-name] # Pull an Image# Containers docker ps # List Running Containers docker ps -a # List All Containers docker run -d -p [host-port]:[container-port] [image-name] # Start a Container docker stop [container-id] # Stop a Container docker rm [container-id] # Remove a Container docker logs [container-id] # View Container Logs# Docker Compose (if youre using it) docker-compose up # Start Services docker-compose down # Stop Services# Maintenance docker system prune # Remove All Unused Containers, Networks, and Images docker volume prune # Remove All Unused Volumes docker system df # Check Docker Disk Usage# Dockerfile Basics (For reference, not executable as commands) # FROM [base-image] # Base Image # WORKDIR /path/to/directory # Set Working Directory # RUN command # Run Commands # COPY source destination # Copy Files # EXPOSE port # Expose Port # CMD [executable, param1, param2] # Default Command Kubernetes: Kubernetes 基础知识 1. 节点和集群节点是机器、虚拟机或云实例集群是 Kubernetes 管理的一组节点。 主节点管理集群而工作节点运行应用程序。 2. PodKubernetes 中最小的可部署单元是 Pod。 一个 Pod 可以托管多个容器这些容器形成一个部署单元。 3. 服务Kubernetes 服务是公开在一组 Pod 上运行的应用程序的抽象方式。 4. 部署这是一个更高级别的概念用于管理 Pod 和副本集的所需状态。 设置 Kubernetes Kubernetes 可以使用 Minikube 在本地计算机上设置也可以在云平台上设置。 AWS、GCP 和 Azure 等云提供商分别提供 EKS、GKE 和 AKS 等托管 Kubernetes 服务。 在 Kubernetes 上部署机器学习模型 1. 容器化您的模型在 Kubernetes 上部署之前您的模型需要容器化。 Docker 通常用于此目的 FROM python:3.8-slim WORKDIR /appCOPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txtCOPY . /appCMD [python, app.py] 此 Dockerfile 假设您有一个为您的模型提供服务的 app.py可能使用 Flask 或 FastAPI 等框架。 构建并推送您的 Docker 镜像 $ docker build -t username/ml-model:v1 . $ docker push username/ml-model:v1 2.创建部署配置为Kubernetes定义一个deployment.yaml apiVersion: apps/v1 kind: Deployment metadata:name: ml-model-deployment spec:replicas: 3selector:matchLabels:app: ml-modeltemplate:metadata:labels:app: ml-modelspec:containers:- name: ml-modelimage: username/ml-model:v1ports:- containerPort: 5000 3. 在 Kubernetes 上部署 应用部署 $ kubectl apply -f deployment.yaml 4. 公开你的模型 要访问您的模型请使用服务公开它 $ kubectl expose deployment ml-model-deployment --typeLoadBalancer --port80 --target-port5000 expose: 这告诉 kubectl 您想要将资源在本例中为部署公开为网络服务。 deployment ml-model-deployment: 指定要公开的资源部署的类型和该资源的名称ml-model-deployment。 --typeLoadBalancer: 这指定了您要创建的服务的类型。 在这种情况下正在请求 LoadBalancer 服务。 当在云环境如 AWS、GCP 或 Azure中使用时通常会配置一个云负载均衡器来将网络流量分发到与该服务关联的所有 Pod。 --port80: 定义服务将侦听的端口。 这意味着外部流量将进入该端口的服务。 --target-port5000: 指定 pod 上服务应将流量转发到的端口。 在早期部署的上下文中容器内的应用程序侦听端口 5000。因此端口 80由 --port 指定传入的外部流量将转发到 Pod 上的端口 5000。 检索服务 URL: $ kubectl get services 然后您可以通过提供的 URL 访问您的机器学习模型。 5. 扩展您的部署 Kubernetes 让您可以轻松扩展部署 $ kubectl scale deployment ml-model-deployment --replicas5 scale: 这告诉 kubectl 您打算更改特定资源在本例中为部署的副本数量即调整规模。 deployment ml-model-deployment: 指定要扩展的资源部署的类型和该资源的名称ml-model-deployment。 --replicas5: 指定您希望部署所需的副本数量。 这意味着 Kubernetes 将确保有 5 个相同的 pod副本为 ml-model-deployment 运行。 Kubernetes 为部署机器学习模型提供了一个强大的环境确保它们具有高可用性和可扩展性。 All in one # Cluster Info kubectl cluster-info# Get resources kubectl get nodes kubectl get pods kubectl get services kubectl get deployments# Describe resources kubectl describe node node-name kubectl describe pod pod-name kubectl describe service service-name kubectl describe deployment deployment-name# Create resources kubectl create -f filename.yaml kubectl apply -f filename.yaml # idempotent version of create# Delete resources kubectl delete -f filename.yaml kubectl delete pod pod-name kubectl delete service service-name kubectl delete deployment deployment-name# Logs Debugging kubectl logs pod-name kubectl exec -it pod-name -- /bin/bash# Scale deployments kubectl scale deployment deployment-name --replicasnumber# Rolling updates and rollbacks kubectl set image deployment/deployment-name container-namenew-image kubectl rollout history deployment/deployment-name kubectl rollout undo deployment/deployment-name# Configuration kubectl config view kubectl config use-context context-name# Namespace operations kubectl get namespaces kubectl create namespace namespace-name kubectl delete namespace namespace-name kubectl get pods --namespacenamespace-name# Port forward kubectl port-forward pod-name local-port:pod-port Helm: 头盔Helm Helm 通常被称为 Kubernetes 的包管理器。 随着机器学习模型变得越来越复杂周围的基础设施也越来越大Helm 简化了部署过程。 图表Helm 使用“图表”它是预先配置的 Kubernetes 资源的包。 将它们想象成一个打包的应用程序。 发布当图表部署在 Kubernetes 上时称为发布。 简单性您无需处理多个不同的 Kubernetes 清单文件只需管理单个 Helm 图表。 设置Helm 在开始使用 Helm 部署 ML 模型之前您需要对其进行设置。 安装Helm从官方网站下载并安装Helm或使用brew等包管理器。 初始化 Helm安装后运行 helm init 以设置 Helm 环境。 添加存储库Helm 图表存储在存储库中。 使用 helm repo add 添加所需的存储库。 用于 ML 部署的基本 Helm 命令 搜索图表helm search repo 可让您在添加的存储库中查找图表。 安装图表helm install [chart-name] 会将图表部署到您的 Kubernetes 集群上。 升级和回滚更改了您的 ML 模型中的某些内容 helm Upgrade 允许您使用较新的图表升级您的版本。 犯了一个错误 helm 回滚将恢复到以前的版本。 删除版本helm delete [release-name] 将从 Kubernetes 中删除该版本。 使用 Helm 部署 ML 模型 让我们假设一个场景您有一个用于图像识别的 ML 模型 准备模型训练模型并将其公开为 API使用 Flask、FastAPI、Streamlit 等。 Docker 化模型创建 ML 应用程序的 Docker 映像。 创建 Helm 图表为您的 ML 模型构建 Helm 图表确保定义必要的资源例如部署、服务以及任何 ConfigMap 或 Secret如果需要。 部署使用 helm install [chart-name] 部署您的 ML 模型。 Kubernetes 将创建图表中定义的资源。 使用 Helm 进行 ML 部署的好处 版本控制Helm 图表具有版本控制确保您可以无缝管理 ML 应用程序的不同版本。 原子部署Helm 确保发布是原子的。 这意味着要么所有资源都已成功部署要么没有从而确保状态一致。 可重用性和共享您可以轻松打包和共享 Helm 图表。 如果您在不同的 ML 模型或团队中具有类似的部署结构这将非常有用。 简化复杂部署机器学习工作流程可能很复杂尤其是与数据管道结合使用时。 Helm 允许以可维护的方式定义复杂的工作流程。 以下是一些基本 Helm 命令的指南 设置和安装 安装Helm curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh 配置 添加 Helm 存储库 helm repo add [repo_name] [repo_url] 更新存储库信息 helm repo update 部署 搜索 Helm 图表 helm search repo [search_term] 安装 Helm Chart helm install [release_name] [repo_name]/[chart_name] 列出所有已安装的 Helm 版本 helm list 获取有关版本的信息 helm status [release_name] 更新和回滚 升级已安装的版本 helm upgrade [release_name] [repo_name]/[chart_name] 将版本回滚到以前的修订版 helm rollback [release_name] [revision_number] 清理和删除 卸载版本 helm uninstall [release_name] 删除 Helm 存储库 helm repo remove [repo_name] 本地图表开发 创建新的 Helm 图表 helm create [chart_name] 检查 Helm 图表 helm lint [chart_directory] 打包 Helm Chart helm package [chart_directory] 存储库和插件 列出添加的 Helm 存储库 helm repo list 安装 Helm 插件 helm plugin install [plugin_url] 一次性完成所有基本命令 # Initialize Helm and install Tiller (for Helm 2) helm init# Helm version helm version# Add a new Helm chart repository helm repo add repo_name repo_url# Update Helm chart repository list helm repo update# Search for Helm charts helm search repo chart_name# Install a Helm chart helm install release_name chart_name # For Helm v3 and above, use: helm install release_name chart_name --generate-name# List all releases helm list # For Helm v3 and above, you might need: helm list --all-namespaces# Get information about a release helm status release_name# Upgrade a release helm upgrade release_name chart_name# Rollback a release to a previous revision helm rollback release_name revision_number# Uninstall a release helm uninstall release_name# View the values of a release helm get values release_name# Lint a Helm chart helm lint path_to_chart# Package a Helm chart into a versioned chart archive helm package path_to_chart# View Helm history helm history release_name# Create a new Helm chart helm create chart_name# Render Helm chart templates locally (dry-run) helm template chart_name# Pull a chart from a repository and download it to your machine helm pull chart_name Github Actions: GitHub Actions 提供强大的集成 CI/CD 解决方案允许开发人员直接在其 GitHub 存储库中自动化、自定义和执行软件开发工作流程。 对于使用 Python 的机器学习开发人员来说它提供了一个无缝环境来自动执行测试、构建和部署模型等任务。 了解 GitHub 操作 1. 工作流程这些是您可以在存储库中设置的自动化过程用于在 GitHub 上构建、测试、打包、发布或部署任何代码项目。 2. 事件工作流程由事件触发。 常见事件包括push和pull_request但还有许多其他事件例如计划事件或手动触发器。 3. 作业作业是在同一运行器上执行的一组步骤。 作业可以并行运行也可以依赖于另一个作业的成功。 4. 步骤这些是可以运行命令或操作的单独任务。 5. 操作这些是独立命令组合成步骤来创建作业。 操作可以由 GitHub、社区驱动或自定义到您的存储库提供。 使用 GitHub Actions 设置机器学习 CI/CD 管道 1. 创建工作流在您的存储库中创建一个名为 .github/workflows 的目录。 添加新文件例如 ml_cicd.yml来定义您的工作流程。 2. 定义工作流触发器您可以指定何时触发工作流。 对于 CI/CD通常使用推送 on: [push] 3. 定义测试和部署作业设置一个作业以在每次出现推送事件时测试机器学习代码 jobs:build_and_test:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkoutv2- name: Set up Pythonuses: actions/setup-pythonv2with:python-version: 3.8- name: Install dependenciesrun: |pip install -r requirements.txt- name: Run testsrun: pytest 4. 部署模型测试后您可以添加步骤来部署模型 - name: Deploy modelrun: |# Your deployment script here, for example:python deploy_model.py 5. 缓存和矩阵构建要加快构建速度请使用缓存 - name: Cache dependenciesuses: actions/cachev2with:path: ~/.cache/pipkey: ${{ runner.os }}-pip-${{ hashFiles(**/requirements.txt) }}restore-keys: |${{ runner.os }}-pip- 要跨多个 Python 版本进行测试请使用矩阵构建 strategy:matrix:python-version: [3.7, 3.8, 3.9] 6. 持续部署如果您正在使用云平台或容器编排系统例如 Kubernetes则可以在测试通过后整合步骤来部署 ML 模型。 - name: Deploy to Kubernetesrun: |kubectl apply -f k8s-deployment.yaml 一些基本动作 # Name of the workflow name: CI/CD Workflow# Event that triggers the workflow on:push:branches:- mainpull_request:branches:- mainjobs:build:name: Build Jobruns-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkoutv2- name: Set up Pythonuses: actions/setup-pythonv2with:python-version: 3.8- name: Install dependenciesrun: |python -m pip install --upgrade pippip install -r requirements.txt- name: Run testsrun: pytestdeploy:name: Deploy Jobneeds: buildruns-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkoutv2- name: Deploy to serverrun: ./deploy_script.sh#sample file 以下是其他流行的 CI/CD 工具的列表 JenkinsJenkins 是最流行的开源自动化服务器之一用于构建、部署和自动化任何项目。 它拥有庞大的插件生态系统。Travis CITravis CI 与 GitHub 集成为开源和私有项目提供基于云的 CI/CD 服务。CircleCI提供基于云的和自托管的 CI/CD 解决方案。 与 GitHub 和 Bitbucket 集成。GitLab CI/CD作为 GitLab 平台的一部分这个内置工具在单个服务中提供存储库和 CI/CD。BambooAtlassian 的 CI/CD 服务器解决方案Bamboo 与 JIRA、Bitbucket 和其他 Atlassian 产品紧密集成。Azure PipelinesMicrosoft Azure DevOps 服务的一部分它提供 CI/CD 功能并与 GitHub 和外部存储库集成。 Streamlit简介 Streamlit 是专为机器学习和数据科学项目打造的开源应用程序框架。 只需几行 Python 代码您就可以快速将数据脚本转换为交互式 Web 应用程序而无需任何 HTML、CSS 或 JavaScript 知识。 Streamlit 简单的语法和快速的开发周期使其成为希望展示其项目的数据科学家的诱人选择。 Streamlit 安装和基本配置 安装 Streamlit 非常简单 pip install streamlit 要检查它是否已正确安装 streamlit hello 此命令在 Web 浏览器中启动示例 Streamlit 应用程序。 构建简单的 Streamlit ML 应用程序 让我们创建一个机器学习模型使用 TextBlob 库预测输入文本是正数还是负数。 然后我们将使用 Streamlit 进行交互。 首先确保您拥有必要的库 pip install streamlit textblob 接下来创建一个 Python 脚本 (app.py) import streamlit as st from textblob import TextBlob st.title(Sentiment Analysis Using Streamlit) user_input st.text_area(Enter Text:, Type Here...) if st.button(Analyze):blob TextBlob(user_input)result blob.sentiment.polarityif result 0:st.write(Positive Sentiment)elif result 0:st.write(Negative Sentiment)else:st.write(Neutral Sentiment) 运行您的 Streamlit 应用程序 streamlit run app.py 这将在您的浏览器中启动该应用程序您可以在其中输入文本并获取其情绪。 使用 Docker 进行容器化 为了实现跨平台的生产部署和一致性您可能希望对 Streamlit 应用程序进行容器化。 Streamlit 的 Dockerfile FROM python:3.8-slim WORKDIR /app COPY requirements.txt ./requirements.txt RUN pip install -r requirements.txt COPY . . EXPOSE 8501 CMD [streamlit, run, app.py] 在这里requirements.txt 将包含 streamlit textblob 构建并运行 Docker 容器 docker build -t ml-streamlit-app:latest . docker run -p 8501:8501 ml-streamlit-app:latest 一气呵成 ########################## ### Streamlit Commands ### ########################### 1. Install Streamlit pip install streamlit# 2. Create a new Streamlit script echo import streamlit as st\n\nst.write(Hello, world!) app.py# 3. Run a Streamlit app streamlit run app.py# 4. Secure your Streamlit app (you can set tokens, passwords, etc.) # Use third-party tools or services for this. streamlit run app.py --secure-mode# 5. Set the Streamlit server port (e.g., to 9999) streamlit run app.py --server.port 9999# 6. Disable the Streamlit welcome page streamlit run app.py --server.headless true# 7. Cache data to speed up your Streamlit app # In your app.py script, you can use the st.cache decorator for functions you want to cache. # Example: # st.cache # def fetch_data(): # return download_your_data_here()# 8. Deploying Streamlit app with Streamlit sharing # - First, push your app to a public GitHub repository. # - Then use Streamlit sharing (a service by Streamlit) to deploy directly from the repository. # Check the Streamlit documentation for more on this.############################ ### Streamlit Components ### ############################# Streamlit offers various components like buttons, sliders, file uploaders, etc. # Here are examples of a few:# In your app.py:# st.button(Click me!) # st.slider(Select a range, 0.0, 100.0) # st.file_uploader(Upload a file here) # st.selectbox(Choose an option, [Option 1, Option 2, Option 3])用于机器学习部署的 Flask初学者指南 Flask 是 Python 中的一个轻量级 Web 服务器框架。 其微框架性质使其非常适合快速创建中小型 Web 应用程序。 它特别适合部署机器学习模型因为它具有灵活性并提供从 Python 代码到 Web 服务的直接路径。 Flask安装及基本配置 首先使用 pip 安装 Flask pip install Flask 要检查它是否已正确安装您可以创建一个基本的 Flask 应用程序 from flask import Flask app Flask(__name__) app.route(/) def hello_world():return Hello, World! 将其保存为 app.py 并运行 export FLASK_APPapp.py flask run 此命令启动您的 Flask 应用程序您应该看到 Hello, World! 当您在浏览器中导航到 http://127.0.0.1:5000/ 时。 构建一个简单的 Flask ML 应用程序 想象一下我们有一个机器学习模型可以使用 TextBlob 库预测输入文本是正面还是负面。 我们将使用 Flask 为该模型创建一个简单的 API。 首先确保您拥有必要的库 pip install Flask textblob 接下来更新app.py from flask import Flask, request, jsonify from textblob import TextBlob app Flask(__name__) app.route(/analyze, methods[POST]) def analyze_sentiment():data request.get_json()text data[text]blob TextBlob(text)result blob.sentiment.polaritysentiment if result 0:sentiment Positiveelif result 0:sentiment Negativeelse:sentiment Neutralreturn jsonify(sentimentsentiment) if __name__ __main__:app.run(debugTrue) 这个 Flask 应用程序公开了一个 POST 端点 /analyze它需要一个带有关键文本的 JSON 对象并返回所提供文本的情绪。 使用 Docker 进行容器化 为了便于部署并确保不同环境之间的一致性对 Flask 应用程序进行容器化非常有用。 Flask 的 Dockerfile FROM python:3.8-slim WORKDIR /app COPY requirements.txt ./requirements.txt RUN pip install -r requirements.txt COPY . . EXPOSE 5000 CMD [python, app.py] 您的requirements.txt 应包含 Flask textblob 构建并运行 Docker 容器 docker build -t ml-flask-app:latest . docker run -p 5000:5000 ml-flask-app:latest 一气呵成 # ---- SETTING UP A VIRTUAL ENVIRONMENT AND INSTALLING FLASK ---- # Create a virtual environment python -m venv myenv# Activate the virtual environment # On Windows: myenv\Scripts\activate # On macOS and Linux: source myenv/bin/activate# Install Flask pip install Flask# ---- BASIC FLASK APP STRUCTURE ---- # Use this structure in your Python script (e.g., app.py)from flask import Flask app Flask(__name__)app.route(/) def hello_world():return Hello, World! # ---- RUNNING A FLASK APPLICATION ---- # Set the FLASK_APP environment variable # On Windows: set FLASK_APPyour_flask_app_filename.py # On macOS and Linux: export FLASK_APPyour_flask_app_filename.py# Run the app flask run# ---- DEVELOPMENT MODE ---- # Activate the development environment # On Windows: set FLASK_ENVdevelopment # On macOS and Linux: export FLASK_ENVdevelopment# Now run the app flask run# ---- SPECIFY HOST AND PORT ---- flask run --host0.0.0.0 --port8080# ---- USING FLASK EXTENSIONS (example: Flask-SQLAlchemy) ---- # Install Flask-SQLAlchemy pip install Flask-SQLAlchemy # Use in your Flask app:from flask import Flask from flask_sqlalchemy import SQLAlchemyapp Flask(__name__) app.config[SQLALCHEMY_DATABASE_URI] sqlite:///your_database_name.db db SQLAlchemy(app) # ---- DEACTIVATE VIRTUAL ENVIRONMENT ---- deactivate Gradio简介 Gradio 是一个开源 Python 库它提供了一种简单的方法来为机器学习模型创建用户友好的基于 Web 的界面。 它的设计简单明了允许机器学习从业者快速部署并与非技术用户共享他们的模型。 Gradio安装和基本配置 使用 pip 安装 Gradio 很简单 pip install gradio 安装 Gradio 后您可以快速为模型创建界面而无需广泛的 Web 开发专业知识。 构建一个简单的 Gradio ML 应用程序 假设我们有一个机器学习模型可以对 MNIST 数据集中的手写数字进行分类。 我们将使用 Gradio 为该模型创建一个简单的 UI。 首先确保您拥有必要的库 pip install gradio tensorflow 接下来使用 TensorFlow 构建一个简单的模型并将其与 Gradio 集成 import gradio as gr import numpy as np import tensorflow as tf# Load MNIST dataset mnist tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) mnist.load_data() x_train, x_test x_train / 255.0, x_test / 255.0 # Normalize data# Build a simple model model tf.keras.models.Sequential([tf.keras.layers.Flatten(input_shape(28, 28)),tf.keras.layers.Dense(512, activationrelu),tf.keras.layers.Dropout(0.2),tf.keras.layers.Dense(10) ]) model.compile(optimizeradam,losstf.losses.SparseCategoricalCrossentropy(from_logitsTrue),metrics[accuracy])model.fit(x_train, y_train, epochs5)def classify_digit(img):img img.reshape(1, 28, 28)prediction model.predict(img).tolist()[0]return {str(i): prediction[i] for i in range(10)}# Gradio UI interface gr.Interface(fnclassify_digit, inputssketchpad, outputslabel) interface.launch() 运行此脚本将在 MNIST 数据集上训练模型然后启动 Gradio 界面您可以在其中绘制数字模型将对它们进行分类。 使用 Docker 进行容器化 为了确保我们的应用程序在各种环境中保持一致并简化部署将 Gradio 应用程序容器化很有帮助。 广播电台的 Dockerfile FROM python:3.8-slim WORKDIR /app COPY requirements.txt ./requirements.txt RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [python, app.py] 您的requirements.txt 应包含 gradio tensorflow 构建并运行 Docker 容器 docker build -t ml-gradio-app:latest . docker run -p 7860:7860 ml-gradio-app:latest 此命令将在 Docker 容器中启动 Gradio 应用程序并使其在端口 7860 上可用。 FastAPI简介 FastAPI 是一个现代、快速的 Web 框架用于基于标准 Python 类型提示使用 Python 构建 API。 它提供自动交互式 API 文档构建在用于 Web 部分的 Starlette 和用于数据部分的 Pydantic 之上并因其性能而受到认可甚至可以与 NodeJS 和 Go 相媲美。 Docker 及其重要性 Docker 允许您将应用程序及其所有依赖项打包到一个标准化单元中以进行软件开发。 这可以确保无论 Docker 容器在何处运行您的应用程序都会以相同的方式运行。 对于机器学习来说这一点至关重要因为您经常有大量的依赖项可能会导致冲突或版本控制问题。 用于 ML 部署的 FastAPI 和 Docker FastAPI 可以像任何其他 Web 应用程序一样进行 Docker 化。 鉴于 FastAPI 的快速性能它非常适合作为机器学习模型的服务器特别是与 Docker 的一致性和隔离性结合使用时。 实践示例 创建 FastAPI 应用程序让我们创建一个简单的 FastAPI 应用程序来为机器学习模型提供服务。 在本指南中为了简单起见我们将使用预先训练的模型。 # main.py from fastapi import FastAPI from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression app FastAPI() # Load dataset and train a simple model X, y load_iris(return_X_yTrue) clf LogisticRegression().fit(X, y) app.get(/predict/) def predict(sepal_length: float, sepal_width: float, petal_length: float, petal_width: float):prediction clf.predict([[sepal_length, sepal_width, petal_length, petal_width]])return {prediction: int(prediction[0])} 创建 Dockerfile现在让我们对 FastAPI 应用程序进行 Docker 化。 # Use an official Python runtime as a base image FROM python:3.8-slim # Set the working directory WORKDIR /app # Install dependencies COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt # Copy the current directory contents into the container at /app COPY . . # Expose port 8000 for FastAPI EXPOSE 8000 # Run main.py when the container launches CMD [uvicorn, main:app, --host, 0.0.0.0, --port, 8000] FROM python:3.8-slim: 使用官方 Python 3.8 映像的精简版本作为此 Docker 容器的基础映像。WORKDIR /app: 将容器中的工作目录设置为/app。 所有后续命令都将从该目录运行。COPY requirements.txt ./: 将 requests.txt 文件从主机复制到容器中的当前位置 (/app)。RUN pip install --no-cache-dir -r requirements.txt:安装requirements.txt中指定的Python依赖项而不存储缓存从而使图像尺寸更小。COPY . .: 将主机当前目录下的所有文件复制到容器当前目录/app中。EXPOSE 8000: 通知 Docker 容器将在运行时侦听指定的网络端口在本例中为 8000。CMD [uvicorn, main:app, --host, 0.0.0.0, --port, 8000]: 指定容器启动时将执行的命令。 在这里它使用 Uvicorn 在主机 0.0.0.0 和端口 8000 上启动 FastAPI 应用程序。 每条指令都会在 Docker 镜像中创建一个新层并按顺序执行它们以构建最终镜像。 此 Dockerfile 设置为在容器化环境中运行 FastAPI 应用程序。 你的requirements.txt应该有 fastapi uvicorn scikit-learn c. 使用 Docker 构建并运行安装 Docker 后导航到项目的根目录并运行 $ docker build -t fastapi_ml_app . $ docker run -p 8000:8000 fastapi_ml_app 在浏览器中访问 http://localhost:8000/predict/?sepal_length5.1sepal_width3.5petal_length1.4petal_width0.2。 您应该看到预测输出。 使用上述工具的端到端示例项目 项目流程如下 机器学习模型部署流程 开发机器学习模型 数据采集 数据预处理 模型训练 模型评估 模型导出例如 TensorFlow SavedModel 或 PyTorch state_dict Streamlit 应用程序开发 使用 Streamlit 编写应用程序脚本使用 ML 模型进行推理 在本地测试应用程序 将 Streamlit 应用程序 Docker 化 创建包含所有必要说明的 Dockerfile 构建 Docker 镜像 本地测试 Docker 容器 推送到 Docker 注册表 将构建的 Docker 镜像推送到容器注册中心例如 Docker Hub、Google 容器注册中心等 使用 Terraform 进行基础设施设置 使用声明性配置文件编写 Terraform 配置来定义和提供数据中心基础设施 初始化 Terraform应用配置来配置 Google Kubernetes Engine (GKE) 集群以及 GCP 中的其他所需资源 带 Helm 的打包应用 为您的 Streamlit 应用程序创建 Helm 图表其中包括 Kubernetes 清单模板和值 打包 Helm 图表 使用 Helm 进行 Kubernetes 部署 使用 Helm 将应用程序部署到 Kubernetes 集群例如 GKE Helm将使用打包好的chart来部署和管理Kubernetes资源 持续集成和持续部署CI/CD 使用 GitHub Actions 自动化模型训练、测试、Docker 构建、Terraform 应用程序和 Helm 部署 配置 GitHub Actions 工作流程和触发器 监控和规模 使用监控解决方案如 Prometheus、Grafana监控应用程序和模型性能 使用 Kubernetes 自动缩放或手动命令根据流量向上/向下扩展 1. 机器学习模型 import tensorflow as tf import tensorflow_hub as hubmodel_url https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/classification/4 model tf.keras.Sequential([hub.KerasLayer(model_url) ])def classify_image(image_path):img tf.keras.preprocessing.image.load_img(image_path, target_size(224, 224))img_array tf.keras.preprocessing.image.img_to_array(img)img_array tf.expand_dims(img_array, 0) predictions model.predict(img_array)top_prediction tf.keras.applications.mobilenet_v2.decode_predictions(predictions.numpy())[0][0]return top_prediction[1], top_prediction[2] 2.Streamlit应用程序 Python代码app.py import streamlit as st from model import classify_imagest.title(Image Classifier)uploaded_file st.file_uploader(Choose an image..., type[jpg, png, jpeg]) if uploaded_file:st.image(uploaded_file, captionUploaded Image., use_column_widthTrue)st.write()st.write(Classifying...)label, probability classify_image(uploaded_file)st.write(fClass: {label}, Confidence: {probability:.2f}%) 3. Docker: Dockerfile: FROM python:3.8-slimWORKDIR /appCOPY requirements.txt requirements.txt RUN pip install -r requirements.txtCOPY . .CMD [streamlit, run, app.py] requirements.txt: streamlit tensorflow tensorflow_hub 构建并推送到 Docker Hub docker build -t username/image-classifier . docker push username/image-classifier 4. Kubernetes 和 Helm 为我们的部署创建 Helm 图表。 图表结构简化 image-classifier-chart/ |-- templates/ | |-- deployment.yaml | |-- service.yaml |-- values.yaml |-- Chart.yaml 在deployment.yaml和service.yaml中定义Kubernetes部署和服务结构相应地引用Docker镜像和端口。 deployment.yaml: 该文件定义了 Kubernetes 部署它确保在任何给定时间都有一定数量的 pod 副本正在运行。 apiVersion: apps/v1 kind: Deployment metadata:name: image-classifier-deployment spec:replicas: 2selector:matchLabels:app: image-classifiertemplate:metadata:labels:app: image-classifierspec:containers:- name: image-classifier-containerimage: username/image-classifier:latestports:- containerPort: 8501 # Streamlits default port service.yaml: apiVersion: v1 kind: Service metadata:name: image-classifier-service spec:selector:app: image-classifierports:- protocol: TCPport: 80targetPort: 8501type: LoadBalancer values.yaml: replicaCount: 2image:repository: username/image-classifiertag: latestpullPolicy: IfNotPresentservice:type: LoadBalancerport: 80 这是 Helm 图表的默认配置文件。 部署 Helm 图表时您可以覆盖这些默认值。 Chart.yaml: apiVersion: v2 name: image-classifier-chart description: A Helm chart to deploy the image classifier app on Kubernetes version: 0.1.0 appVersion: 1.0.0 5.GitHub 操作 设置 CI/CD 管道来构建 Docker 映像并在提交代码时将其推送到 Docker Hub。 .github/workflows/main.yml: name: Build and Push Docker Imageon:push:branches:- masterjobs:build:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkoutv2- name: Login to Docker Hubrun: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin- name: Build and Push Docker Imagerun: |docker build -t username/image-classifier .docker push username/image-classifier 一旦 GitHub Action 成功构建并推送 Docker 镜像您就可以使用 Helm 将图表部署到 Kubernetes 集群。 使用 Helm 进行部署 要使用 Helm 部署 Streamlit 应用程序 打包 Helm 图表 helm package image-classifier-chart 将图表安装到您的 Kubernetes 集群上 helm install image-classifier-release image-classifier-chart-0.1.0.tgz 部署完成后您将从 LoadBalancer 获得外部 IP 地址。 在浏览器上访问此 IP 将带您进入 Streamlit 应用程序。 附加工具Terraform(IAC) 简介 Terraform 是由 HashiCorp 开发的开源基础设施即代码 (IAC) 软件工具。 它允许用户使用声明性配置语言定义和配置数据中心基础设施。 借助 Terraform您可以跨多个云提供商管理和自动化基础设施使其成为现代基于云的应用程序包括机器学习部署的重要工具。 为什么选择 Terraform 进行机器学习部署 不可变的基础设施定义一次 ML 基础设施并跨阶段一致部署。 与提供商无关无论您使用 AWS、Google Cloud、Azure 还是组合Terraform 都能满足您的需求。 可扩展性根据需求轻松扩展或缩小 ML 资源。 版本控制基础设施作为代码存储使版本控制和回滚无缝。 为 ML 环境设置 Terraform 安装 Terraform遵循为您的操作系统量身定制的官方安装指南。 初始化新的 Terraform 配置使用 terraform init 开始新项目。 配置云提供商为您选择的云提供商设置身份验证。 使用 Terraform 部署 ML 基础设施 定义基础设施在 .tf 文件中描述 ML 模型所需的资源例如虚拟机、存储和网络。 规划部署使用 terraform plan在应用更改之前检查更改。 应用更改terraform apply 将提供定义的资源。 集成 ML 组件基础设施准备就绪后部署 ML 模型、必要的服务和其他组件。 使用 Terraform 进行持续集成和持续部署 (CI/CD) 自动化工作流程将 Terraform 与 Jenkins、GitHub Actions 或 GitLab CI 等 CI/CD 工具集成。 自动化测试通过自动化基础设施测试确保机器学习部署的完整性。 回滚功能借助版本控制的基础设施回滚更加顺畅且更易于管理。 协作使用 Terraform Cloud 或 Terraform Enterprise 实现协作功能和远程状态管理。 最佳实践和技巧 模块化配置将配置分解为模块以实现更好的组织和可重用性。 保护敏感数据使用机密管理工具并避免对凭据进行硬编码。 定期更新确保您始终使用最新版本的 Terraform 和提供程序插件。 文档就像代码一样注释和记录 Terraform 配置至关重要。 初始化 初始化一个新的 Terraform 工作目录 terraform init 此命令用于初始化包含 Terraform 配置文件的工作目录。 这是编写新的 Terraform 配置后应运行的第一个命令。 管理基础设施 规划和预览基础设施变更 terraform plan 此命令可让您在实际执行任何操作之前查看 Terraform 将应用于您的基础设施的哪些更改。 应用基础设施变更 terraform apply 此命令应用达到配置中定义的所需状态所需的更改。 摧毁基础设施 terraform destroy 删除 Terraform 配置创建的所有资源。 请谨慎使用此命令 它实际上会拆除 Terraform 配置中描述的所有内容。 检验状态 显示当前状态 terraform show 提供当前基础设施状态的可读版本。 管理模块 获取模块 terraform get 下载并安装当前配置所需的模块。 工作空间管理 工作区允许您为同一配置维护多个不同的状态。 列出工作空间 terraform workspace list 选择工作空间 terraform workspace select [workspace_name] 创建新工作区 terraform workspace new [workspace_name] 格式化和验证 格式配置 terraform fmt 此命令用于以规范的格式和样式重写 Terraform 配置文件。 验证配置 terraform validate 验证目录中的配置文件仅引用配置而不访问任何远程服务例如提供程序。 导入现有基础设施 导入资源 terraform import [address] [resource_id] 将现有基础设施导入您的 Terraform 状态。 对于在 Terraform 下管理预先存在的基础设施很有用。 输出值 显示输出 terraform output 显示上次应用的输出值。 请记住Terraform 配置写入扩展名为 .tf 的文件中。 当运行 plan 和 apply 等命令时Terraform 使用当前目录中的配置文件。 Spinnaker 是一个开源、多云持续交付平台可帮助开发人员自动化、管理和监控应用程序的部署。 它由 Netflix 创建现在得到了 Google 的支持使其成为现代软件交付的可靠选择。 为什么选择 Spinnaker 进行机器学习 可扩展性随着机器学习模型变得越来越复杂且对资源的需求越来越大Spinnaker 的云原生方法可确保无缝扩展。 版本控制ML 模型通常需要频繁更新。 Spinnaker 允许对已部署模型进行平滑版本控制。 回滚如果 ML 模型未按预期执行Spinnaker 提供简单的回滚选项。 多云如果您的机器学习部署需要利用多个云提供商的资源Spinnaker 可以满足您的需求。 使用 Spinnaker 部署 ML 模型 以下是帮助您入门的简化流程 打包您的 ML 模型您的模型、预训练权重和推理代码应使用 Docker 等工具进行容器化。 与 CI 工具集成确保使用 Jenkins 或 Travis CI 等 CI 工具自动构建模型容器。 创建 Spinnaker 应用程序这是部署管道的逻辑分组。 定义部署管道定义“获取最新模型”、“部署到暂存”、“运行测试”和“部署到生产”等阶段。 自动化每次 ML 模型更新时自动触发部署管道。 使用 Spinnaker 进行机器学习持续交付 自动化模型测试将模型验证测试集成到部署管道中。 蓝/绿部署将新版本与旧版本一起部署将一部分流量引导至新版本。 对于模型的 A/B 测试很有用。 监控和日志记录与 Prometheus 和 Grafana 等监控工具集成以密切关注模型性能和资源利用率。 反馈循环根据现实世界的反馈和性能指标快速迭代模型更新。 一些基本命令 ########################## ### Spinnaker Commands ### ########################### 1. Install hal (Halyard), the command-line tool for configuring and managing Spinnaker curl -O https://raw.githubusercontent.com/spinnaker/halyard/master/install/debian/InstallHalyard.sh sudo bash InstallHalyard.sh sudo update-hal# 2. Choose cloud providers (e.g., AWS, GCP, Kubernetes) hal config provider [provider name] enable# 3. For Kubernetes (as an example cloud provider) # Assuming you have a kubeconfig file already set up hal config provider kubernetes account add my-k8s-account --provider-version v2 \--kubeconfig-file ~/.kube/config# 4. Set the deployment environment hal config deploy edit --type distributed --account-name my-k8s-account# 5. Choose storage for Spinnakers persistent data # Example with GCS (Google Cloud Storage) hal config storage gcs edit --project [YOUR_PROJECT_ID] --bucket-location [BUCKET_LOCATION] --json-path [PATH_TO_SERVICE_ACCOUNT_JSON] hal config storage edit --type gcs# 6. Choose the version of Spinnaker you want to run hal version list hal config version edit --version [desired version]# 7. Deploy Spinnaker using Halyard hal deploy apply# 8. Connect to the Spinnaker UI # Assuming you are using Kubernetes, set up port forwarding: kubectl port-forward -n spinnaker svc/spin-deck 9000:9000 kubectl port-forward -n spinnaker svc/spin-gate 8084:8084# Now, you can access Spinnaker at http://localhost:9000# 9. Update Spinnaker (after choosing a new version with hal version edit) hal deploy apply# 10. Backup Halyards configuration tar -czf hal-backup.tgz ~/.hal/ Crossplane 是一个开源基础设施即代码 (IAC) 平台可扩展 Kubernetes 以包含云基础设施编排。 它直接与 Kubernetes 集成允许您使用熟悉的 K8s 工具和实践来声明、自动化和管理外部基础设施。 Crossplane 在 ML 部署中的作用 统一工作流程借助 Crossplane使用 kubectl 管理 Kubernetes 原生和云原生资源。 提供商多样性对多个云提供商的支持确保机器学习部署可以与提供商无关。 动态扩展ML 资源可以根据需求进行扩展完全自动化。 安全配置无缝管理敏感配置和机密。 配置管理工具Puppet 是一种配置管理工具可自动配置和管理服务器。 声明性语言用户使用 Puppet 的声明性语言定义基础设施的所需状态您希望系统是什么样子、应具有哪些软件包等Puppet 将强制执行此所需状态。 基础设施即代码使用 Puppet基础设施作为代码进行管理。 这允许版本控制、同行评审和自动化测试就像任何其他软件代码库一样。 幂等性Puppet 的关键特征之一是其幂等性这意味着无论初始条件如何它都能确保每次运行的最终状态保持一致。 如果已经满足所需的状态Puppet 将不会进行任何更改。 代理/服务器模型通常Puppet 遵循主代理设置。 主节点包含由 Puppet 代码定义的配置代理会定期与主节点进行检查以获取配置指令。 模块和 Forge模块是可重用、可共享的代码块用于在 Puppet 中执行特定任务。 Puppet Forge 是一个社区成员可以共享这些模块的市场。 灵活性Puppet 可以管理各种基础设施从裸机到容器以及跨不同平台和云环境。 报告Puppet 提供详细的报告显示已进行哪些更改以及谁进行了更改。 集成Puppet 与其他 DevOps 工具集成良好使用户能够构建完整的持续集成/持续部署 (CI/CD) 管道。 开源版和企业版Puppet 提供开源版和企业版。 企业版提供了附加功能包括图形界面、分析和专业支持。 结论 无缝高效地部署机器学习模型需要采用整体方法结合针对不同任务定制的各种工具的强大功能。 从使用 Streamlit、Gradio、Flask 或 FastAPI 制作交互式前端应用程序到使用 Docker 进行容器化、使用 Kubernetes 和 Helm 进行编排以及使用 Terraform 实现基础设施自动化当代的 ML 部署环境是丰富多样的。 利用这些工具不仅可以确保稳健且可扩展的部署还可以加速从模型开发到现实世界影响的过程。 随着技术生态系统的发展这些集成工具为简化机器学习部署的时代铺平了道路。
文章转载自:
http://www.morning.tbnpn.cn.gov.cn.tbnpn.cn
http://www.morning.dhwyl.cn.gov.cn.dhwyl.cn
http://www.morning.gqfbl.cn.gov.cn.gqfbl.cn
http://www.morning.lizimc.com.gov.cn.lizimc.com
http://www.morning.kzcfr.cn.gov.cn.kzcfr.cn
http://www.morning.qwpdl.cn.gov.cn.qwpdl.cn
http://www.morning.bhrkx.cn.gov.cn.bhrkx.cn
http://www.morning.nqpxs.cn.gov.cn.nqpxs.cn
http://www.morning.ykgkh.cn.gov.cn.ykgkh.cn
http://www.morning.bnxfj.cn.gov.cn.bnxfj.cn
http://www.morning.nhdw.cn.gov.cn.nhdw.cn
http://www.morning.rxpp.cn.gov.cn.rxpp.cn
http://www.morning.ghrhb.cn.gov.cn.ghrhb.cn
http://www.morning.qjzgj.cn.gov.cn.qjzgj.cn
http://www.morning.rbbzn.cn.gov.cn.rbbzn.cn
http://www.morning.fesiy.com.gov.cn.fesiy.com
http://www.morning.znrgq.cn.gov.cn.znrgq.cn
http://www.morning.plqqn.cn.gov.cn.plqqn.cn
http://www.morning.fyglg.cn.gov.cn.fyglg.cn
http://www.morning.mzjbz.cn.gov.cn.mzjbz.cn
http://www.morning.yydzk.cn.gov.cn.yydzk.cn
http://www.morning.glnfn.cn.gov.cn.glnfn.cn
http://www.morning.jhkzl.cn.gov.cn.jhkzl.cn
http://www.morning.xnrgb.cn.gov.cn.xnrgb.cn
http://www.morning.hwbf.cn.gov.cn.hwbf.cn
http://www.morning.gctgc.cn.gov.cn.gctgc.cn
http://www.morning.juju8.cn.gov.cn.juju8.cn
http://www.morning.rjkfj.cn.gov.cn.rjkfj.cn
http://www.morning.cxryx.cn.gov.cn.cxryx.cn
http://www.morning.zwsgl.cn.gov.cn.zwsgl.cn
http://www.morning.yxwrr.cn.gov.cn.yxwrr.cn
http://www.morning.xesrd.com.gov.cn.xesrd.com
http://www.morning.sgqw.cn.gov.cn.sgqw.cn
http://www.morning.lnnc.cn.gov.cn.lnnc.cn
http://www.morning.lxkhx.cn.gov.cn.lxkhx.cn
http://www.morning.kycwt.cn.gov.cn.kycwt.cn
http://www.morning.gqfjb.cn.gov.cn.gqfjb.cn
http://www.morning.ktqtf.cn.gov.cn.ktqtf.cn
http://www.morning.trfrl.cn.gov.cn.trfrl.cn
http://www.morning.pjftk.cn.gov.cn.pjftk.cn
http://www.morning.sfphz.cn.gov.cn.sfphz.cn
http://www.morning.tgtsg.cn.gov.cn.tgtsg.cn
http://www.morning.spkw.cn.gov.cn.spkw.cn
http://www.morning.fbpdp.cn.gov.cn.fbpdp.cn
http://www.morning.jlschmy.com.gov.cn.jlschmy.com
http://www.morning.pnntx.cn.gov.cn.pnntx.cn
http://www.morning.ejknty.cn.gov.cn.ejknty.cn
http://www.morning.fndfn.cn.gov.cn.fndfn.cn
http://www.morning.jzgxp.cn.gov.cn.jzgxp.cn
http://www.morning.nsrtvu.com.gov.cn.nsrtvu.com
http://www.morning.xlztn.cn.gov.cn.xlztn.cn
http://www.morning.slfmp.cn.gov.cn.slfmp.cn
http://www.morning.yjdql.cn.gov.cn.yjdql.cn
http://www.morning.lfcfn.cn.gov.cn.lfcfn.cn
http://www.morning.lskyz.cn.gov.cn.lskyz.cn
http://www.morning.sjwzl.cn.gov.cn.sjwzl.cn
http://www.morning.gycyt.cn.gov.cn.gycyt.cn
http://www.morning.hlyfn.cn.gov.cn.hlyfn.cn
http://www.morning.duckgpt.cn.gov.cn.duckgpt.cn
http://www.morning.zgnng.cn.gov.cn.zgnng.cn
http://www.morning.jyzqn.cn.gov.cn.jyzqn.cn
http://www.morning.nzkkh.cn.gov.cn.nzkkh.cn
http://www.morning.dbdmr.cn.gov.cn.dbdmr.cn
http://www.morning.zrjzc.cn.gov.cn.zrjzc.cn
http://www.morning.dncgb.cn.gov.cn.dncgb.cn
http://www.morning.yfnhg.cn.gov.cn.yfnhg.cn
http://www.morning.wnjwb.cn.gov.cn.wnjwb.cn
http://www.morning.lylkh.cn.gov.cn.lylkh.cn
http://www.morning.wtrjq.cn.gov.cn.wtrjq.cn
http://www.morning.mcqhb.cn.gov.cn.mcqhb.cn
http://www.morning.tnktt.cn.gov.cn.tnktt.cn
http://www.morning.wnnlr.cn.gov.cn.wnnlr.cn
http://www.morning.mjglk.cn.gov.cn.mjglk.cn
http://www.morning.hpxxq.cn.gov.cn.hpxxq.cn
http://www.morning.dcccl.cn.gov.cn.dcccl.cn
http://www.morning.hlrtzcj.cn.gov.cn.hlrtzcj.cn
http://www.morning.rnyhx.cn.gov.cn.rnyhx.cn
http://www.morning.mdlqf.cn.gov.cn.mdlqf.cn
http://www.morning.fgsqz.cn.gov.cn.fgsqz.cn
http://www.morning.nwzcf.cn.gov.cn.nwzcf.cn
http://www.tj-hxxt.cn/news/257108.html

相关文章:

  • 延安市违法建设举报网站手机编程软件哪个好
  • 天河区做网站公司企业网站模板建站流程
  • 类似站酷的设计类网站做网贷网站多少钱
  • 装修设计公司网站家在深圳光明业主论坛
  • 创建一个网站网站空间费用企业网站必须备案吗
  • 建站必须要域名吗点评网站分站设计
  • 环境设计排版素材网站新公司做网站怎么做
  • 哈尔滨手机网站建设建设工程施工合同管理的原则
  • 专业模板网站制作服务什么网站详情页做的好
  • 寿光市建设局网站做视频网站应该选什么服务器
  • 公司网站建设需推广wordpress自带搜索
  • 网站主办单位变更wordpress 您没有足够的权限
  • 网站建设项目验收报告wordpress插件地图标记
  • 音乐盒网站源码北京传媒公司排行榜
  • 网站设置不能通过链接访问美食网站建设实施方案
  • 视频网站开发工程师全媒体运营技巧和工具
  • 南昌 网站制作html基本结构代码
  • 门户网站的区别网站编辑信息怎么做
  • dfv印花图案设计网站怎么在家开网店挣钱呢
  • 重庆公司企业网站建设网站建设计划表模板下载
  • 阿里云 拦截网站个人网站备案拍照
  • 农业网站建设能自己做头像的网站
  • 定制做网站报价品展示设计网站
  • 建设局网站买卖合同seo排名优化工具
  • 百度网站提交了多久收录谷歌浏览器官网入口
  • 网站积分方案莱芜雪野湖风景区介绍
  • 模板网站怎么做网站开发主要用到哪些工具
  • 泰安整站优化网站开发 案例详解
  • 杭州网站推广方案平台广州的企业网站建设
  • 图片背景在网站建设中天眼