Try   HackMD

中山管院大數據分析平台說明

以下,我們會提供幾項簡易的教學,分別是

什麼是中山管院大數據平台?

各服務連結如下

中山管院大數據分析平台是一個線上運算服務平台,提供強大的資料儲存與運算資源給管院學生。

目前有 18 台主機共 136 個核心數和 1.5TB 記憶體組成的 Hadoop 叢集(Hadoop Cluster) 以及 備載GPU運算能力的伺服器。 平台提供 RStudio 和 Jupyter 開發環境,讓使用者可以撰寫 R 和 Python 語言。


Hadoop 連線設定與教學

Hadoop 是什麼呢?什麼時候需要 Hadoop?

假如我們在處理的大數據資料,檔案大小超過你的電腦的容量,我們還有辦法做數據分析嗎?這時候我們就需要Hadoop了!

Hadoop 是一個能儲存並管理大量資料的雲端平台,除了能儲存單個超級大的檔案,還能夠同時儲存、處理、分析上千上萬上百萬份這種超大的檔案。所以每當講到大數據,時常會提到 Hadoop 這套技術。

下面我們提供影片與文字版的教學,讓使用者可以連上管院伺服器上的 Hadoop,並對 HDFS(Hadoop File System) 上的檔案做些簡單的操作。

影音教學

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

文字教學

  1. 連線設定

    • 在連線到Hadoop前,必須設定環境變數。
    • 請直接複製底下兩行程式碼並在程式的最一開始執行,如果沒執行的話會無法連線上 Hadoop。
      ​​​​​​​​Sys.setenv("HADOOP_CMD" = "/home/hadoop/hadoop/bin/hadoop")
      ​​​​​​​​Sys.setenv("HADOOP_STREAMING"="/home/hadoop/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.8.1.jar")
      
  2. 載入packages

    • rmr2, plyrmr, rhdfs 這些 packages 提供許多 R 的函式,讓使用者可以直接對 HDFS 系統上的檔案執行指令,例如存取資料或資料分析。

    • hdfs.init():連線 HDFS 叢集必備的步驟。

      ​​​​​​​​library(rmr2)
      ​​​​​​​​library(plyrmr)
      ​​​​​​​​library(rhdfs)
      ​​​​​​​​hdfs.init()
      
  3. 與HDFS系統互動

    • to.dfs():寫入檔案至 HDFS。

    • from.dfs():讀取 HDFS 上的檔案。

      ​​​​​​​​# 將 mtcars 這個 dataframe 上傳至 hdfs 檔案處理系統
      ​​​​​​​​to.dfs(mtcars, "/home/yourAccountName/mtcars.csv", format = "csv")
      ​​​​​​​​# 從 hdfs 檔案系統讀取檔案
      ​​​​​​​​from.dfs("/home/yourAccountName/mtcars.csv", format = "csv")
      
    • hdfs.ls():列出 HDFS 上的所有檔案。

    • hdfs.del():刪除 HDFS 上的所有檔案。

      ​​​​​​​​hdfs.ls("/home/yourAccountName")
      ​​​​​​​​hdfs.del("/home/yourAccountName/mtcars.csv")
      
    • 上述語法的 /yourAccountName/ 部分,請使用者自行將其改成自己的目錄名稱。

以上是 Hadoop 連線以及基本 HDFS 操作的介紹。
使用者可以透過更進階的「MapReduce」對 Hadoop 上的資料做操作。

Spark 連線設定與教學

既然我們有了 Hadoop 這個強大的工具來處理大數據,為何還需要 Spark 呢?而 Spark 與 Hadoop 又有什麼不同呢?

Hadoop 執行 MapReduce 運算時,會將中間產生的數據儲存在硬碟中,也就說任何的資料存取都會執行 I/O,而 I/O 往往是效能的瓶頸,因此會有讀寫資料延遲的問題。

