GPU使用张量流数据集

时间:2018-01-20 01:54:38

标签: python tensorflow dataset

TF Trace

在我的数据训练期间,我的GPU利用率约为40%,我清楚地看到有一个基于张量流分析器的大量时间的数据复制操作(参见附图)。我认为“MEMCPYHtoD”选项是将批量从CPU复制到GPU,并阻止GPU被使用。无论如何都要将数据预取到GPU?还是我还没有看到其他问题?

以下是数据集的代码:

X_placeholder = tf.placeholder(tf.float32, data.train.X.shape)
y_placeholder = tf.placeholder(tf.float32, data.train.y[label].shape)

dataset = tf.data.Dataset.from_tensor_slices({"X": X_placeholder, 
                                              "y": y_placeholder})
dataset = dataset.repeat(1000)
dataset = dataset.batch(1000)
dataset = dataset.prefetch(2)
iterator = dataset.make_initializable_iterator()
next_element = iterator.get_next()

2 个答案:

答案 0 :(得分:1)

预取到单个GPU

  • 考虑使用比prefetch_to_device更灵活的方法,例如通过使用tf.data.experimental.copy_to_device(...)明确复制到GPU,然后进行预取。这样可以避免prefetch_to_device必须是管道中的最后一个转换的限制,并允许合并其他技巧来优化Dataset管道性能(通过覆盖线程池分布来优化tf.contrib.data.AUTOTUNE )。
  • 尝试使用实验性的tf.data选项进行预取,该方法允许dataset = dataset.apply(tf.data.experimental.copy_to_device("/gpu:0")) dataset = dataset.prefetch(tf.contrib.data.AUTOTUNE) 运行时根据您的系统和环境自动调整预取缓冲区的大小。

最后,您可能最终会执行以下操作:

import React, { Component } from "react";
import { connect } from "react-redux";
import {MenuItem,NavDropdown,NavItem,Navbar,Nav,Button} from "react-bootstrap";
import PropTypes from "prop-types";
import { signIn } from "../actions";

class Header extends Component {
  static contextTypes = {
    router: PropTypes.object
  };

  renderContent() {
    switch (this.props.fetchUser) {
      case null:
        return;
      case false:
        return (
          <Button bsStyle="success" onClick={this.props.signIn}>
            Login
          </Button>
        );
      default:
        return (
          <Button bsStyle="success" onClick={this.props.signOut}>
            Logout
          </Button>
        );
    }
  }

  render() {
    return (
      <div>
        <Navbar inverse collapseOnSelect>
          <Navbar.Header>
            <Navbar.Brand>
              <a href="/">React-Bootstrap</a>
            </Navbar.Brand>
          </Navbar.Header>

        </Navbar>
        <ul>{this.renderContent}</ul>
      </div>
    );
  }
}

function mapStateToProps({ auth }) {
  return { auth };
}

export default connect(mapStateToProps,{ signIn })(Header);

答案 1 :(得分:0)

我相信您现在可以使用prefetch_to_device来解决此问题。代替该行:

[uwsgi]
plugins = python3
uid = gitlab-tools
chdir = /usr/lib/python3/dist-packages/gitlab_tools/
socket = /tmp/gitlab-tools.sock
chmod-socket = 777
module = wsgi
callable = app
buffer-size = 32768

dataset = dataset.prefetch(2)