MobileLLM开发安卓AI的体验(一)
MobileLLM是一个在安卓端跑的大语言模型,关键它还有调动api的能力
https://github.com/facebookresearch/MobileLLM
项目地址是这个。
看了下,似乎还是中国人团队
@article{liu2024mobilellm, title={MobileLLM: Optimizing Sub-billion Parameter Language Models for On-Device Use Cases}, author={Liu, Zechun and Zhao, Changsheng and Iandola, Forrest and Lai, Chen and Tian, Yuandong and Fedorov, Igor and Xiong, Yunyang and Chang, Ernie and Shi, Yangyang and Krishnamoorthi, Raghuraman 等}, journal={arXiv preprint arXiv:2402.14905}, year={2024} }
下来,根据流程要求,重现过程
我本地的pyton只有3.10
干脆就使用了Anaconda Navigator来安装 pytorch
这个是他的图形界面,里面包含pytorch环境
关于安装过程,我的另一篇文章有专门去写。
安装PyTorch深度学习框架-CSDN博客文章浏览阅读54次。下载地址下载下来直接安装就好了,可能安装比较慢一些注意要用管理员权限安装,最好关闭杀毒软件。安装好后运行时这个样子的,这个图形界面被称为Anaconda Navigator。Anaconda Navigator是一个桌面图形用户界面,允许您轻松地管理conda包、环境和应用程序。创建一个环境,选择你需要的python版本名字我用过了 PyTorch,python选择然后启动命令行激活程序就可以了。https://blog.csdn.net/CDialog/article/details/144399243那么现在主要是针对MobileLLM
环境搭好了,下来处理MobileLLM
我看gihub上有一句,要安装这个环境,那么来吧
其他安装
pip install -r requirement.txt , pytorch环境中,在项目根目录下执行,和requirement.txt同目录就行
pip install -r requirement.txt
网不太好的多搞几遍~~~
配置模型参数/数据预处理
这个是mobilellm的目录结构,猛地一看肯定是一脸懵逼
关键是readme文档对新人也不友好
就这么草草提了一句,还需要自己建立数据目录。
GitHub - LLM360/amber-data-prep: Data preparation code for Amber 7B LLMData preparation code for Amber 7B LLM. Contribute to LLM360/amber-data-prep development by creating an account on GitHub.https://github.com/LLM360/amber-data-prep
这个链接是另外一个项目的,下载发现有数据样本可以用,
然后把good_sample.jsonl弄到mobilellm项目里,
建立这样的目录结构,主要是有个数据根目录,需要再py文件执行的时候传参进去告诉数据目录是哪一个
还有一个输出路径,我也加了一个文件夹
(pytorch) C:\AI\MobileLLM-main>python pretrain.py --data_path "C:\AI\MobileLLM-main\basepath" --model_config ".\configs\125M\config.json"
(pytorch) C:\AI\MobileLLM-main>python pretrain.py --data_path "C:\AI\MobileLLM-main\basepath" --model_config ".\configs\125M\config.json"
执行这样的指令
pretrain.py文件就会按照参数内容指定的目录去加载配置文件并运行。
然后默认的文件报错,原因是多个并发处理的配置问题
=======================================下排等号之间的看看就可以,最后代码不是这个。
穷啊,只有一块显卡,所以
查了一下几个参数
看来要修改pretrain.py这个文件了。
在155行开始,这里进行修改
另外需要注意所有的执行文件需要转一下utf8,网上down下来的都是ANSI,会报错
pretrain.py中追加下列环境变量,配置单机单卡
os.environ['MASTER_ADDR'] = 'localhost'
再追加一行这个。
======================================== 不搞了,我直接贴单机代码
# coding=utf-8
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.import json
import logging
import os
from logging import Logger
import re
import sys
from typing import Dict, Iterator, List, Optional
import datetimeimport torch
import transformersfrom utils.modeling_llama import LlamaForCausalLM
from utils.pretrain_trainer import PretrainTrainer
from utils.process_args import process_args
from torch import distributed as dist
from torch.utils.data import Dataset, DataLoader
from transformers import AutoConfig, default_data_collator# 设置环境变量
os.environ['RANK'] = '0'
os.environ['WORLD_SIZE'] = '1'
os.environ['MASTER_ADDR'] = 'localhost'
os.environ['MASTER_PORT'] = '12345' # 选择一个未被占用的端口号
os.environ["PL_TORCH_DISTRIBUTED_BACKEND"] = "gloo"# Define a utility method for setting the logging parameters of a logger
def get_logger(logger_name: Optional[str]) -> logging.Logger:# Get the logger with the specified namelogger = logging.getLogger(logger_name)# Set the logging level of the logger to INFOlogger.setLevel(logging.INFO)# Define a formatter for the log messagesformatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")# Create a console handler for outputting log messages to the consoleconsole_handler = logging.StreamHandler()console_handler.setFormatter(formatter)# Add the console handler to the loggerlogger.addHandler(console_handler)return loggerlog: Logger = get_logger("mobileLLM")def get_local_rank() -> int:if os.environ.get("LOCAL_RANK"):return int(os.environ["LOCAL_RANK"])else:logging.warning("LOCAL_RANK from os.environ is None, fall back to get rank from torch distributed")return torch.distributed.get_rank()def get_global_rank() -> int:"""Get rank using torch.distributed if available. Otherwise, the RANK env var instead if initialized.Returns 0 if neither condition is met."""if torch.distributed.is_available() and torch.distributed.is_initialized():return torch.distributed.get_rank()environ_rank = os.environ.get("RANK", "")if environ_rank.isdecimal():return int(os.environ["RANK"])return 0def get_folder_paths(directory: str) -> List[str]:folder_paths = [os.path.join(directory, item)for item in os.listdir(directory)if os.path.isdir(os.path.join(directory, item))]return folder_pathsdef get_iterable_dataloader(iterator, batch_size):def custom_collate_fn(batch):return dict(input_ids=torch.stack(batch), labels=torch.stack(batch))class IteratorDataset(Dataset):def __init__(self, iterator):self.iterator = iteratordef __len__(self):# Return an arbitrarily large numberreturn sys.maxsizedef __getitem__(self, index):try:ids = next(self.iterator)return torch.tensor(ids)except StopIteration:raise IndexError# Create datasetdataset = IteratorDataset(iterator)# Create DataLoader with custom collate functiondataloader = DataLoader(dataset, batch_size=batch_size, collate_fn=custom_collate_fn)return dataloaderclass JSONLIterator:def __init__(self,fpath: str,world_size: int,world_rank: int,infinite: bool,) -> None:assert 0 <= world_rank < world_size, (world_rank, world_size)self.f = open(fpath, "r", encoding="utf-8", errors="ignore")self.fpath = fpathself.world_size = world_sizeself.world_rank = world_rankself.line_num = 0self.iter = iter(self.gen(infinite))self.iter_id = 0def __iter__(self) -> "JSONLIterator":return selfdef __next__(self):return next(self.iter)def gen(self, infinite: bool) -> Iterator[Dict]:while True:log.info(f"Starting iteration {self.iter_id} over {self.fpath} ...")self.iter_id += 1while True:try:line, self.line_num = self.f.readline(), self.line_num + 1if not line:breakif (self.line_num - 1) % self.world_size == self.world_rank:try:yield json.loads(line)['token_ids']except json.JSONDecodeError as e:print("Failed to parse JSON:", e)except Exception as e:print(f"Unexpected Jsonl error: {e}")continue # Skip to the next iterationexcept Exception as e:print(f"Unexpected error while reading line: {e}")continueif not infinite:breakself.f.seek(0)self.line_num = 0self.f.close()def train() -> None:#dist.init_process_group(# backend="cpu:gloo,cuda:nccl", timeout=datetime.timedelta(hours=8)#)#torch.distributed.init_process_group('gloo', init_method="env://?use_libuv=False")model_args, data_args, training_args = process_args()#global_rank = get_global_rank()#local_rank = get_local_rank()global_rank =0local_rank =0log.info(f"Global Rank: {global_rank}")log.info(f"Local Rank: {local_rank}")config = AutoConfig.from_pretrained(model_args.input_model_filename)config.share_embedding = model_args.share_embeddingconfig.layer_sharing = model_args.layer_sharingmodel = LlamaForCausalLM(config=config,)log.info("model size is "+ str(sum(param.numel() for param in model.model.parameters()) / 1024 / 1024))log.info("Start to load tokenizer...")tokenizer = transformers.AutoTokenizer.from_pretrained(pretrained_model_name_or_path=model_args.input_model_filename,cache_dir=training_args.cache_dir,model_max_length=training_args.model_max_length,padding_side="right",use_fast=False,)log.info("Complete tokenizer loading...")# go to current node's data rank#local_data_folder = os.path.join(data_args.train_data_local_path, str(global_rank//8+1))#如果您是在单机上运行,并且想要加载全部数据集进行训练,您应该去掉与分布式训练相关的逻辑。#您可以直接设置 local_data_folder 为整个数据集的路径,而不是基于 global_rank 来选择子集。local_data_folder = data_args.train_data_local_path# Data load locally from shard total data, so world_size is 8 and rank is the current node's local ranklog.info("world_rank for data loader is " + str(local_rank))log.info("world_size for data loader is " + str(1))assert os.path.isdir(local_data_folder), local_data_folderfname_match_re: str = r"\.jsonl$"# get the jsonl file name. Currently only support 1 file/folder per node#### fnames = [x for x in os.listdir(local_data_folder) if re.search(fname_match_re, x)][0]#如果您是在单机单卡上运行,并且不想使用分布式训练的数据分片结构,#您应该修改代码以直接加载整个数据集,而不是尝试从分布式节点结构中选择数据。#这意味着您应该直接指定包含所有训练数据的 .jsonl 文件的路径。fnames = "good_sample.jsonl" # 替换为您的文件名data_iter = JSONLIterator(fpath=os.path.join(local_data_folder,fnames),world_rank=local_rank,world_size=1,infinite=True,)trainer = PretrainTrainer(model=model,tokenizer=tokenizer,args=training_args,train_dataset=get_iterable_dataloader(data_iter, training_args.per_device_train_batch_size) if training_args.do_train else None,eval_dataset=None,data_collator=default_data_collator,)#torch.distributed.barrier(device_ids=[local_rank])if training_args.do_train:_ = trainer.train()trainer.save_state()#torch.distributed.barrier(device_ids=[local_rank])if __name__ == "__main__":train()
这个是我修改后的可以执行的单机代码,最终是屏蔽了所有分布式运算的代码。
执行的命令我也贴一下
python pretrain.py --train_data_local_path "C:\techxixi_project\AI\MobileLLM-main\basepath" --input_model_filename ".\configs\125M" --output_dir ".\output_path" --per_device_train_batch_size 8 --num_train_epochs 3 --learning_rate 1e-5 --do_train
执行结果如下
worldsize为8是硬编码,直接打印的,懒得改了。
加上do命令就是执行,然后开始训练。
====================================
预训练就这样了,我就不贴正式训练的部分了,系统报给我1050ti内存不足,我是没办法了,那个再找机会吧
=======================================
执行eval.py
该死的教程readme中就这么一句话,好吧我去下载模型,然后执行eval.sh
PS:eval是一个用于评估语言模型在 WikiText-2 数据集上的困惑度(Perplexity, PPL)的 Python 脚本。困惑度是衡量语言模型质量的一个指标,它反映了模型对于测试数据集的预测能力。
然后eval代码也被我改了,其中的分布式训练也屏蔽掉
列出来我的代码
import json
import logging
import os
from logging import Logger
import sys
from typing import Dict, Iterator, List, Optional
import datetime
from tqdm import tqdm
from torch import nn
import torch
import transformers
from transformers import AutoConfig, AutoTokenizer
from torch.utils.data import Dataset, DataLoader# 确保这里的导入路径是正确的,根据您的项目结构进行调整
from utils.modeling_llama import LlamaForCausalLM
from utils.process_args import process_argsdef get_logger(logger_name: Optional[str]) -> logging.Logger:logger = logging.getLogger(logger_name)logger.setLevel(logging.INFO)formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")console_handler = logging.StreamHandler()console_handler.setFormatter(formatter)logger.addHandler(console_handler)return loggerlog: Logger = get_logger("mobileLLM")def train() -> None:model_args, data_args, training_args = process_args()config = AutoConfig.from_pretrained(model_args.input_model_filename)config.share_embedding = model_args.share_embeddingconfig.layer_sharing = model_args.layer_sharinglog.info("开始读取模型...")model = LlamaForCausalLM.from_pretrained(pretrained_model_name_or_path=model_args.input_model_filename,config=config,)model.cuda()log.info("模型大小为 " + str(sum(param.numel() for param in model.parameters()) / 1024 / 1024))log.info("开始加载分词器...")tokenizer = AutoTokenizer.from_pretrained(pretrained_model_name_or_path=model_args.input_model_filename,cache_dir=training_args.cache_dir,padding_side="right",use_fast=False,)log.info("完成分词器加载...")class LocalDataset(Dataset):def __init__(self, file_path):self.file_path = file_pathdef __getitem__(self, idx):with open(self.file_path, 'r', encoding='utf-8') as f:lines = f.readlines()[idx]return torch.tensor(json.loads(lines)["token_ids"])def __len__(self):with open(self.file_path, 'r', encoding='utf-8') as f:return sum(1 for _ in f)local_dataset = LocalDataset(file_path=data_args.train_data_local_path)dataloader = DataLoader(local_dataset, batch_size=training_args.per_device_train_batch_size, shuffle=False)seqlen = config.max_position_embeddings # 获取模型的最大序列长度model.eval()nlls = []for i, batch in enumerate(tqdm(dataloader, desc="Evaluating...")):batch = batch.to(model.device)with torch.no_grad():lm_logits = model(batch).logitsshift_logits = lm_logits[:, :-1, :].contiguous().float()shift_labels = batch[:, 1:].reshape(-1)print(f"Batch {i}: shift_logits shape: {shift_logits.shape}, shift_labels shape: {shift_labels.shape}") # 打印语句loss_fct = nn.CrossEntropyLoss()loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels)if torch.isnan(loss) or torch.isinf(loss):log.warning(f"Loss is NaN or inf for batch {i}.")continue # 如果损失是NaN或inf,则跳过这个批次neg_log_likelihood = loss.float() * seqlennlls.append(neg_log_likelihood)ppl = torch.exp(torch.stack(nlls).sum() / len(nlls) * seqlen) if nlls else float('inf')print("Perplexity:", ppl)if __name__ == "__main__":train()
python eval.py --train_data_local_path "C:\techxixi_project\AI\MobileLLM-main\basepath\good_sample.jsonl" --input_model_filename "C:\techxixi_project\AI\MobileLLM-main\125M"
数据还有点问题,但是不管了,这个灯熟练了后续再出文来说吧,反正pytorch大概就是这么个用法。等我玩熟悉了,其他文章再专门别的话题讨论
相关文章:
MobileLLM开发安卓AI的体验(一)
MobileLLM是一个在安卓端跑的大语言模型,关键它还有调动api的能力 https://github.com/facebookresearch/MobileLLM 项目地址是这个。 看了下,似乎还是中国人团队 article{liu2024mobilellm, title{MobileLLM: Optimizing Sub-billion Parameter Langua…...
MySQL的并发控制与MVCC机制深度解析
目录 1. MySQL中的并发问题2. 数据库的隔离级别3. MVCC(多版本并发控制)机制3.1 MVCC的实现原理3.2 Read View详解3.3 当前读与快照读 4. MVCC在不同隔离级别下的工作方式5. MVCC解决幻读问题6. MVCC的优缺点优点:缺点: 7. MVCC在…...
搭建Tomcat(六)---Response的实现
目录 引入 一、前端项目容器的搭建 重建项目: 1.创建一个新的项目: 2.创建HTML文件 3.将先前编写的所有tomcatJava文件挪过来 二、配置java文件 1.重启一下MyTomcat 2.配置两个工具包 ①FileUtil ②ResponseUtil(响应头) 三、处理…...
深度学习物体检测之YOLOV5源码解读
V5比前面版本偏工程化,项目化,更贴合实战 一.V5版本项目配置 (1)整体项目概述 首先github直接查找yolov5,下载下来即可。在训练时,数据是怎么处理的?网络模型架构是怎么设计的(如各层的设计)?yolov5要求是大于python3.8与大于等…...
Ubuntu22.04配置3D gaussian splatting
这篇博客提供了3D gaussian splatting在新安装Ubuntu上的配置过程。 1.拉仓库 2.安装显卡驱动和cuda版本 3.安装Pytorch 4.安装Pycharm和配置Python 5.安装附加依赖项(方法一) 6.安装Anaconda(方法二) 7.测试 1.拉仓库 # HT…...
【Python知识】python基础-关于异常处理
python的异常处理知识 概览基本用法自定义异常捕获特定异常信息 异常抛出 概览 在Python中,异常处理是通过try、except和finally等关键字来实现的。这些关键字允许你捕获和处理在程序运行时可能出现的错误和异常情况,从而避免程序崩溃,并允许…...
golang 使用gzip对json例子
package main import ( "bytes" "compress/gzip" "encoding/json" "fmt" "io" "log" ) // User 结构体定义 type User struct { ID int json:"id" Name string json:"name" Age in…...
qt-C++笔记之自定义类继承自 `QObject` 与 `QWidget` 及开发方式详解
qt-C笔记之自定义类继承自 QObject 与 QWidget 及开发方式详解 code review! 参考笔记 1.qt-C笔记之父类窗口、父类控件、对象树的关系 2.qt-C笔记之继承自 QWidget和继承自QObject 并通过 getWidget() 显示窗口或控件时的区别和原理 3.qt-C笔记之自定义类继承自 QObject 与 QW…...
利用git上传项目到GitHub
GitHub是基于git实现的代码托管。git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好。 GitHub可以免费使用,并且快速稳定。 利用GitHub,你可以将项目存档,与其他人分享交流,并让其他开发者帮助你一…...
机器学习预处理-表格数据的空值处理
机器学习预处理-表格数据的空值处理 机器学习预处理-表格数据的分析与可视化中详细介绍了表格数据的python可视化,可视化能够帮助我们了解数据的构成和分布,是我们进行机器学习的必备步骤。上文中也提及,原始的数据存在部分的缺失࿰…...
python学opencv|读取图像(十二)BGR图像转HSV图像
【1】引言 前述已经学习了opencv中图像BGR相关知识,文章链接包括且不限于下述: python学opencv|读取图像(六)读取图像像素RGB值_opencv读取灰度图-CSDN博客 python学opencv|读取图像(七)抓取像素数据顺利…...
【C语言】库函数常见的陷阱与缺陷(六):输入输出函数
目录 一、printf 函数 1.1. 功能与用法 1.2. 陷阱与缺陷 1.3. 安全使用建议 1.4. 代码示例 二、scanf 函数 2.1. 功能与用法 2.2. 陷阱与缺陷 2.3. 安全使用建议 2.4. 代码示例 三、gets 函数 3.1. 功能与用法 3.2. 陷阱与缺陷 3.3. 安全使用建议 3.4. 代码示例…...
sunset: midnight
https://www.vulnhub.com/entry/sunset-midnight,517/ 主机发现端口扫描 探测存活主机,8是靶机 nmap -sP 192.168.56.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-05 16:49 CST Nmap scan report for 192.168.56.1 …...
CSS Backgrounds(背景)
CSS Backgrounds(背景) Introduction(介绍) CSS backgrounds play a crucial role in web design, allowing developers to apply colors, images, and other decorative elements to the background of HTML elements. This enhances the visual appeal of web pages and he…...
D101【python 接口自动化学习】- pytest进阶之fixture用法
day101 pytest的fixture执行顺序 学习日期:20241218 学习目标:pytest基础用法 -- pytest的fixture执行顺序 学习笔记: fixtrue的作用范围 实战结果 import pytestpytest.fixture(scopesession) def test_session():print(我是 session f…...
HCIA-Access V2.5_4_1_1路由协议基础_IP路由表
大型网络的拓扑结构一般会比较复杂,不同的部门,或者总部和分支可能处在不同的网络中,此时就需要使用路由器来连接不同的网络,实现网络之间的数据转发。 本章将介绍路由协议的基础知识、路由表的分类、静态路由基础与配置、VLAN间…...
Meta重磅发布Llama 3.3 70B:开源AI模型的新里程碑
在人工智能领域,Meta的最新动作再次引起了全球的关注。今天,我们见证了Meta发布的Llama 3.3 70B模型,这是一个开源的人工智能模型,它不仅令人印象深刻,而且在性能上达到了一个新的高度。 一,技术突破&#…...
20241218_segmentation
参考: 使用SA模型 https://ai.meta.com/research/publications/segment-anything/讲解生物学意义 https://www.nature.com/articles/s41593-024-01714-3#Sec13 x.0 workflow 图像分割方法识别出重要的ROI区域计算ROI区域个数(需要计算机算法ÿ…...
公链常用的共识算法
1. 工作量证明(Proof of Work, PoW) 工作原理:要求节点(矿工)解决一个数学难题,这个过程称为挖矿。第一个解决难题的矿工将有权添加一个新的区块到区块链上,并获得一定数量的加密货币作为奖励。…...
监控易在汽车制造行业信息化运维中的应用案例
引言 随着汽车制造行业的数字化转型不断深入,信息化类IT软硬件设备的运行状态监控、故障告警、报表报告以及网络运行状态监控等成为了企业运维管理的关键环节。监控易作为一款全面、高效的信息化运维管理工具,在汽车制造行业中发挥着重要作用。本文将结合…...
Spring Boot项目使用虚拟线程
Spring Boot项目启用虚拟线程 开始基本使用先写一个测试方法通过springboot配置项开启虚拟线程 目前存在的问题 开始 虚拟线程正式发布是在JDK21,对于Spring Boot版本选择3以上。 基本使用 关于虚拟线程本身的使用,之前已经介绍过。这里要说的是直接将…...
Deveco Studio首次编译项目初始化失败
编译项目失败 Ohpm install失败的时候重新使用管理者打开程序 build init 初始化失败遇到了以下报错信息 Installing pnpm8.13.1... npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/pnpm failed, r…...
Unity 开发Apple Vision Pro空间锚点应用Spatial Anchor
空间锚点具有多方面的作用 虚拟物体定位与固定: 位置保持:可以把虚拟物体固定在现实世界中的特定区域或位置。即使使用者退出程序后再次打开,之前锚定过的虚拟物体仍然能够出现在之前所锚定的位置,为用户提供连贯的体验。比如在一…...
由学习率跟batch size 关系 引起的海塞矩阵和梯度计算在训练过程中的应用思考
最近看到了个一个学习率跟batch size 关系的帖子,里面说 OpenAI的《An Empirical *** Training》 通过损失函数的二阶近似分析SGD的最优学习率,得出“学习率随着Batch Size的增加而单调递增但有上界”的结论。推导过程中将学习率作为待优化参数纳入损失函…...
PHP开发日志 ━━ 基础知识:四种不同的变量返回方式该如何调用
最近在给框架升级,其中涉及到古早的缓存系统升级,现在准备区分类型为混合、变量和普通文件,那么变量用什么形式存储到缓存才能给后续开发带来便利和通用性呢?于是就涉及到了本文的php基础知识。 好吧,又是一个无用的知…...
centos上配置yum源
1. 进入yum源repo的目录 cd /etc/yum.repos.d/然后可以通过ls查看下面所有的后缀为.repo的文件 2. 新建一个备份目录,将原有的.repo文件放到其中 mkdir yum.repos.d.backup mv *.repo yum.repos.d.backup/3. 获取阿里提供的repo配置文件 这里使用到了wget命令&a…...
Web3 时代:技术变革与未来展望
Web3作为下一代互联网技术,正在逐步改变我们使用互联网的方式。它的核心特点是去中心化,利用区块链技术,使得数据不再集中存储,用户能更好地掌控自己的信息。本文将简要介绍Web3的核心技术及其未来展望。 Web3代表的是去中心化的互…...
小程序快速实现大模型聊天机器人
需求分析: 基于大模型,打造一个聊天机器人;使用开放API快速搭建,例如:讯飞星火;先实现UI展示,在接入API。 最终实现效果如下: 一.聊天机器人UI部分 1. 创建微信小程序,…...
用shell脚本来判断web服务是否运行(端口和进程两种方式)
判断web服务是否运行(1、查看进程的方式判断该程序是否运行,2、通过查看端口的方式判断该程序是否运行),如果没有运行,则启动该服务并配置防火墙规则。------这里以nginx为例 一、用进程方式判断 (1&#…...
Android运行低版本项目可能遇到的问题
Android运行低版本项目可能遇到的问题 低版本项目总是遇到各种问题的,耐心点 一、gradle-xxx.xxx.xxx.zip一直下载不下来 在gradle-wrapper.properties可以试下 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists zipStoreBaseGRADLE_USER_HOME …...
SQL Server 解决游标性能问题的替代方案
在 SQL Server 中,游标(Cursor)是一种用于逐行处理数据集的强大工具,但在某些情况下,它们可能会导致性能问题,尤其是在处理大量数据时。为了提高性能和可维护性,可以考虑使用其他替代方案。以下…...
【论文笔记】CLIP-guided Prototype Modulating for Few-shot Action Recognition
🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: CLIP-guided Prototype Mo…...
PHP:从入门到进阶的全方位探索
PHP(Hypertext Preprocessor)作为一种开源的服务器端脚本语言,自1995年问世以来,凭借其简单易学、高效灵活的特点,迅速成为了Web开发领域的中流砥柱。无论是构建动态网页、开发Web应用程序,还是处理复杂的服…...
vue复习
1.试述前端开发技术发展变化历程,理解推动技术发展动力以及对软件开发职业的启发。 2.当前前端开发技术主要特征有哪些? 前后端分离开发: 前端专注页面展示效果与用户使用体验,后端专注为前端提供数据和服务。 工程化特征:模块…...
伊克罗德与九科信息共同发布RPA+AI智能机器人解决方案
12月12日,伊克罗德信息在上海举办“创见AI,迈进智能化未来——科技赋能零售电商”活动,与九科信息、亚马逊云科技共同探讨与分享,融合生成式AI技术和智能自动化(RPA,Robotic Process Automation)在电商零售…...
nano编辑器的使用
nano 是一个非常简单易用的命令行文本编辑器,它常用于在 Linux 或类 Unix 系统中快速编辑文件,特别适用于需要修改配置文件或快速编辑文本的场景。以下是一些常见的 nano 使用技巧和基本操作。 1. 打开文件 要使用 nano 编辑文件,打开终端并…...
灵当crm pdf.php存在任意文件读取漏洞
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...
Liinux下VMware Workstation Pro的安装,建议安装最新版本17.61
建议安装最新版本17.61,否则可能有兼容性问题 下载VMware Workstation安装软件 从官网网站下载 https://support.broadcom.com/group/ecx/productdownloads?subfamilyVMwareWorkstationPro 选择所需版本 现在最新版本是17.61,否则可能有兼容性问题…...
性能测试度量指标学习笔记
目录 一、概要 二、不同系统软件性能测试度量指标 三、性能测试度量指标 1、响应时间 2、用户数 3、系统处理能力 4、错误率 5、成功率 6、资源占用率 7、CPU利用率 8、内存页交换速率 9、内存占用率 10、磁盘IO 11、磁盘吞吐量 12、网络吞吐量 13、系统稳定性…...
一款可以替代Navicat的数据库管理工具
Navicat是一款非常受欢迎的数据库管理工具,基本支持市面上的所有数据库、而且支持跨平台。 可以说Navicat是一款功能强大、非常全面的数据库管理工具,提供了多种版本和定价方案,以满足不同用户的需求和预算。 也是很多企业的首选工具&#…...
使用C#在目录层次结构中搜索文件以查找目标字符串
例程以递归方式搜索目录层次结构中的文件以查找目标字符串。它可以搜索几乎任何类型的文件,即使它不包含 Windows 理解的文本。例如,它可以搜索 DLL 和可执行文件以查看它们是否恰好包含字符串。 下面的代码中显示的ListFiles 方法完成了大部分工作。 …...
C++设计模式
C设计模式 什么是 C 设计模式?设计模式的用途设计模式的核心原则设计模式的分类 1. 创建型设计模式1.1 单例模式(Singleton Pattern)1.2 工厂方法模式(Factory Method Pattern)1.3 抽象工厂模式(Abstract F…...
LM芯片学习
1、LM7805稳压器 https://zhuanlan.zhihu.com/p/626577102?utm_campaignshareopn&utm_mediumsocial&utm_psn1852815231102873600&utm_sourcewechat_sessionhttps://zhuanlan.zhihu.com/p/626577102?utm_campaignshareopn&utm_mediumsocial&utm_psn18528…...
使用 MyBatis-Plus Wrapper 构建自定义 SQL 查询
前言 MyBatis-Plus (MP) 是一款基于 MyBatis 的增强工具,它简化了数据库操作,提供了诸如自动分页、条件构造器等功能,极大地提高了开发效率。其中,Wrapper 条件构造器是 MP 的核心功能之一,它允许开发者以链式调用的方…...
C# OpenCvSharp DNN 实现百度网盘AI大赛-表格检测第2名方案第一部分-表格边界框检测
目录 说明 效果 模型 项目 代码 frmMain.cs YoloDet.cs 参考 下载 其他 说明 百度网盘AI大赛-表格检测的第2名方案。 该算法包含表格边界框检测、表格分割和表格方向识别三个部分,首先,ppyoloe-plus-x 对边界框进行预测,并对置信…...
手分割数据集labelme格式505张1类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):505 标注数量(json文件个数):505 标注类别数:1 标注类别名称:["hands"] 每个类别标注的框数…...
2012年西部数学奥林匹克试题(几何)
2012/G1 △ A B C \triangle ABC △ABC 内有一点 P P P, P P P 在 A B AB AB, A C AC AC 上的投影分别为 E E E, F F F, 射线 B P BP BP, C P CP CP 分别交 △ A B C \triangle ABC △ABC 的外接圆于点 M M M, N N N. r r r 为 △ A B C \triangle ABC △ABC 的内…...
GB28181系列三:GB28181流媒体服务器ZLMediaKit
我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、ZLMediaKit介绍 二、 ZLMediaKit安装、运行(Ubuntu) 1、安装 2、运行 3、配置 三、ZLMediaKit使用 一、ZLMediaKit介绍 ZLMediaKit是一个基于C11的高性能运营级流媒体服务框架,项目地址…...
【微服务】SpringBoot 整合Redis Stack 构建本地向量数据库相似性查询
目录 一、前言 二、向量数据库介绍 2.1 什么是向量数据库 2.2 向量数据库特点 2.3 向量数据库使用场景 三、常用的向量数据库解决方案 3.1 Milvus 3.1.1 Milvus是什么 3.1.2 Milvus主要特点 3.2 Faiss 3.2.1 Faiss是什么 3.2.2 Faiss主要特点 3.3 Pinecone 3.3.1 …...
神州数码DCME-320 online_list.php存在任意文件读取漏洞
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...