Spark 比 Hadoop 晚四年問世,Spark 是一個基於記憶體的運算框架,在運算時,會將中間產生的數據暫存在記憶體中,因此可以大大地加快運算速度。尤其是反覆執行多次時,需讀取的資料量越大,越能看出 Spark 的效能,而 Spark 同時也與 Hadoop 相容,所以可以透過 HDFS 存儲檔案、透過 Spark 在記憶體中運算。

影音教學

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

文字教學

  1. 載入所需的 Package 並連線上 HDFS

    • 該步驟與前面的 Hadoop 連線一樣。

      ​​​​​​​​# Hadoop settiing and initilize
      ​​​​​​​​Sys.setenv(HADOOP_CMD = "/home/hadoop/hadoop/bin/hadoop")
      ​​​​​​​​Sys.setenv(HADOOP_STREAMING = "/home/hadoop/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.8.1.jar")
      ​​​​​​​​library("rhdfs")
      ​​​​​​​​hdfs.init()
      ​​​​​​​​# spark and else packages
      ​​​​​​​​library(dplyr)
      ​​​​​​​​library(sparklyr)
      ​​​​​​​​Sys.setenv(SPARK_HOME = "/usr/local/spark/spark-2.1.0-bin-hadoop2.7/")
      
  2. 設定 Spark 的連線資訊

    • 由於 Spark 是基於記憶體的運算,所以在連線前必須了解連線的伺服器提供多大的資源,並設定合理的資源消耗,例如使用多少的記憶體、核心數等等。
      ​​​​​​​​# the following code are memory limit and executor setting
      ​​​​​​​​config <- spark_config()
      ​​​​​​​​config$spark.executor.memory = "32G"
      ​​​​​​​​config$spark.cores.max = "50"
      ​​​​​​​​config$spark.driver.memory = "16G" 
      ​​​​​​​​config$spark.yarn.executor.memoryOverhead = "4096"
      ​​​​​​​​    
      ​​​​​​​​# create a connection to Spark
      ​​​​​​​​sc <- spark_connect(master = "spark://hnamenode:7077", config = config)
      

    執行完以上的程式後就可以連線上 Spark 了。
    如果連線成功的話,會在 RStudio 的畫面右上角看到一個新的頁籤叫做 connection。如果連線失敗則會在下方的 console 頁籤跳出錯誤訊息。

  3. 在HDFS上存取檔案

    • 先前提到過,Spark 跟 HDFS 是相容的,所以連線上 Spark 時也可以對 HDFS 上的檔案做存取。
    • 底下程式碼示範如何從 HDFS 上讀出檔案和把 R 的物件儲存至 HDFS。
      ​​​​​​​​hdfs.ls("/home/yourAccountName/")
      ​​​​​​​​mySDF = spark_read_csv(sc, name = "mtcars", path = "hdfs:/home/yourAccountName/mtcars.csv", header = T)
      
      ​​​​​​​​# you can also move R dataframe to Spark.
      ​​​​​​​​movies_sdf = copy_to(sc, df = ggplot2movies::movies, name = "movies",overwrite = T)  
      
  4. 中斷連線

    • 若執行完 Spark 的操作卻沒有中斷連線的話,會導致集群上的運算資源被特定使用者佔用住,導致其他使用者無法使用群集上資源,所以,當使用完 Spark 時務必要養成斷線的好習慣。
      ​​​​​​​​spark_disconnect(sc)
      

Spark 進階範例:操作 babynames 資料集

接下來的範例會示範如何在 Spark 上操作巨量資料。
範例中我們會用到 babynames 資料集,資料集紀錄一百八十多萬的新生兒姓名資料。選用這個資料集的目的是要讓使用者感受在操作巨量資料時,Spark 的運算能力有多強大。

