疑難排解

要找出在雲端訓練模型或取得預測時發生錯誤的原因並非易事。本頁面說明如何找出問題及偵錯方式。

指令列工具

ERROR: (gcloud) Invalid choice: 'ai-platform'.

這項錯誤表示您需要更新 gcloud。如要更新 gcloud,請執行以下指令:

gcloud components update

使用工作記錄

Stackdriver Logging 擷取的工作記錄是非常適合開始著手進行疑難排解之處。

不同作業類型的記錄

您的記錄會隨著下列各節所示的作業類型而異。

訓練記錄

系統會記錄所有訓練工作。記錄含有訓練服務和訓練應用程式的所有事件。您可以透過標準 Python 程式庫 (例如 logging),將記錄事件放入您的應用程式中。AI Platform 會從您的應用程式擷取所有記錄訊息。系統會將傳送至 stderr 的所有訊息自動擷取到 Stackdriver Logging 中的工作項目。

批次預測記錄

系統會記錄所有批次預測工作。

線上預測記錄

根據預設,線上預測要求不會產生記錄,但您可以在建立模型資源時啟用 Stackdriver Logging:

gcloud

在執行 gcloud ai-platform models create 時包含 --enable-logging 標記。

Python

在您用於呼叫 projects.models.createModel 資源中,將 onlinePredictionLogging 設為 True

尋找記錄

您的工作記錄含有所有作業事件,包括您在使用分散式訓練時叢集中所有處理程序發生的事件。如果您正在執行分散式訓練工作,則系統會報告主要工作站處理程序的工作層級記錄。錯誤疑難排解的第一個步驟,通常是先檢查該處理程序的記錄,篩選排除叢集中其他處理程序的記錄事件。本節中的範例會示範如何篩選。

您可以從指令列,或在 Google Cloud Platform 主控台的 Stackdriver Logging 區段中篩選記錄。不論您採用哪一種方式,請視需要在篩選條件中使用以下中繼資料值:

中繼資料項目 篩選出符合以下條件的項目
resource.type 等於「cloud_ml_job」。
resource.labels.job_id 等於您的工作名稱。
resource.labels.task_name 等於「master-replica-0」,僅讀取主要工作站的記錄項目。
severity 大於或等於「ERROR」,僅讀取符合錯誤狀況的記錄項目。

指令列

使用 gcloud 測試版 logging read 指令來建構符合您需求的查詢。範例如下:

每個範例均使用以下環境變數:

PROJECT="my-project-name"
JOB="my_job_name"

您可以根據需求,輸入字串常值。

如何將工作記錄輸出到螢幕:
gcloud ai-platform jobs stream-logs $JOB

請參閱適用於 gcloud ai-platform jobs stream-logs 的所有選項。

如何將主要工作站的記錄輸出到螢幕:
gcloud beta logging read --project=${PROJECT} "resource.type=\"ml_job\" and resource.labels.job_id=${JOB} and resource.labels.task_name=\"master-replica-0\""
如何只將主要工作站的錯誤記錄輸出到螢幕:
gcloud beta logging read --project=${PROJECT} "resource.type=\"ml_job\" and resource.labels.job_id=${JOB} and resource.labels.task_name=\"master-replica-0\" and severity>=ERROR"

上述範例是在篩選 AI Platform 訓練工作記錄時最常見的情況。Stackdriver Logging 提供許多強大的篩選選項,若您需要修正搜尋,可以使用這些選項。進階篩選說明文件會詳細說明這些選項。

主控台

  1. 在 GCP 主控台中開啟 AI Platform「Jobs」(工作) 頁面。

    在 GCP 主控台中開啟「Jobs」(工作)

  2. 從「工作」頁面的清單中選取失敗的工作,以查看該工作的詳細資料。

有一個失敗工作的 AI Platform 工作清單。

  1. 按一下 [View logs] (查看記錄) 以開啟 Stackdriver Logging。

失敗工作的工作詳細資料頁面。

