深度报道 第1个从太空发回的LoRa信号(含视频)

部署运行你感兴趣的模型镜像

1 前言

本文作者 IoT小能手 twowinter,转载请联系微信公众号 twowinter。

这是一篇关于全球首个从太空发回LoRa信号的深度报道,你可能已经在一些渠道里得知了这个令人无比兴奋的消息。但在这篇报道里你会获得一些更深入,与技术更相关的细节。

在今年1月底的时候本能手就知道有大事发生,The Things Network (TTN) 的小伙伴给我发了一张会议邀请,他们 计划召开第一次开发者大会,邀请全球的LoRa开发者参加。其中最让人最振奋的分享莫过于这个,“Using gateways on satelites to connect your existing LoRaWAN devices anywhere in the world(使用卫星基站连接全球任意位置的LoRaWAN设备)”,真TM吊炸天。

2 TTN大会

The Things Network (TTN)这两年的发展非常迅速。两年前由 Wienke Giezeman 和 Johan Stokking 成立,那时候他们刚刚用 LoRaWAN 网络覆盖了荷兰阿姆斯特丹,并且开源了 LoRaWAN 技术的软硬件,在 kickstarter 一下就众筹了 30 多万欧元,同时也吸引了全球物联网的注意。作为 LoRa 联盟董事会成员,TTN 现在已经在全球90多个国家部署了3000多个基站,这个数字还在飞速增长中。TTN一直秉承的 ‘Let’s build this thing together‘ 的开放文化也吸引了超过3万名开发者加入 TTN 社区。

TTN 办这个大会本能手是强烈支持的,现在是个互联网公司都要搞个开发者大会,谷歌苹果亚马逊,国内的BAT甚至于讯飞等等,而与物联网相关的则都未见到,TTN 的这个会议是一个真正属于物联网的大会。

本能手立马查了中国飞阿姆斯特丹的机票,卧槽5000多软妹币。不过作为与比尔盖茨一起平均净资产高达900亿美元的IoT界著名KOL ,这点机票钱自然不放在眼里。不巧的是,支付宝来找我谈一个5个亿的项目,那个项目后来传的很开,估计现在不少人都知道了。本能手于是留在了国内,通过互联网与荷兰的小伙伴一起参与了这次盛会。

3 LoRa 之父 Nicolas

大会现场来了600多名开发者,大家都见到了 Semtech 的 Nicolas Sornin 本尊,就是我们顶礼膜拜的 LoRa 之父,原本活跃在 LoRaWAN 协议封面的一个名字,突然变成了一个英姿飒爽、谦卑有礼的活人,让本能手多了一些兴奋。

Nicolas 通过 keynote 分享了 LoRa 及 LoRaWAN 的下一步计划,其中的“In-device sensor data processing …”甚是惹眼,能这样那便更省成本了。

大会现场有很多开发者带来的有意思的东西,比如这个 LoRaWAN 水位监测传感器。

4 Lacuna Space 的卫星物联网计划

当然大会的重头戏是 Lacuna Space 的 CTO Thomas Telkamp 带来的’卫星物联网’的分享。

Thomas 详细介绍了 Lacuna Space 的计划,他们想通过卫星来拓展 LoRaWAN 网络,实现全球范围内的网络覆盖。

We will be using a constellation of polar orbiting low-earth orbiting satellites to receive LoRa-based messages from sensors on the ground.  At about 500km above the ground, they circle over the poles of the earth every 100 minutes and as the earth revolves below them, they cover the whole globe.

按计划,将会建成一个极地轨道低轨卫星星座,位于地球上空 500 公里高度。这些卫星每100分钟会越过地球两极,绕地球一圈,以此来实现全球网络覆盖。卫星接受地面设备的 LoRa 数据消息,并且缓存一段时间,等经过地面基站时再传送给地面基站,最后地面基站再转发给云服务器。

这是整个分享最关键的一张 keynote,读者朋友们注意收藏。

5 LoRa卫星回传演示

激动人心的是现场 LoRa 卫星回传的演示,为此 TTN 与 Lacuna 在大会期间从 Space Norway, Norwegian 航天中心那边借来了 Norsat-2 卫星,也就是一颗短期的 TTNSat-1 卫星。当这颗卫星从会议室上空飞过时,从卫星上发 LoRa 消息下来。在会议大楼以及荷兰台夫特理工大学的屋顶上都使用 Semtech 标准芯片搭建了接收节点,一旦卫星经过,会立马传回消息,再通过现场布置的一台60年高龄的电报机打出消息。