影音教學

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

  1. 設定連線資訊&讀取資料

    • Spark 連線

      ​​​​​​​​# Hadoop settiing and initilize
      ​​​​​​​​Sys.setenv(HADOOP_CMD = "/home/hadoop/hadoop/bin/hadoop")
      ​​​​​​​​Sys.setenv(HADOOP_STREAMING = "/home/hadoop/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.8.1.jar")
      ​​​​​​​​library("rhdfs")
      ​​​​​​​​hdfs.init()
      ​​​​​​​​# spark and else packages
      ​​​​​​​​library(dplyr)
      ​​​​​​​​library(sparklyr)
      ​​​​​​​​Sys.setenv(SPARK_HOME = "/usr/local/spark/spark-2.1.0-bin-hadoop2.7/spark-2.1.0-bin-hadoop2.7/")
      
      ​​​​​​​​# the following code are memory limit and executor setting
      ​​​​​​​​config <- spark_config()
      ​​​​​​​​config$spark.executor.memory = "32G"
      ​​​​​​​​config$spark.cores.max = "50"
      ​​​​​​​​config$spark.driver.memory = "16G" 
      ​​​​​​​​config$spark.yarn.executor.memoryOverhead = "4096"
      
      ​​​​​​​​# create a connection to Spark
      ​​​​​​​​sc <- spark_connect(master = "spark://hnamenode:7077", config = config)
      
    • 資料集讀取

      • 上述的資料集已經放在 sample 資料夾裡面了,透過底下的程式碼就可以將資料讀出來了。
      • babynames是美國新生兒的姓名資料,資料筆數大約有 一百八十多萬 多筆。
      ​​​​​​​​data_file_1 <- "hdfs:/home/sample/babynames.csv"
      ​​​​​​​​# 透過spark_read_csv 至 hdfs上 讀取babynames 資料集
      ​​​​​​​​baby <- spark_read_csv(sc, "babynames", data_file_1)
      ​​​​​​​​# babynames 資料集總共有一百八十多萬筆
      ​​​​​​​​baby %>% summarise(n = n())
      
  2. 簡單查詢句:以 babynames 資料為例
    當資料筆數很多的時候,因為查詢句至少要搜尋過全部資料一次,需要會花非常多的時間,何況實務上查詢句可能包含不只一個變數,必定會耗費大量運算資源。
    但透過 Spark,底下的程式只需花 5 ~ 7 秒的時間就可以完成查詢,這就是 Spark 強大的地方。

    • 以 babynames 資料為例,底下查詢句用來查詢各欄位中 不重複的資料 有幾筆。

    • 執行結果可以看出 prop 欄位的不重複資料有 16 萬多筆,卻能夠很快就完成查詢句。

      ​​​​​​​​# 設定起始時間
      ​​​​​​​​start_time <- proc.time()
      ​​​​​​​​baby %>% 
      ​​​​​​​​    summarise(n_year = n_distinct(year),
      ​​​​​​​​                n_sex = n_distinct(sex),
      ​​​​​​​​                n_name = n_distinct(name),
      ​​​​​​​​                n_n = n_distinct(n),
      ​​​​​​​​                n_prop = n_distinct(prop)) %>% 
      ​​​​​​​​                data.frame
      ​​​​​​​​#   n_year n_sex  n_name  n_n   n_prop
      ​​​​​​​​#     136    2    95025  13604  162480
      
      ​​​​​​​​# 用程式執行完的時間減去起始時間
      ​​​​​​​​proc.time() - start_time
      ​​​​​​​​#   user   system  elapsed  
      ​​​​​​​​#   0.059   0.025   0.769
      
      
    • 如果是直接在執行相同的查詢句,而不是透過spark做運算的話,其執行速度沒有辦法來得像spark這麼快。

      ​​​​​​​​# 設定起始時間
      ​​​​​​​​start_time <- proc.time()
      ​​​​​​​​babynames::babynames %>% 
      ​​​​​​​​    summarise(n_year = n_distinct(year),
      ​​​​​​​​            n_sex = n_distinct(sex),
      ​​​​​​​​            n_name = n_distinct(name),
      ​​​​​​​​            n_n = n_distinct(n),
      ​​​​​​​​            n_prop = n_distinct(prop)) %>%
      ​​​​​​​​            data.frame
      ​​​​​​​​#   n_year n_sex  n_name  n_n   n_prop
      ​​​​​​​​#     136    2    95025  13604  162480
      
      ​​​​​​​​proc.time() - start_time
      ​​​​​​​​#   user   system  elapsed  
      ​​​​​​​​#   0.578   0.013   0.658 
      
  3. 資料視覺化:以 babynames 資料集為例
    babynames 資料集紀錄從 1880 年開始,在美國每年出生的新生兒取哪些名字、每個名字總共被用了幾次等資訊,在資料集裡面共有 5 個columns,分別是年份、性別、姓名、總數、佔總出生人數的比重。
    在範例中,寫了一個函式用來查詢特定一年中,哪些名字最常被使用來命名。另外我們也附上官方教學文件供使用者參考。

    • 載入會用到的packages

      ​​​​​​​​library(ggplot2)  #The following are the tools for graphing
      ​​​​​​​​library(dygraphs)
      ​​​​​​​​library(rbokeh)
      ​​​​​​​​library(RColorBrewer)
      ​​​​​​​​library(plotly)
      
    • 先找出1986以後且被用來命名過超過一千次的資料,列出姓名跟性別這個兩個變數,並以topNames這個變數儲存起來。

      ​​​​​​​​topNames = baby %>% 
      ​​​​​​​​    filter(year > 1986) %>%
      ​​​​​​​​    group_by(name, sex) %>%
      ​​​​​​​​    summarize(count = sum(n)) %>%
      ​​​​​​​​    filter(count > 1000) %>%
      ​​​​​​​​    select(name, sex)
      
    • 接著用原始資料對topNames做inner_join,並且group_by年份這個變數,表示出來的結果會是各年中最代表的姓名

      ​​​​​​​​yearlyName = baby %>%
      ​​​​​​​​    filter(year > 1986) %>%
      ​​​​​​​​    inner_join(topNames) %>%
      ​​​​​​​​    group_by(year, name, sex) %>%
      ​​​​​​​​    summarize(count = sum(n)) %>%
      ​​​​​​​​    sdf_copy_to(sc, ., "yearlyname", T, overwrite=T) 
      
    • 再來我們將上面做過的事情,寫成一個函式,以便未來想要做查詢的時候,不需要重複打這麼多程式碼,只要傳入年份變數就可以得到我們想要的結果,還可以把結果以圖形化的方式呈現出來。

      ​​​​​​​​MostPopularNames <- function(year) {
      ​​​​​​​​  topNames <- baby %>% 
      ​​​​​​​​    filter(year >= 1986) %>%
      ​​​​​​​​    group_by(name, sex) %>%
      ​​​​​​​​    summarize(count = sum(n)) %>%
      ​​​​​​​​    filter(count > 1000) %>%
      ​​​​​​​​    select(name, sex)
      
      ​​​​​​​​  yearlyName <- baby %>%
      ​​​​​​​​    filter(year >= 1986) %>%
      ​​​​​​​​    inner_join(topNames) %>%
      ​​​​​​​​    group_by(year, name, sex) %>%
      ​​​​​​​​    summarize(count = sum(n)) %>%
      ​​​​​​​​    sdf_copy_to(sc, ., "yearlyname", T, overwrite=T)
      
      ​​​​​​​​  TopNm <- yearlyName %>%
      ​​​​​​​​    filter(year == year) %>%
      ​​​​​​​​    group_by(name,sex) %>%
      ​​​​​​​​    summarize(count=sum(count)) %>%
      ​​​​​​​​    group_by(sex) %>%
      ​​​​​​​​    mutate(rank = min_rank(desc(count))) %>%
      ​​​​​​​​    filter(rank < 5) %>%
      ​​​​​​​​    arrange(sex, rank) %>%
      ​​​​​​​​    select(name,sex,rank) %>%
      ​​​​​​​​    sdf_copy_to(sc,.,"topNames",T,overwrite=TRUE)
      
      ​​​​​​​​  topNamesYearly <- yearlyName %>% 
      ​​​​​​​​    inner_join(select(TopNm, sex, name)) %>% 
      ​​​​​​​​    collect
      
      ​​​​​​​​  #兩種畫法可以選一種畫就好
      ​​​​​​​​  #第一種圖
      ​​​​​​​​  ggplot(topNamesYearly,
      ​​​​​​​​         aes(year, count, color = name)) + 
      ​​​​​​​​    facet_grid(~sex) + 
      ​​​​​​​​    geom_line() + 
      ​​​​​​​​    ggtitle(paste0("Most Popular Names of ", year))
      
      ​​​​​​​​  #第二種圖
      ​​​​​​​​  # 拿出名字欄位之後要做factor化
      ​​​​​​​​  names <- TopNm %>% 
      ​​​​​​​​    select(name) %>% 
      ​​​​​​​​    collect %>% 
      ​​​​​​​​    as.data.frame
      
      ​​​​​​​​  names <- names[, 1, T]
      
      ​​​​​​​​  topNamesYearly$name <- factor(topNamesYearly$name, levels = names, labels = names)
      
      ​​​​​​​​  p = ggplot(topNamesYearly, aes(year, count, color=name)) + 
      ​​​​​​​​    theme_light() + 
      ​​​​​​​​    facet_wrap(~sex, nrow=2) +
      ​​​​​​​​    geom_vline(xintercept = year, col='yellow', lwd=1.2) +
      ​​​​​​​​    geom_line() +
      ​​​​​​​​    ggtitle(sprintf('Most Popular Names of %d',year)) +
      ​​​​​​​​    scale_colour_brewer(palette = "Paired")
      
      ​​​​​​​​  plotly_build(p)
      ​​​​​​​​}
      
    • 透過函式給定特定年份,就可以得到該年中最常被使用的姓名是哪個。

      ​​​​​​​​MostPopularNames(2015)
      ​​​​​​​​MostPopularNames(2000) 
      

    • 將男生姓名及女生姓名在資料中的分佈狀況畫出來。

      ​​​​​​​​sharedName = baby %>%
      ​​​​​​​​  mutate(male=ifelse(sex == "M", n, 0),
      ​​​​​​​​         female=ifelse(sex == "F", n, 0)) %>%
      ​​​​​​​​  group_by(name) %>%
      ​​​​​​​​  summarize(Male = sum(male),
      ​​​​​​​​            Female = sum(female),
      ​​​​​​​​            count = sum(n),
      ​​​​​​​​            AvgYear = round(sum(year * n) / sum(n),0)) %>%
      ​​​​​​​​  filter(Male > 10000 & Female > 10000) %>% collect
      
      ​​​​​​​​figure(width = NULL, height = NULL,
      ​​​​​​​​       xlab = "Log10 Number of Males",
      ​​​​​​​​       ylab = "Log10 Number of Females",
      ​​​​​​​​       title = "Top shared names (1880 - 2014)") %>%
      ​​​​​​​​  ly_points(log10(Male), log10(Female), data = sharedName,
      ​​​​​​​​            color = AvgYear, size = scale(sqrt(count)),
      ​​​​​​​​            hover = list(name, Male, Female, AvgYear), legend = FALSE)
      

  4. 使用完Spark後,如果暫時沒有要再使用,務必要將其中斷連線

    ​​​​spark_disconnect(sc)
    