您也可以直接前往 Stackdriver Logging,但必須執行額外的步驟,才能找到您的工作:

  1. 展開資源選取器。
  2. 在資源清單中展開 AI Platform 工作。
  3. 在 job_id 清單中找出您的工作名稱 (您可以在搜尋框中輸入工作名稱的前幾個字母,以減少顯示的工作數量)。
  4. 展開工作項目,然後從工作清單中選取 master-replica-0

記錄篩選選取器全部展開。

從記錄中取得資訊

找出正確的工作記錄並篩選到 master-replica-0 之後,您就可以檢查記錄的事件以找出問題的根源。這項作業涉及標準的 Python 除錯程序,但請務必謹記以下要點:

  • 事件分成多種嚴重性等級。您可以將其篩選,只查看特定等級的事件,例如錯誤或錯誤和警告。
  • 因無法復原的錯誤狀況,造成訓練程式結束的問題 (傳回碼 > 0) 會記錄為例外狀況,並會在記錄前方加上堆疊追蹤:

未展開任何部分的記錄項目

  • 您可以在記錄的 JSON 訊息中展開物件,以取得更多資訊 (以向右箭頭表示,內容則列為 {...})。例如,您可以展開「jsonPayload」來查看堆疊追蹤,這個格式比主要錯誤說明更容易閱讀:

展開 JSON 酬載部分的記錄項目

  • 部分錯誤會顯示可重試錯誤的執行個體。由於這些執行個體通常不包含堆疊追蹤,因此可能更難以診斷。

充分利用記錄

AI Platform 訓練服務會自動記錄以下事件:

  • 服務內部的狀態資訊。
  • 訓練應用程式傳送至 stderr 的訊息。
  • 訓練應用程式傳送至 stdout 的輸出文字。

只要遵循適當的程式設計做法,您就能輕鬆排解訓練應用程式中的錯誤:

  • 將有意義的訊息傳送至 stderr (例如透過記錄)。
  • 發生問題時,提供最符合邏輯的敘述性例外狀況。
  • 在例外狀況物件中加入敘述性字串。

如要進一步瞭解例外狀況,請參閱 Python 說明文件

疑難排解訓練

本節說明訓練工作適用的概念和錯誤狀況。

瞭解訓練應用程式傳回碼

您在雲端的訓練工作是由訓練叢集主要工作站處理程序中執行的主要程式所控制:

  • 如果您是以單一處理程序進行訓練 (非分散式),則只會有一個工作站,也就是主要工作站。
  • 您的主要程式是 TensorFlow 訓練應用程式的 __main__ 函式。
  • AI Platform 的訓練服務會執行您的訓練應用程式,直到順利完成或發生無法復原的錯誤。這表示如果發生的是可重試的錯誤,則可能會重新啟動訓練程序。

訓練服務可管理您的處理程序。它會依據主要工作站處理程序的傳回碼來控管程式結束:

傳回碼 意義 AI Platform 反應
0 順利完成 關閉並釋出工作資源。
1 - 128 無法復原的錯誤 結束工作並記錄錯誤。

對於 __main__ 函式的傳回碼,您不需要採取任何特別動作。Python 會在工作順利完成時自動傳回零,並在發生未處理的例外狀況時傳回正數的代碼。如果您習慣為例外狀況物件設定特定傳回碼 (這是有效但不常見的一種做法),只要遵循上表中的模式,就不會干擾 AI Platform 工作。即使如此,用戶端代碼通常也不會直接指出可重試的錯誤,因為這類錯誤通常發生在作業環境。

處理特定錯誤狀況

本節說明已知會對某些使用者造成影響的一些錯誤狀況。

資源用盡

us-central1 地區對 GPU 和運算資源的需求很高。您可能會在工作記錄中收到以下錯誤訊息:Resources are insufficient in region: <region>. Please try a different region.

如要解決此問題,請嘗試使用其他地區或稍後再試。

訓練程式一直執行不停,卻沒有任何進度

某些狀況會造成訓練應用程式持續執行,但訓練工作卻沒有任何進度。問題的原因可能是阻礙性呼叫等待的資源一直無法使用。只要設定訓練程式的逾時間隔,就能解決此問題。

