30天从入门到精通TensorFlow1.x 第五天,跨计算设备执行计算图-cpu

一、接前一天

前天学习了,数据流图,今天尝试在不同设备上(cpu或者gpu)来执行计算图。
本次使用cpu来执行,但是不涉及gpu。gpu放在后面学习,这里比较重要。

二、示例

1. 先看看自己的设备

from tensorflow.python.client import device_lib

print(device_lib.list_local_devices())

可以通过上面代码实现。

在这里插入图片描述
这个代码执行后,只会显示一个cpu,TensorFlow会隐式的将代码分配到各个CPU上,因此默认情况下 CPU:0表示所有CPU都对TensorFlow有效。

2. 内部逻辑

TensorFlow使用多设备执行代码的原理是通过图分割和设备放置实现的。

  1. 首先,通过图分割将计算图中的操作划分为不同的子图,每个子图表示为一个单独的计算设备。然后,通过设备放置将每个子图映射到对应的物理设备上进行计算。这可以通过手动指定设备放置来完成,也可以使用 TensorFlow 的默认设备放置策略(例如,在具有多个 GPU 的系统中将操作分配到可用的 GPU 上)。

  2. 在执行期间,TensorFlow会自动在各个设备之间传输必要的数据,以便完成整个计算过程。这通常包括从 CPUGPU 的输入数据传输、在更快的设备上执行操作并将结果传回到 CPU 等操作。

  3. 使用多设备执行可以加速模型训练和推断,特别是在大规模深度学习任务中。

3. 通过tf.decice()将计算图放在特定的计算设备上

import tensorflow as tf
from tensorflow.python.client import device_lib

print(device_lib.list_local_devices())




tf.reset_default_graph()
'''
代码是用于重置 TensorFlow 计算图中所有变量和状态的函数。它通
常在重新运行模型之前调用,以确保您使用的是新的、干净的计算
图。这可以帮助避免在多次运行模型时出现命名冲突或其他不必要的
错误。

cpu:个数 一般从 0,1,2,3.。。。代表不同设备
'''

with tf.device("/device:cpu:0"):
    # create w and b init 0.0
    w = tf.Variable(0.0, name='weight')
    b = tf.Variable(0.0, name='bias')

    # create input and out
    x = tf.placeholder(dtype=tf.float32, shape=[None])
    out = tf.placeholder(dtype=tf.float32, shape=[None])

    # create loss and opt
    y = w * x + b



loss = tf.reduce_mean(tf.square(y - out))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train_op = optimizer.minimize(loss)

config = tf.ConfigProto()
config.log_device_placement=True

# train model
with tf.Session(config=config) as sess:
    tf.global_variables_initializer().run(session=sess)
    for i in range(100000):
        _, loss_val, w_val, b_val = sess.run(
            [train_op, loss, w, b],
            feed_dict={x: [1, 23, 4, 5, 7, 5, 7], out: [3, 5, 7, 9, 11, 13, 15]}
        ) #注意 输入的数据 形状要一致,避免输出与预测值得形状不一致问题
        if i % 100 == 0:
            print('Step {}: loss = {}, w = {}, b = {}'.format(i, loss_val, w_val, b_val))

在这里插入图片描述

### 二维数组的最大尺寸限制 在编程语言中,二维数组的最大尺寸主要受到以下几个因素的影响: #### 内存容量 程序运行时可用的物理内存和虚拟内存量决定了可以创建多大尺寸的二维数组。如果尝试分配超出系统可提供内存空间大小的数组,则会抛出异常或导致程序崩溃。 #### 编译器/解释器限制 不同的编译器或解释器可能对单个对象(如数组)有特定的最大字节数或其他形式的上限规定。这些约束条件通常由具体使用的开发工具决定[^1]。 #### 数据类型的长度乘积 对于C++这样的静态类型语言而言,在定义一个多维数组时,其总元素数目等于各维度边界值相乘的结果;而每个元素占用多少位则依赖于所选的数据类型。因此,即使有足够的地址空间来容纳整个结构体,也可能因为整型溢出等问题无法声明非常巨大的数组实例[^2]。 由于上述原因的存在,并不存在一个通用的确切数值能够描述所有情况下二维数组能有多大——这完全视乎实际环境配置以及目标平台特性而定。不过一般来讲,现代计算机硬件条件下,除非特别巨大规模的应用场景外,普通的桌面级应用很少触及到这类极限情况。 ```cpp // 示例:计算最大可行的二维int数组大小(假设每项占4字节) #include <iostream> using namespace std; int main() { size_t maxElements = SIZE_MAX / sizeof(int); // 计算理论上最大的元素数量 cout << "Maximum feasible elements count: " << maxElements << endl; // 假设我们想要构建一个正方形矩阵 double sqrtMaxElms = floor(sqrt((double)maxElements)); cout << "Largest square matrix dimension (approx): " << sqrtMaxElms << "x" << sqrtMaxElms << endl; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QuietNightThought

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值