Greenplum 實作範例

影音教學

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

文字教學

Greenplum database 是一種開源的分散式資料庫,它提供 PB 級別數據量的快速分析能力及對超大資料表做快速查詢的能力。
過去,當使用者要分析儲存在資料庫上的結構化資料的時候,必須先將資料表讀入分析工具中,例如將一個 table 讀進 RStudio 中,再進行資料分析、建立模型等等,但如果資料表很大的話,會造成在讀取資料的階段就耗盡了大量的運算資源。而現在有了 Greenplum 這個擁有資料分析能力的資料庫,使用者可以直接在資料庫中對資料表做資料分析、做查詢句甚至是訓練模型,並將結果直接輸出至我們的分析工具中,如此一來,就可以避免在讀取資料時大量消耗運算資源的問題,使用者可以直接對資料庫中的資料表做更快速、更彈性的操作。

底下的範例會教使用者如何用 RStudio 連線上資料庫(本院提供的資料庫為 Greenplum)以及對資料表做些簡單的查詢句。

  1. 載入packages
    • PivotalR、DBI、RPostgreSQL都是與資料庫操作有關的 packages,使用者可以根據自己的需求決定要載入哪些,範例中使用的語法都只有用到 RPostgreSQL package 裡面的function。
    • 載入 ggplot2 package 是因為我們會用到 diamonds 資料集。
      ​​​​​​​​library(PivotalR)
      ​​​​​​​​library(ggplot2) # for diamonds dataset
      ​​​​​​​​library(DBI)
      ​​​​​​​​library(RPostgreSQL)
      
  2. 設定資料庫的連線資訊
    • 為了方便起見,在申請帳號時本院會將 dbname 設定成使用者的帳號名稱。而 userpassword 則是大數據分析平台的帳號和密碼。
    • host192.168.1.100
      ​​​​​​​​pgConn = dbConnect("PostgreSQL",
      ​​​​​​​​               dbname = "帳號名稱",
      ​​​​​​​​               user = "帳號名稱",
      ​​​​​​​​               password = "密碼",
      ​​​​​​​​               host = "192.168.1.100")
      
  3. 常用基本語法
    • dbListTables():列出所有資料表
    • dbWriteTable():建立資料表
    • dbReadTable():讀取資料表
    • dbRemoveTable():刪除資料表
    • dbListFields():讀取資料表欄位
      ​​​​​​​​# List tables in database
      ​​​​​​​​dbListTables(pgConn)
      
      ​​​​​​​​diamonds = as.data.frame(diamonds)
      ​​​​​​​​# create table 
      ​​​​​​​​dbWriteTable(pgConn, "diamonds", diamonds)
      
      ​​​​​​​​# Read data in table
      ​​​​​​​​dbReadTable(pgConn, "diamonds")
      
      ​​​​​​​​# List column name of table
      ​​​​​​​​dbListFields(pgConn, "diamonds")
      ​​​​​​​​
      ​​​​​​​​dbRemoveTable(pgConn, "diamonds")
      
  4. 執行查詢句
    • 第一種方式為 dbSendQuery(),使用者下 SQL 去執行,執行完畢後產生一個 resultset 用來儲存結果,再透過 fetch() 讀取resultset 裡面儲存的資訊。
    • 第二種方式為 dbGetQuery(),直接取得使用者所下的 SQL 的執行結果。
      ​​​​​​​​# send query to database and create resultset object 
      ​​​​​​​​# use fetch() function to read the resultset
      ​​​​​​​​rs = dbSendQuery(pgConn, statement = "SELECT count(*) FROM diamonds")
      ​​​​​​​​fetch(rs)
      ​​​​​​​​
      ​​​​​​​​dbClearResult(rs)
      ​​​​​​​​rm(rs)
      ​​​​​​​​
      ​​​​​​​​
      ​​​​​​​​df = dbGetQuery(pgConn, "SELECT color, avg(price) as AvgPrice FROM diamonds group by color")
      ​​​​​​​​# color variable of diamonds dataset says that from "J" to "D" represents worst to best 
      ​​​​​​​​df$color = factor(df$color,
      ​​​​​​​​          order = T,
      ​​​​​​​​          levels = c("J","I","H","G","F","E","D"))
      ​​​​​​​​
      ​​​​​​​​# show sorted result
      ​​​​​​​​df[order(df$color), ]
      