設定訓練程式的逾時間隔

您可以在建立工作階段或執行圖形的特定訓練批次時設定逾時 (以毫秒為單位):

  • 建立 Session 物件時,使用「config」參數設定想要的逾時間隔:

    sess = tf.Session(config=tf.ConfigProto(operation_timeout_in_ms=500))
    
  • 使用「options」參數,為單次呼叫 Session.run 設定想要的逾時間隔:

    v = session.run(fetches, options=tf.RunOptions(timeout_in_ms=500))
    

詳情請參閱 TensorFlow 工作階段說明文件

代碼為 -9 的程式結束

如果您一直收到結束碼 -9,則訓練應用程式使用的記憶體可能超過分配供處理程序使用的記憶體數量。如要修正這個錯誤,請減少記憶體用量及/或使用配備更多記憶體的機器類型。

  • 檢查您的圖形及訓練應用程式是否有作業使用的記憶體數量超過預期。記憶體用量會受到資料複雜性及運算圖形中作業複雜性的影響。
  • 增加分配給工作的記憶體可能需要一些技巧:
    • 如果您使用已定義的資源調度層級,則除非在組合中新增更多機器,否則無法增加每台機器的記憶體分配。您必須切換至「自訂」層級,並自行定義叢集中的機器類型。
    • 每個已定義機器類型的精確配置可能會有所改變,但您可以進行一些粗略的比較。請參閱訓練概念頁面的機器類型比較表
    • 測試機器類型的記憶體分配是否適當時,您可以使用一台機器或規模縮減的叢集,以盡量降低產生的費用。

代碼為 -15 的程式結束

通常,結束碼 -15 表示系統維護。這是可重試的錯誤,所以您的處理程序應該會自動重新啟動。

排入佇列的工作等待很長時間

如果有一段期間內訓練工作的狀態QUEUED,代表您可能已超過工作要求的配額

AI Platform 會依據先進先出的規則,按工作建立時間開始訓練工作。如果工作已排入佇列,通常表示在該工作之前提交的其他工作使用了專案的所有配額,或佇列中的第一個工作所要求的 ML 單位/GPU 數量超出了可用的配額。

系統會將工作排入佇列的原因記錄於訓練記錄中。請在記錄中搜尋與下列類似的訊息:

This job is number 2 in the queue and requires
4.000000 ML units and 0 GPUs. The project is using 4.000000 ML units out of 4
allowed and 0 GPUs out of 10 allowed.

此訊息說明工作在佇列中的當前位置,以及專案的目前用量和配額。

請注意,系統只會按照工作建立時間的排序,記錄前十個工作排入佇列的原因。

如果您需要的資源經常超過分配的要求數,則可以要求增加配額。如果您有付費支援服務方案,請與支援小組聯絡。或者,您也可以透過電子郵件將您的要求寄至 AI Platform 意見回饋

超過配額

如果您的錯誤附有「Quota failure for project_number:...」(project_number 的配額失敗:…。) 之類的訊息,您可能已超過某一個資源配額。您可以在主控台的 API Manager 中的 AI Platform「quotas」(配額) 頁面上監控資源使用量及提出增加配額的要求。

儲存路徑無效

如果工作結束且產生的錯誤訊息含有「還原呼叫使用了無效的儲存路徑 gs://...」,則您可能使用了設定不正確的 Google Cloud Storage 值區。

  1. 在 GCP 主控台中開啟 Google Cloud Storage「瀏覽器」頁面。

    在 GCP 主控台中開啟瀏覽器

  2. 針對您使用的值區,檢查「預設儲存空間級別」

兩個 Google Cloud Platform 值區,一個指派給不受支援的多地區,另一個指派給單一地區

  • 級別應該為「單一地區」。如果是,則表示其他設定發生問題。請試著重新執行工作。
  • 如果級別為「Multi-Regional」(多地區),您必須將它變更為「Regional」(單一地區),或將訓練資料移到其他值區。如要採取變更級別的方式,請參閱 Cloud Storage 說明文件中變更值區儲存空間級別的操作說明