Throughout the conference, we borrowed the Norsat-2 satellite, thanks to our friends at Space Norway, Norwegian Space Centre, and ESA, and for a short period TTNSat-1 was born!  From this satellite we transmitted a LoRa-based message as the satellite passed over the conference.  We located receivers based on the standard Semtech chip on the roof of the conference building and also the TU Delft, and each time the satellite came into view, we printed it out on a 60-year old telex machine  (see picture below and in action here).

下图便是演示现场。

大屏幕上展示 Norsat-2 的实时位置,屏幕右边则是那台60年高龄的电报机。给电报机来个特写,向传统技术致敬。

全场一起喊着倒计时,期待着卫星经过阿姆斯特丹上空。如图,还剩1分半钟。

当电报机终于滴滴嗒嗒开动时,全场沸腾了!

现在奉上现场视频,只有18秒,不要怕流量,大家感受下。

从低轨卫星回传的LoRa信号现场

后排的朋友们,电报机上的文字看得到吗?

chirp, chirp, chirp
hello from space.
thanks to esa, space norway, norwegian space centre, and semtech
ttnsat calling here 
let's build this thing together
the secret code is xxxxxx
goodbye

TMD这仪式感不要太强,阿姆斯特朗上月球都没你们这么煽情。坚强如本能手,被女儿抢走圆筒冰淇淋也不哭的我,居然掉下了泪水。

6 现场 LoRa 信号捕捉

Thomas 也提前公布 LoRa 通讯的相关配置信息,让开发者们一起捕捉这历史性的一刻。

Center frequency: 161.862500Mhz
Bandwidth: 125kHz
Sync word: 0x12
Spreading: SF11
Low Data Rate Optimize: on
Header: on
Coding Rate: 4/8 (this is in the header, no need to configure)
IQ inverted

可见,TTNSat-1 是在 161.8625 MHz 的中心频点上传输消息,为了与公共 LoRaWAN 网络区分,使用了 0x12 的私有协议同步字,扩频因子只调到了SF11,但编码率开到了最大的4/8。

为什么中心频点和扩频因子没调到更合适的参数呢,本能手猜测应该是受限于卫星硬件。

现场也有大神如愿捕捉了 LoRa 信号,这是捕捉的视频,可以清楚地看到 LoRa 可在噪声水平下传输。

从NORSAT2卫星回传的LoRa信号捕捉

7 国内情况

在为国外先驱者的技术实力和高效执行力而惊叹赞赏时,我也搜集了下国内 LoRa 卫星物联网的发展情况,发现国内的LoRa卫星技术也在蓬勃发展中。

LoRa联盟成员厦门四信与天基物联网运营服务商深圳天佑卫星在2017年就有所动作,实现了地质、林业、电力等多个远郊区域的LoRa+卫星通信解决方案,有意思的是还实现了对大熊猫的卫星定位监控。

远郊区域,常常无运营商网络,通过在大熊猫脖圈中嵌入LoRa模块,利用长距离LoRa技术可覆盖20多公里半径的传输特性,与地面卫星中继终端通信,再通过海事卫星系统返回到地面服务器,以实现对该区域内的大熊猫位置的监控。

不过这些项目还不是通过LoRa调制直接与卫星通信,据报道,天佑计划与厦门四信继续合作,携合作伙伴通过发射一枚6U立方星进行LoRa载荷试验,如果验证成功就可以逐步实现基于LoRa传输的低轨物联网星座。

被Lacuna捷足先登的还有另一家国内卫星创业公司九天微星,今年2月刚完成亿元A轮融资,同时也发射了自己的第一颗卫星“少年星一号”,是首颗教育共享卫星,将为中小学生提供测控真实卫星的体验。九天微星曾在2017年10月与中兴CLAA签署战略协议,共建共享基于LoRa技术的卫星物联网。根据此前的报道,九天微星将在2020年底前部署完成72颗低轨卫星,建成商用低轨物联网星座系统,其中应该就包含LoRa载荷试验性卫星。

8 小结

回顾这个事件里,我们能感受到,LoRa技术的开放性确实让整个LoRa生态特别具有活力,各种有意思的应用层出不穷。在记录这篇文章期间,我也看到了 Sigfox 的伙伴在朋友圈里发了一些消息,也在酝酿着在卫星上有所动作。期待国内LoRa物联网同仁们以及其他物联网技术也能顺利征服浩瀚星辰。

