meta-data 占位符的引用

参考博客:
https://blog.youkuaiyun.com/weixin_30378311/article/details/97071152
https://blog.youkuaiyun.com/tushiba/article/details/96862824
https://android.zhizuobiao.com/android-18091800052/
在上一篇关于关于如何多渠道打包中我们使用了变量${channelName},下面我们讲解关于Android占位符的基本使用。

在这里插入图片描述

  1. 在app的build.gradle中定义manifestPlaceholderskeyval,根据自己需要选择定义位置,例如在defaultConfig或者buildTypes又或者如上文打包中在productFlavors。
    在这里插入图片描述
    下面我们将以defaultConfig定义channelNum为例,展示占位符的基本使用。
    在这里插入图片描述
  2. AndroidManifest.xml中引用变量
    在这里插入图片描述
  3. 生成apk,验证变量值
    在这里插入图片描述
    注意:由于manifestPlaceholders是map类型,所以为了避免值被覆盖最好使用+=否则会被覆盖,引用的时候提示错误
    在这里插入图片描述
### 解决 PyTorch Meta Tensor 的 `NotImplementedError` 错误 当遇到 `NotImplementedError: Cannot copy out of meta tensor; no data!` 这类错误时,通常是因为操作试图访问或复制一个元张量 (meta tensor),而这类张量并不实际持有任何数据[^1]。 #### 原因分析 这种类型的错误经常发生在使用特定设备配置(如多GPU设置中的 "auto" 或者 'meta' 设备)加载模型的时候。如果当前 GPU 中没有足够的内存来分配给新的计算任务,则可能会创建带有 ‘meta’ 设备属性的对象作为占位符,而不是真正的 CUDA 张量[^4]。 #### 解决策略 ##### 方法一:调整资源分配策略 对于由于硬件资源不足引起的问题,可以通过优化现有资源利用效率或者扩展可用资源来进行改进: - **增加 GPU 数量**:如果有更多显卡可供使用,可以尝试将工作负载分布到多个 GPU 上面。 - **提高单个 GPU 内存容量**:确保每个参与运算过程的 GPU 都有足够的剩余空间用于新任务执行。 - **采用低精度量化技术**:例如应用 INT8 量化减少所需存储需求的同时保持性能表现。 ##### 方法二:修改初始化逻辑 针对具体代码片段中提到的情况,在参数初始化函数里指定设备为 `"cuda"` 并禁用了递归行为 (`recurse=False`) 可能导致某些子模块未能正确迁移到目标位置。建议改为如下方式实现相同功能并避免潜在问题发生: ```python param_init_fn = lambda module: ( setattr(module, name, value.to(torch.device("cuda"))) for name, value in module.named_parameters() ) ``` 此版本遍历所有命名参数并将它们逐一转移到指定设备上,从而保证整个网络结构都能被适当地放置于预期环境中运行[^2]。 ##### 方法三:确认对象状态后再进行下一步骤 在涉及跨平台传输的数据交换场景下(比如从 GPU 到 CPU),务必先验证源端是否存在有效内容再继续后续动作。例如,在把 PyTorch 张量转成 Numpy 数组前应该调用 `.cpu()` 方法使其脱离原始所在装置限制[^3]: ```python numpy_array = torch_tensor.cpu().detach().numpy() ``` 以上措施能够帮助定位并修复由 `meta tensor` 所带来的不可实施错误情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值