訓練程式結束並顯示 AbortedError

如果您執行的訓練程式使用 TensorFlow Supervisor 來管理分散式工作,可能會發這種錯誤。TensorFlow 有時會在不應該暫停整個工作的情況下拋出 AbortedError 例外狀況。您可以在訓練程式中抓到該例外狀況,並做出相應的回應。請注意:搭配 AI Platform 執行的訓練程式不支援 TensorFlow Supervisor。

疑難排解預測

本節收集了在取得預測時會遇到的一些常見問題。

處理線上預測的特定狀況

本節針對已知會對某些使用者造成影響的一些線上預測錯誤狀況提供指引。

預測處理時間過長 (30-180 秒)

線上預測速度緩慢最常見原因是,處理節點的資源調度是從零開始向上調整。如果您的模型平常就會收到預測要求,系統會保留一或多個節點以提供預測。如果模型有一段時間未提供任何預測,則服務會「縮減資源」到零個節點。資源縮減之後發出的預測要求需要比平常更久的時間才能傳回,因為服務必須佈建節點來處理這項要求。

HTTP 狀態碼

線上預測要求發生錯誤時,您通常會收到服務傳回的 HTTP 狀態碼。以下是一些常見的狀態碼,及其在線上預測內容中的意義:

429 - 記憶體不足

處理節點在執行模型時用盡了記憶體。此時無法增加分配給預測節點的記憶體。您可以嘗試以下操作,繼續執行模型:

  • 透過下列方式縮減模型大小:
    • 使用較不精確的變數。
    • 量化連續資料。
    • 減少其他輸入特徵的大小 (例如,使用較小的詞彙大小)。
    • 使用較小的執行個體批次,重新傳送要求。
429 - 太多待處理的要求

模型收到的要求數超過它所能處理的範圍。如果您使用了自動調整資源配置功能,則代表模型收到要求的速度超過系統能擴增的速度。

使用自動調整資源配置功能時,您可以試著使用指數輪詢重新傳送要求,如此可讓系統有時間進行調整。

429 - 配額

Google Cloud Platform 專案的限制為每 100 秒 10,000 個要求 (約為每秒 100 個)。如果您是在暫時性的尖峰狀態收到此錯誤,通常可以使用指數輪詢重試,以便及時處理所有要求。如果您持續收到此代碼,您可以要求提高配額。詳情請參閱配額頁面

503 - 我們的系統偵測到您的電腦網路發出異常流量

單一 IP 對模型發出的要求頻率太高,系統懷疑遭到阻斷服務攻擊。請停止傳送要求一分鐘,然後以較低的頻率繼續傳送。

500 - 無法載入模型

系統在載入模型時發生問題。請嘗試下列步驟:

預測要求的格式錯誤

以下訊息均與預測輸入有關。

「Empty or malformed/invalid JSON in request body」
服務無法剖析要求中的 JSON,或您發出空白的要求。檢查訊息中是否有使 JSON 無效的錯誤或遺漏。
「Missing 'instances' field in request body」
您的要求主體未遵循正確的格式。它應該是一個 JSON 物件,具有名為 "instances" 的單一索引鍵,此索引鍵含有所有輸入執行個體的清單。
「JSON encoding error when creating a request」

您的要求含有 base64 編碼資料,但不是採用適當的 JSON 格式。每個 base64 編碼的字串都必須以具有 "b64" 的單一索引鍵的物件表示。例如:

  {"b64": "an_encoded_string"}

當您的二進位資料不是 base64 編碼時,會發生另一個 base64 錯誤。將資料編碼並格式化,如下所示:

  {"b64": base64.b64encode(binary_data)}

詳情請參閱格式化及編碼二進位資料的說明。

在雲端進行預測耗費的時間比在桌上型電腦中長

線上預測旨在成為可擴充的服務,以便快速提供高頻率的預測要求。此服務已針對所有提供要求的匯總效能進行最佳化。強調擴充性的效能特色與在本機電腦上產生少量預測的效能特色不同。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
TensorFlow 適用的 AI Platform