以上是連線上資料庫與簡易的資料庫操作範例,使用可以依照自己的需求去使用一開始提到的幾個 package 內的功能,在這邊只簡單示範了幾個基本語法而已

GPU 伺服器的環境變數設定

GPU 的環境變數設定是很重要的步驟,因為在管院商業大數據平台上,運算資源是由中山大學管理學院的學生共同享有,若沒有適當地設定 GPU 環境變數的話,可能會造成系統資源被特定使用者佔用,導致其他使用者無法共享平台上的資源。以下我們會分別教學在 Python 和 R 中要如何設定GPU的環境變數。

Python

  1. GPU 指定

    • GPU 指定的意思就是告訴電腦你要使用第幾張 GPU。
    • GPU 的索引位置是從 0 開始並透過逗號分隔,也就是說如果要使用第一張和第三張GPU,則可以透過底下這段程式碼完成設定。
      ​​​​​​​​import os
      ​​​​​​​​# use first and third GPU
      ​​​​​​​​os.environ["CUDA_VISIBLE_DEVICES"] = "0,2"
      
  2. 限制 GPU 用量

    • 一次只使用一張。

      ​​​​​​​​# use any one GPU
      ​​​​​​​​import tensorflow as tf
      ​​​​​​​​config = tf.ConfigProto(device_count={'GPU': 1})
      ​​​​​​​​sess = tf.Session(config=config)
      
  3. 限制 GPU 的記憶體使用量

    • 限制使用者只能使用 20% 的記憶體
      ​​​​​​​​# use 20% memory of GPU
      ​​​​​​​​gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.2)
      ​​​​​​​​sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
      
      ​​​​​​​​# if using Keras
      ​​​​​​​​import tensorflow as tf
      ​​​​​​​​from keras.backend.tensorflow_backend import set_session
      ​​​​​​​​config = tf.ConfigProto()
      ​​​​​​​​config.gpu_options.per_process_gpu_memory_fraction = 0.2
      ​​​​​​​​set_session(tf.Session(config=config))
      