最后还是祝贺下 Lacuna Space、The Things Network 以及 Semtech 等,打心里为他们感到高兴,祝贺他们获得如此具有里程碑意义的成就。感谢他们告诉了我们未来卫星物联网的可能性。


作者其他精彩文章:


您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

import os import torch import transformers from transformers import ( AutoModelForCausalLM, AutoTokenizer, TrainingArguments, DataCollatorForLanguageModeling, BitsAndBytesConfig, Trainer ) from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training from datasets import load_dataset import logging import psutil import gc from datetime import datetime # === 配置区域 === MODEL_NAME = "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/models/Yi-6B" DATASET_PATH = "./data/train_lora_formatted.jsonl" OUTPUT_DIR = "./yi6b-lora-optimized" DEVICE_MAP = "auto" # 使用自动设备映射 # 确保输出目录存在 os.makedirs(OUTPUT_DIR, exist_ok=True) # === 内存优化配置 === os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True" # 减少内存碎片 torch.backends.cuda.cufft_plan_cache.clear() # 清理CUDA缓存 # === 增强的日志系统 === def setup_logging(output_dir): """配置日志系统,支持文件和TensorBoard""" logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # 文件日志处理器 file_handler = logging.FileHandler(os.path.join(output_dir, "training.log")) file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) logger.addHandler(file_handler) # 控制台日志处理器 console_handler = logging.StreamHandler() console_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')) logger.addHandler(console_handler) # TensorBoard日志目录 tensorboard_log_dir = os.path.join(output_dir, "logs", datetime.now().strftime("%Y%m%d-%H%M%S")) os.makedirs(tensorboard_log_dir, exist_ok=True) # 安装TensorBoard回调 tb_writer = None try: from torch.utils.tensorboard import SummaryWriter tb_writer = SummaryWriter(log_dir=tensorboard_log_dir) logger.info(f"TensorBoard日志目录: {tensorboard_log_dir}") except ImportError: logger.warning("TensorBoard未安装,可视化功能不可用") return logger, tb_writer logger, tb_writer = setup_logging(OUTPUT_DIR) # === 量化配置 - 使用更高效的配置 === quant_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_use_double_quant=True, ) # === 加载模型 === logger.info("加载预训练模型...") model = AutoModelForCausalLM.from_pretrained( MODEL_NAME, device_map=DEVICE_MAP, quantization_config=quant_config, torch_dtype=torch.bfloat16, trust_remote_code=True, attn_implementation="flash_attention_2" # 使用FlashAttention优化内存 ) # === 分词器处理 === logger.info("加载分词器...") tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, trust_remote_code=True) tokenizer.padding_side = "right" if tokenizer.pad_token is None: tokenizer.pad_token = tokenizer.eos_token tokenizer.pad_token_id = tokenizer.eos_token_id # === 准备模型训练 === model = prepare_model_for_kbit_training( model, use_gradient_checkpointing=True # 启用梯度检查点以节省内存 ) # === LoRA 配置 - 优化内存使用 === logger.info("配置LoRA...") lora_config = LoraConfig( r=64, # 降低rank以减少内存使用 lora_alpha=32, # 降低alpha值 target_modules=["q_proj", "v_proj"], # 减少目标模块 lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) model = get_peft_model(model, lora_config) # 记录可训练参数 trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad) total_params = sum(p.numel() for p in model.parameters()) logger.info(f"可训练参数: {trainable_params:,} / 总参数: {total_params:,} ({trainable_params / total_params:.2%})") # === 加载并预处理数据集 === logger.info("加载和预处理数据集...") dataset = load_dataset("json", data_files=DATASET_PATH, split="train") # 文本过滤函数 def is_valid_text(example): text = example.get("text", "") return text is not None and len(text.strip()) > 200 # 增加最小长度要求 dataset = dataset.filter(is_valid_text) logger.info(f"过滤后数据集大小: {len(dataset)} 条") # 动态填充的分词函数 - 节省内存 def tokenize_function(examples): tokenized = tokenizer( examples["text"], padding=True, # 使用动态填充 truncation=True, max_length=1024, # 降低上下文长度以减少内存使用 ) # 创建 labels - 因果语言建模需要 labels = input_ids tokenized["labels"] = tokenized["input_ids"].copy() return tokenized tokenized_dataset = dataset.map( tokenize_function, batched=True, remove_columns=["text"], batch_size=64, # 降低批处理大小以减少内存峰值 num_proc=4, # 减少进程数以降低内存开销 ) # === 数据整理器 === data_collator = DataCollatorForLanguageModeling( tokenizer=tokenizer, mlm=False # 因果语言建模 ) # === 训练参数 - 优化内存使用 === report_to_list = ["tensorboard"] if tb_writer else [] training_args = TrainingArguments( output_dir=OUTPUT_DIR, per_device_train_batch_size=4, # 大幅降低批次大小 gradient_accumulation_steps=4, # 增加梯度累积步数以保持有效批次大小 learning_rate=2e-5, num_train_epochs=3, logging_steps=50, save_strategy="steps", save_steps=500, bf16=True, optim="paged_adamw_32bit", report_to=report_to_list, warmup_ratio=0.05, gradient_checkpointing=True, # 启用梯度检查点 fp16=False, max_grad_norm=0.3, # 降低梯度裁剪阈值 remove_unused_columns=True, # 移除未使用的列以节省内存 dataloader_num_workers=4, # 减少数据加载工作线程 evaluation_strategy="steps", eval_steps=500, save_total_limit=2, # 减少保存的检查点数量 logging_dir=os.path.join(OUTPUT_DIR, "logs"), load_best_model_at_end=True, ddp_find_unused_parameters=False, logging_first_step=True, group_by_length=True, lr_scheduler_type="cosine", weight_decay=0.01, ) # === GPU监控工具 === def monitor_gpu(): """监控GPU使用情况""" if torch.cuda.is_available(): device = torch.device("cuda") mem_alloc = torch.cuda.memory_allocated(device) / 1024 ** 3 mem_reserved = torch.cuda.memory_reserved(device) / 1024 ** 3 mem_total = torch.cuda.get_device_properties(device).total_memory / 1024 ** 3 return { "allocated": f"{mem_alloc:.2f} GB", "reserved": f"{mem_reserved:.2f} GB", "total": f"{mem_total:.2f} GB", "utilization": f"{mem_alloc / mem_total * 100:.1f}%" } return {} # === 创建训练器 === eval_dataset = None if len(tokenized_dataset) > 100: eval_dataset = tokenized_dataset.select(range(100)) trainer = Trainer( model=model, tokenizer=tokenizer, args=training_args, train_dataset=tokenized_dataset, eval_dataset=eval_dataset, data_collator=data_collator, ) # === 训练前验证 === def validate_data_and_model(): """验证数据和模型是否准备好训练""" logger.info("\n=== 训练前验证 ===") # 检查样本格式 sample = tokenized_dataset[0] logger.info(f"样本键: {list(sample.keys())}") logger.info(f"input_ids 长度: {len(sample['input_ids'])}") # 创建单个样本测试批次 test_batch = data_collator([sample]) # 移动数据到设备 test_batch = {k: v.to(model.device) for k, v in test_batch.items()} # 前向传播测试 model.train() outputs = model(**test_batch) loss_value = outputs.loss.item() logger.info(f"测试批次损失: {loss_value:.4f}") # 记录到TensorBoard if tb_writer: tb_writer.add_scalar("debug/test_loss", loss_value, 0) # 反向传播测试 outputs.loss.backward() logger.info("反向传播成功!") # 重置梯度 model.zero_grad() logger.info("验证完成,准备开始训练\n") # 记录初始GPU使用情况 gpu_status = monitor_gpu() logger.info(f"初始GPU状态: {gpu_status}") # 记录到TensorBoard if tb_writer: tb_writer.add_text("system/initial_gpu", str(gpu_status), 0) validate_data_and_model() # === 自定义回调 - 监控资源使用 === class ResourceMonitorCallback(transformers.TrainerCallback): def __init__(self, tb_writer=None): self.tb_writer = tb_writer self.start_time = datetime.now() self.last_log_time = datetime.now() def on_step_end(self, args, state, control, **kwargs): current_time = datetime.now() time_diff = (current_time - self.last_log_time).total_seconds() # 每分钟记录一次资源使用情况 if time_diff > 60: self.last_log_time = current_time # GPU监控 gpu_status = monitor_gpu() logger.info(f"Step {state.global_step} - GPU状态: {gpu_status}") # CPU和内存监控 cpu_percent = psutil.cpu_percent() mem = psutil.virtual_memory() logger.info( f"CPU使用率: {cpu_percent}%, 内存使用: {mem.used / 1024 ** 3:.2f}GB/{mem.total / 1024 ** 3:.2f}GB") # 记录到TensorBoard if self.tb_writer: # GPU显存使用 if torch.cuda.is_available(): device = torch.device("cuda") mem_alloc = torch.cuda.memory_allocated(device) / 1024 ** 3 self.tb_writer.add_scalar("system/gpu_mem", mem_alloc, state.global_step) # CPU使用率 self.tb_writer.add_scalar("system/cpu_usage", cpu_percent, state.global_step) # 系统内存使用 self.tb_writer.add_scalar("system/ram_usage", mem.used / 1024 ** 3, state.global_step) def on_log(self, args, state, control, logs=None, **kwargs): """记录训练指标到TensorBoard""" if self.tb_writer and logs is not None: for metric_name, metric_value in logs.items(): if "loss" in metric_name or "lr" in metric_name or "grad_norm" in metric_name: self.tb_writer.add_scalar(f"train/{metric_name}", metric_value, state.global_step) def on_train_end(self, args, state, control, **kwargs): """训练结束时记录总时间""" training_time = datetime.now() - self.start_time logger.info(f"训练总时间: {training_time}") if self.tb_writer: self.tb_writer.add_text("system/total_time", str(training_time)) # 添加回调 trainer.add_callback(ResourceMonitorCallback(tb_writer=tb_writer)) # === 内存清理函数 === def clear_memory(): """清理内存和GPU缓存""" gc.collect() if torch.cuda.is_available(): torch.cuda.empty_cache() torch.cuda.ipc_collect() logger.info("内存清理完成") # === 启动训练 === try: logger.info("开始训练...") # 分阶段训练以减少内存峰值 num_samples = len(tokenized_dataset) chunk_size = 1000 # 每次处理1000个样本 for i in range(0, num_samples, chunk_size): end_idx = min(i + chunk_size, num_samples) logger.info(f"训练样本 {i} 到 {end_idx - 1} / {num_samples}") # 创建子数据集 chunk_dataset = tokenized_dataset.select(range(i, end_idx)) # 更新训练器 trainer.train_dataset = chunk_dataset # 训练当前块 trainer.train() # 清理内存 clear_memory() # 保存训练指标 metrics = trainer.evaluate() trainer.log_metrics("train", metrics) trainer.save_metrics("train", metrics) # 保存最佳模型 trainer.save_model(OUTPUT_DIR) tokenizer.save_pretrained(OUTPUT_DIR) logger.info(f"训练完成! 模型保存在: {OUTPUT_DIR}") # 记录最终指标到TensorBoard if tb_writer: for metric_name, metric_value in metrics.items(): tb_writer.add_scalar(f"final/{metric_name}", metric_value) tb_writer.close() except Exception as e: logger.error(f"训练出错: {e}") import traceback logger.error(traceback.format_exc()) # 尝试更小批量训练 logger.info("\n尝试更小批量训练...") small_dataset = tokenized_dataset.select(range(50)) trainer.train_dataset = small_dataset trainer.train() # 保存模型 trainer.save_model(f"{OUTPUT_DIR}_small") tokenizer.save_pretrained(f"{OUTPUT_DIR}_small") logger.info(f"小批量训练完成! 模型保存在: {OUTPUT_DIR}_small") # 记录错误到TensorBoard if tb_writer: tb_writer.add_text("error/exception", traceback.format_exc()) # 清理内存 clear_memory() # === 训练后验证 === def validate_final_model(): """验证训练后的模型""" logger.info("\n=== 训练后验证 ===") # 加载保存的模型 from peft import PeftModel # 仅加载基础模型配置 base_model = AutoModelForCausalLM.from_pretrained( MODEL_NAME, device_map=DEVICE_MAP, quantization_config=quant_config, torch_dtype=torch.bfloat16, trust_remote_code=True, load_in_4bit=True ) # 加载LoRA适配器 peft_model = PeftModel.from_pretrained(base_model, OUTPUT_DIR) # 不再合并LoRA权重,直接使用 peft_model 推理 peft_model.eval() # 测试生成 prompt = "中国的首都是" inputs = tokenizer(prompt, return_tensors="pt").to(peft_model.device) outputs = peft_model.generate( **inputs, max_new_tokens=50, # 减少生成长度 temperature=0.7, top_p=0.9, repetition_penalty=1.2, do_sample=True ) generated = tokenizer.decode(outputs[0], skip_special_tokens=True) logger.info(f"提示: {prompt}") logger.info(f"生成结果: {generated}") # 记录到TensorBoard if tb_writer: tb_writer.add_text("validation/sample", f"提示: {prompt}\n生成: {generated}") # 更全面的测试 test_prompts = [ "人工智能的未来发展趋势是", "如何学习深度学习?", "写一个关于太空探索的短故事:" ] for i, test_prompt in enumerate(test_prompts): inputs = tokenizer(test_prompt, return_tensors="pt").to(peft_model.device) outputs = peft_model.generate( **inputs, max_new_tokens=100, # 减少生成长度 temperature=0.7, top_p=0.9, repetition_penalty=1.2, do_sample=True ) generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True) logger.info(f"\n提示: {test_prompt}\n生成: {generated_text}\n{'=' * 50}") # 记录到TensorBoard if tb_writer: tb_writer.add_text(f"validation/test_{i}", f"提示: {test_prompt}\n生成: {generated_text}") logger.info("验证完成") # 执行验证 validate_final_model() # 关闭TensorBoard写入器 if tb_writer: tb_writer.close() logger.info("TensorBoard日志已关闭") 2025-07-13 22:58:30,094 - INFO - 训练完成! 模型保存在: ./yi6b-lora-optimized 2025-07-13 22:58:30,351 - INFO - 内存清理完成 2025-07-13 22:58:30,351 - INFO - === 训练后验证 === Loading checkpoint shards: 100%|█████████████████████████████████████████████| 2/2 [00:34<00:00, 17.33s/it] /home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/peft/tuners/lora/bnb.py:213: UserWarning: Merge lora module to 4-bit linear may get different generations due to rounding errors. warnings.warn( Traceback (most recent call last): File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/train_lora.py", line 477, in <module> validate_final_model() File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/train_lora.py", line 432, in validate_final_model outputs = merged_model.generate( ^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/torch/utils/_contextlib.py", line 116, in decorate_context return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/transformers/generation/utils.py", line 1520, in generate return self.sample( ^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/transformers/generation/utils.py", line 2617, in sample outputs = self( ^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1751, in _wrapped_call_impl return self._call_impl(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1762, in _call_impl return forward_call(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/accelerate/hooks.py", line 164, in new_forward output = module._old_forward(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/transformers/models/llama/modeling_llama.py", line 1183, in forward outputs = self.model( ^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1751, in _wrapped_call_impl return self._call_impl(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1762, in _call_impl return forward_call(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/accelerate/hooks.py", line 164, in new_forward output = module._old_forward(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/transformers/models/llama/modeling_llama.py", line 1070, in forward layer_outputs = decoder_layer( ^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1751, in _wrapped_call_impl return self._call_impl(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1762, in _call_impl return forward_call(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/accelerate/hooks.py", line 164, in new_forward output = module._old_forward(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/transformers/models/llama/modeling_llama.py", line 798, in forward hidden_states, self_attn_weights, present_key_value = self.self_attn( ^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1751, in _wrapped_call_impl return self._call_impl(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1762, in _call_impl return forward_call(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/accelerate/hooks.py", line 164, in new_forward output = module._old_forward(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/transformers/models/llama/modeling_llama.py", line 694, in forward key_states = self.k_proj(hidden_states) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1751, in _wrapped_call_impl return self._call_impl(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1762, in _call_impl return forward_call(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/bitsandbytes/nn/modules.py", line 490, in forward return bnb.matmul_4bit(x, self.weight.t(), bias=bias, quant_state=self.weight.quant_state).to(inp_dtype) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/bitsandbytes/autograd/_functions.py", line 393, in matmul_4bit return MatMul4Bit.apply(A, B, out, bias, quant_state) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/torch/autograd/function.py", line 575, in apply return super().apply(*args, **kwargs) # type: ignore[misc] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vipuser/ai_writer_project_final_with_fixed_output_ui/.venv/lib/python3.11/site-packages/bitsandbytes/autograd/_functions.py", line 322, in forward output = torch.nn.functional.linear(A, F.dequantize_4bit(B, quant_state).to(A.dtype).t(), bias) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ RuntimeError: mat1 and mat2 shapes cannot be multiplied (3x4096 and 512x4096)
07-15
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值