R

  1. GPU 指定
    • GPU 指定的意思就是告訴電腦你要使用第幾張GPU。
    • GPU 的索引位置是從 0 開始並透過逗號分隔,也就是說如果要使用第一張和第二張GPU,則可以透過底下這段程式碼完成設定。
      ​​​​​​​​Sys.setenv(CUDA_HOME="/usr/local/cuda")
      ​​​​​​​​Sys.setenv(PATH=paste(Sys.getenv("PATH"), "/usr/local/cuda/bin", sep = ":"))
      
      ​​​​​​​​# Use both card #0 and #1
      ​​​​​​​​Sys.setenv(CUDA_VISIBLE_DEVICES="0,1")
      
  2. 限制GPU用量
    • 一次只使用一張。
      ​​​​​​​​library(keras); library(tensorflow)
      ​​​​​​​​config = tf$ConfigProto(device_count={'GPU': 1})
      ​​​​​​​​sess = tf$Session(config=config)
      
      ​​​​​​​​# if using keras please add the following
      ​​​​​​​​k_set_session(sess)
      
  3. 限制GPU的記憶體使用量
    • 限制使用者只能使用20%的記憶體
      ​​​​​​​​gpu_options=tf$GPUOptions(per_process_gpu_memory_fraction=0.2)
      ​​​​​​​​sess = tf$Session(config=tf$ConfigProto(gpu_options=gpu_options))
      
      ​​​​​​​​# if using keras please add the following
      ​​​​​​​​k_set_session(sess)