From b8abdef826ab4b57f3d9ad59d5b05378f3397ccb Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Thu, 24 Apr 2025 17:19:59 +0530 Subject: [PATCH 01/34] Update trivy.yml --- .github/workflows/trivy.yml | 170 +++++++++++++++++++++++++----------- 1 file changed, 119 insertions(+), 51 deletions(-) diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index 62b196f3d1..67cf6d1fcb 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -1,4 +1,5 @@ name: Trivy Nightly Scan + on: workflow_call: inputs: @@ -7,15 +8,15 @@ on: type: string workflow_dispatch: schedule: - - cron: '0 0 * * *' # This runs the workflow every night at midnight UTC + - cron: '0 0 * * *' # Every night at midnight UTC jobs: build: if: github.event.pull_request.draft == false permissions: - contents: read # for actions/checkout to fetch code - security-events: write # for github/codeql-action/upload-sarif to upload SARIF results - actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status + contents: read + security-events: write + actions: read runs-on: ubuntu-22.04 timeout-minutes: 15 @@ -33,34 +34,29 @@ jobs: run: | curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sudo sh -s -- -b /usr/local/bin - - name: Run Trivy code vulnerability scanner (JSON Output) - run: | - trivy --quiet fs \ - --format json \ - --output trivy-code-results.json \ - --ignore-unfixed \ - --vuln-type os,library \ - --severity CRITICAL,HIGH,MEDIUM \ - . - - - name: Display Trivy code Scan Results - if: failure() # Ensure this step runs regardless of the previous step's outcome + - name: Run Trivy code vulnerability scanner (JSON) + continue-on-error: true run: | - echo "Trivy Scan Results:" - cat trivy-code-results.json | jq '.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[] | {VulnerabilityID, PkgName, InstalledVersion, Severity, Description}' + trivy fs \ + --quiet \ + --format json \ + --output trivy-code-results.json \ + --ignore-unfixed \ + --vuln-type os,library \ + --severity CRITICAL,HIGH,MEDIUM . - - name: Upload Code Vulnerability Scan Results + - name: Upload Trivy Code JSON uses: actions/upload-artifact@v4 with: - name: trivy-code-report-json + name: trivy-code-report-${{ env.COMMIT_ID }} path: trivy-code-results.json - - name: Build an image from Dockerfile + - name: Build Docker Image run: | docker build --pull -t docker.io/securefederatedai/openfl:${{ github.sha }} -f openfl-docker/Dockerfile.base . - - name: Run Trivy vulnerability scanner for Docker image (JSON Output) - id: trivy-scan + - name: Trivy scan for Docker image (JSON) + id: trivy-image-json uses: aquasecurity/trivy-action@0.30.0 with: image-ref: 'docker.io/securefederatedai/openfl:${{ github.sha }}' @@ -71,40 +67,32 @@ jobs: vuln-type: 'os,library' severity: 'CRITICAL,HIGH,MEDIUM' trivyignores: '.trivyignore' + continue-on-error: true - - name: Display Trivy Docker Scan Results - if: failure() # Ensure this step runs regardless of the previous step's outcome - run: | - if [ -s trivy-docker-results.json ]; then - echo "Trivy Scan Results:" - cat trivy-docker-results.json | jq '.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[] | {VulnerabilityID, PkgName, InstalledVersion, Severity, Description}' - else - echo "Trivy scan results file is empty or not found." - fi - - - name: Upload final Trivy Docker Vulnerability Scan + - name: Upload Trivy Docker JSON uses: actions/upload-artifact@v4 with: - name: trivy-docker-report-json + name: trivy-docker-report-${{ env.COMMIT_ID }} path: trivy-docker-results.json - - name: Run Trivy code vulnerability scanner (SPDX-JSON Output) + - name: Trivy scan for code (SPDX) + continue-on-error: true run: | - trivy --quiet fs \ - --format spdx-json \ - --output trivy-code-spdx-results.json \ - --ignore-unfixed \ - --vuln-type os,library \ - --severity CRITICAL,HIGH,MEDIUM \ - . - - - name: Upload SPDX Code Vulnerability Scan Results + trivy fs \ + --quiet \ + --format spdx-json \ + --output trivy-code-spdx-results.json \ + --ignore-unfixed \ + --vuln-type os,library \ + --severity CRITICAL,HIGH,MEDIUM . + + - name: Upload Trivy SPDX Code uses: actions/upload-artifact@v4 with: - name: trivy-code-spdx-report-json + name: trivy-code-spdx-${{ env.COMMIT_ID }} path: trivy-code-spdx-results.json - - - name: Run Trivy vulnerability scanner for Docker image (SPDX-JSON Output) + + - name: Trivy scan for Docker image (SPDX) uses: aquasecurity/trivy-action@0.30.0 with: image-ref: 'docker.io/securefederatedai/openfl:${{ github.sha }}' @@ -115,9 +103,89 @@ jobs: vuln-type: 'os,library' severity: 'CRITICAL,HIGH,MEDIUM' trivyignores: '.trivyignore' - - - name: Upload SPDX Docker Vulnerability Scan + continue-on-error: true + + - name: Upload Trivy SPDX Docker uses: actions/upload-artifact@v4 with: - name: trivy-docker-spdx-report-json + name: trivy-docker-spdx-${{ env.COMMIT_ID }} path: trivy-docker-spdx-results.json + + - name: Generate Vulnerability Summary + id: summary + if: always() + run: | + echo "## Trivy Security Scan Summary" > vulnerability-summary.md + echo "Scan Date: $(date)" >> vulnerability-summary.md + echo "Repository: ${{ github.repository }}" >> vulnerability-summary.md + echo "Commit: ${{ env.COMMIT_ID }}" >> vulnerability-summary.md + echo "" >> vulnerability-summary.md + + HAS_VULNS=false + + if [ -s trivy-code-results.json ]; then + COUNT=$(jq '[.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[]] | length' trivy-code-results.json) + if [ "$COUNT" -gt 0 ]; then + HAS_VULNS=true + echo "### Code Vulnerabilities Detected: $COUNT" >> vulnerability-summary.md + echo "| Severity | ID | Package | Version | Description |" >> vulnerability-summary.md + echo "|----------|----|---------|---------|-------------|" >> vulnerability-summary.md + jq -r '.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[] | + "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-code-results.json >> vulnerability-summary.md + fi + fi + + if [ -s trivy-docker-results.json ]; then + COUNT=$(jq '[.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[]] | length' trivy-docker-results.json) + if [ "$COUNT" -gt 0 ]; then + HAS_VULNS=true + echo "### Docker Image Vulnerabilities Detected: $COUNT" >> vulnerability-summary.md + echo "| Severity | ID | Package | Version | Description |" >> vulnerability-summary.md + echo "|----------|----|---------|---------|-------------|" >> vulnerability-summary.md + jq -r '.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[] | + "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-docker-results.json >> vulnerability-summary.md + fi + fi + + echo "has_vulnerabilities=$HAS_VULNS" >> $GITHUB_OUTPUT + cat vulnerability-summary.md + + - name: Upload Summary Markdown + uses: actions/upload-artifact@v4 + if: always() + with: + name: vulnerability-summary-${{ env.COMMIT_ID }} + path: vulnerability-summary.md + + - name: Extract Code Owners + id: codeowners + if: always() + run: | + if [ -f "CODEOWNERS" ]; then + OWNERS=$(grep -v "^#" CODEOWNERS | grep -o '@[^ ]*' | sort -u | tr '\n' ',' | sed 's/,$//') + echo "owners=$OWNERS" >> $GITHUB_OUTPUT + else + echo "owners=" >> $GITHUB_OUTPUT + fi + + - name: Send Email Notification + if: always() && (steps.summary.outputs.has_vulnerabilities == 'true' || failure()) + uses: dawidd6/action-send-mail@v3 + with: + server_address: ${{ secrets.SMTP_SERVER }} + server_port: ${{ secrets.SMTP_PORT }} + username: ${{ secrets.SMTP_USERNAME }} + password: ${{ secrets.SMTP_PASSWORD }} + subject: > + ${{ + (failure() && '🚨 Scan Failed: ') || + (steps.summary.outputs.has_vulnerabilities == 'true' && '⚠️ Vulnerabilities Found: ') || + '✅ Scan Completed: ' + }}Security Scan for ${{ github.repository }} + body: | +

View workflow run | commit

+ ${{ fileContents('vulnerability-summary.md') }} +

Download full reports from workflow artifacts.

+ to: ${{ steps.codeowners.outputs.owners || secrets.SECURITY_EMAIL_RECIPIENTS }} + from: GitHub Actions + content_type: text/html From 0ed37a7f81fc28eb3db50f34dbe0da885f34c267 Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Thu, 24 Apr 2025 17:23:39 +0530 Subject: [PATCH 02/34] Update trivy.yml --- .github/workflows/trivy.yml | 143 ++++++++++++++++++++---------------- 1 file changed, 80 insertions(+), 63 deletions(-) diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index 67cf6d1fcb..f4c38a6b02 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -34,29 +34,34 @@ jobs: run: | curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sudo sh -s -- -b /usr/local/bin - - name: Run Trivy code vulnerability scanner (JSON) - continue-on-error: true + - name: Run Trivy code vulnerability scanner (JSON Output) run: | - trivy fs \ - --quiet \ - --format json \ - --output trivy-code-results.json \ - --ignore-unfixed \ - --vuln-type os,library \ - --severity CRITICAL,HIGH,MEDIUM . - - - name: Upload Trivy Code JSON + trivy --quiet fs \ + --format json \ + --output trivy-code-results.json \ + --ignore-unfixed \ + --vuln-type os,library \ + --severity CRITICAL,HIGH,MEDIUM \ + . + + - name: Display Trivy code Scan Results + if: failure() + run: | + echo "Trivy Scan Results:" + cat trivy-code-results.json | jq '.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[] | {VulnerabilityID, PkgName, InstalledVersion, Severity, Description}' + + - name: Upload Code Vulnerability Scan Results uses: actions/upload-artifact@v4 with: - name: trivy-code-report-${{ env.COMMIT_ID }} + name: trivy-code-report-json path: trivy-code-results.json - - name: Build Docker Image + - name: Build an image from Dockerfile run: | docker build --pull -t docker.io/securefederatedai/openfl:${{ github.sha }} -f openfl-docker/Dockerfile.base . - - name: Trivy scan for Docker image (JSON) - id: trivy-image-json + - name: Run Trivy vulnerability scanner for Docker image (JSON Output) + id: trivy-scan uses: aquasecurity/trivy-action@0.30.0 with: image-ref: 'docker.io/securefederatedai/openfl:${{ github.sha }}' @@ -67,32 +72,40 @@ jobs: vuln-type: 'os,library' severity: 'CRITICAL,HIGH,MEDIUM' trivyignores: '.trivyignore' - continue-on-error: true - - name: Upload Trivy Docker JSON + - name: Display Trivy Docker Scan Results + if: failure() + run: | + if [ -s trivy-docker-results.json ]; then + echo "Trivy Scan Results:" + cat trivy-docker-results.json | jq '.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[] | {VulnerabilityID, PkgName, InstalledVersion, Severity, Description}' + else + echo "Trivy scan results file is empty or not found." + fi + + - name: Upload final Trivy Docker Vulnerability Scan uses: actions/upload-artifact@v4 with: - name: trivy-docker-report-${{ env.COMMIT_ID }} + name: trivy-docker-report-json path: trivy-docker-results.json - - name: Trivy scan for code (SPDX) - continue-on-error: true + - name: Run Trivy code vulnerability scanner (SPDX-JSON Output) run: | - trivy fs \ - --quiet \ - --format spdx-json \ - --output trivy-code-spdx-results.json \ - --ignore-unfixed \ - --vuln-type os,library \ - --severity CRITICAL,HIGH,MEDIUM . - - - name: Upload Trivy SPDX Code + trivy --quiet fs \ + --format spdx-json \ + --output trivy-code-spdx-results.json \ + --ignore-unfixed \ + --vuln-type os,library \ + --severity CRITICAL,HIGH,MEDIUM \ + . + + - name: Upload SPDX Code Vulnerability Scan Results uses: actions/upload-artifact@v4 with: - name: trivy-code-spdx-${{ env.COMMIT_ID }} + name: trivy-code-spdx-report-json path: trivy-code-spdx-results.json - - name: Trivy scan for Docker image (SPDX) + - name: Run Trivy vulnerability scanner for Docker image (SPDX-JSON Output) uses: aquasecurity/trivy-action@0.30.0 with: image-ref: 'docker.io/securefederatedai/openfl:${{ github.sha }}' @@ -103,12 +116,11 @@ jobs: vuln-type: 'os,library' severity: 'CRITICAL,HIGH,MEDIUM' trivyignores: '.trivyignore' - continue-on-error: true - - name: Upload Trivy SPDX Docker + - name: Upload SPDX Docker Vulnerability Scan uses: actions/upload-artifact@v4 with: - name: trivy-docker-spdx-${{ env.COMMIT_ID }} + name: trivy-docker-spdx-report-json path: trivy-docker-spdx-results.json - name: Generate Vulnerability Summary @@ -120,41 +132,38 @@ jobs: echo "Repository: ${{ github.repository }}" >> vulnerability-summary.md echo "Commit: ${{ env.COMMIT_ID }}" >> vulnerability-summary.md echo "" >> vulnerability-summary.md - - HAS_VULNS=false - + if [ -s trivy-code-results.json ]; then - COUNT=$(jq '[.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[]] | length' trivy-code-results.json) - if [ "$COUNT" -gt 0 ]; then - HAS_VULNS=true - echo "### Code Vulnerabilities Detected: $COUNT" >> vulnerability-summary.md - echo "| Severity | ID | Package | Version | Description |" >> vulnerability-summary.md - echo "|----------|----|---------|---------|-------------|" >> vulnerability-summary.md - jq -r '.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[] | - "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-code-results.json >> vulnerability-summary.md + VULN_COUNT=$(jq '[.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[]] | length' trivy-code-results.json) + if [ "$VULN_COUNT" -gt 0 ]; then + echo "### Code Vulnerabilities Detected: $VULN_COUNT" >> vulnerability-summary.md + echo "" >> vulnerability-summary.md + echo "| Severity | Vulnerability ID | Package | Version | Description |" >> vulnerability-summary.md + echo "|----------|------------------|---------|---------|-------------|" >> vulnerability-summary.md + jq -r '.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[] | "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-code-results.json >> vulnerability-summary.md + echo "has_vulnerabilities=true" >> $GITHUB_OUTPUT fi fi if [ -s trivy-docker-results.json ]; then - COUNT=$(jq '[.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[]] | length' trivy-docker-results.json) - if [ "$COUNT" -gt 0 ]; then - HAS_VULNS=true - echo "### Docker Image Vulnerabilities Detected: $COUNT" >> vulnerability-summary.md - echo "| Severity | ID | Package | Version | Description |" >> vulnerability-summary.md - echo "|----------|----|---------|---------|-------------|" >> vulnerability-summary.md - jq -r '.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[] | - "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-docker-results.json >> vulnerability-summary.md + VULN_COUNT=$(jq '[.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[]] | length' trivy-docker-results.json) + if [ "$VULN_COUNT" -gt 0 ]; then + echo "### Docker Image Vulnerabilities Detected: $VULN_COUNT" >> vulnerability-summary.md + echo "" >> vulnerability-summary.md + echo "| Severity | Vulnerability ID | Package | Version | Description |" >> vulnerability-summary.md + echo "|----------|------------------|---------|---------|-------------|" >> vulnerability-summary.md + jq -r '.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[] | "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-docker-results.json >> vulnerability-summary.md + echo "has_vulnerabilities=true" >> $GITHUB_OUTPUT fi fi - echo "has_vulnerabilities=$HAS_VULNS" >> $GITHUB_OUTPUT cat vulnerability-summary.md - - name: Upload Summary Markdown + - name: Upload Vulnerability Summary uses: actions/upload-artifact@v4 if: always() with: - name: vulnerability-summary-${{ env.COMMIT_ID }} + name: vulnerability-summary path: vulnerability-summary.md - name: Extract Code Owners @@ -164,12 +173,24 @@ jobs: if [ -f "CODEOWNERS" ]; then OWNERS=$(grep -v "^#" CODEOWNERS | grep -o '@[^ ]*' | sort -u | tr '\n' ',' | sed 's/,$//') echo "owners=$OWNERS" >> $GITHUB_OUTPUT + echo "Found code owners: $OWNERS" else + echo "No CODEOWNERS file found, using default recipients" echo "owners=" >> $GITHUB_OUTPUT fi + - name: Read vulnerability summary into output + id: read_summary + if: always() + run: | + { + echo "summary<> $GITHUB_OUTPUT + - name: Send Email Notification - if: always() && (steps.summary.outputs.has_vulnerabilities == 'true' || failure()) + if: always() uses: dawidd6/action-send-mail@v3 with: server_address: ${{ secrets.SMTP_SERVER }} @@ -177,14 +198,10 @@ jobs: username: ${{ secrets.SMTP_USERNAME }} password: ${{ secrets.SMTP_PASSWORD }} subject: > - ${{ - (failure() && '🚨 Scan Failed: ') || - (steps.summary.outputs.has_vulnerabilities == 'true' && '⚠️ Vulnerabilities Found: ') || - '✅ Scan Completed: ' - }}Security Scan for ${{ github.repository }} + ${{ steps.summary.outputs.has_vulnerabilities == 'true' && '⚠️ Vulnerabilities Found:' || '✅ Scan Completed:' }} Security Scan for ${{ github.repository }} body: |

View workflow run | commit

- ${{ fileContents('vulnerability-summary.md') }} + ${{ steps.read_summary.outputs.summary }}

Download full reports from workflow artifacts.

to: ${{ steps.codeowners.outputs.owners || secrets.SECURITY_EMAIL_RECIPIENTS }} from: GitHub Actions From 2d37918241f60c307da5cb054a1c200cd5a525a7 Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Thu, 24 Apr 2025 17:50:41 +0530 Subject: [PATCH 03/34] Update trivy.yml --- .github/workflows/trivy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index f4c38a6b02..7d6b1032a0 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -199,10 +199,10 @@ jobs: password: ${{ secrets.SMTP_PASSWORD }} subject: > ${{ steps.summary.outputs.has_vulnerabilities == 'true' && '⚠️ Vulnerabilities Found:' || '✅ Scan Completed:' }} Security Scan for ${{ github.repository }} - body: | + html_body: |

View workflow run | commit

${{ steps.read_summary.outputs.summary }}

Download full reports from workflow artifacts.

to: ${{ steps.codeowners.outputs.owners || secrets.SECURITY_EMAIL_RECIPIENTS }} from: GitHub Actions - content_type: text/html + From 19d040bf95f456a57d975d4d1aae34e956bcb1c8 Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Fri, 25 Apr 2025 11:23:04 +0530 Subject: [PATCH 04/34] Create extract_emails.py --- .github/scripts/extract_emails.py | 45 +++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 .github/scripts/extract_emails.py diff --git a/.github/scripts/extract_emails.py b/.github/scripts/extract_emails.py new file mode 100644 index 0000000000..70f17b64a6 --- /dev/null +++ b/.github/scripts/extract_emails.py @@ -0,0 +1,45 @@ +import re +import os +import sys +import json + +def extract_emails(filepath): + """ + Extract all unique email addresses from the given file. + """ + email_pattern = r'[\w.+-]+@[\w-]+\.[\w.-]+' + unique_emails = set() + + try: + with open(filepath, 'r') as file: + for line in file: + # Skip comment lines that don't contain emails + if line.strip().startswith('#') and '@' not in line: + continue + + # Find all email addresses in the line + emails = re.findall(email_pattern, line) + unique_emails.update(emails) + except Exception as e: + print(f"Error processing {filepath}: {str(e)}", file=sys.stderr) + + return sorted(unique_emails) + +if __name__ == "__main__": + # Check CODEOWNERS in standard locations + codeowners_path = None + for path in ['.github/CODEOWNERS', 'CODEOWNERS', 'docs/CODEOWNERS']: + if os.path.exists(path): + codeowners_path = path + break + + result = { + "emails": [], + "codeowners_path": codeowners_path + } + + if codeowners_path: + emails = extract_emails(codeowners_path) + result["emails"] = emails + + print(json.dumps(result)) From 025d67d0c0ac67d889b64ca11e763f73a13d0b78 Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Fri, 25 Apr 2025 11:25:25 +0530 Subject: [PATCH 05/34] Update trivy.yml --- .github/workflows/trivy.yml | 273 ++++++++++++++++-------------------- 1 file changed, 121 insertions(+), 152 deletions(-) diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index 7d6b1032a0..8e7c6c60ac 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -1,5 +1,4 @@ -name: Trivy Nightly Scan - +name: Trivy Nightly Security Scan on: workflow_call: inputs: @@ -8,201 +7,171 @@ on: type: string workflow_dispatch: schedule: - - cron: '0 0 * * *' # Every night at midnight UTC + - cron: '0 0 * * *' # Runs daily at midnight UTC jobs: - build: + security-scan: if: github.event.pull_request.draft == false permissions: contents: read security-events: write actions: read + packages: read + issues: write # Needed for creating issues if vulnerabilities found runs-on: ubuntu-22.04 - timeout-minutes: 15 - + timeout-minutes: 45 env: - TRIVY_DB_REPOSITORY: 'ghcr.io/aquasecurity/trivy-db,public.ecr.aws/aquasecurity/trivy-db' + TRIVY_VERSION: 0.50.1 COMMIT_ID: ${{ inputs.commit_id || github.sha }} steps: - - name: Checkout code + # ============ SETUP PHASE ============ + - name: Checkout repository uses: actions/checkout@v4 with: ref: ${{ env.COMMIT_ID }} + fetch-depth: 0 - - name: Install Trivy - run: | - curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sudo sh -s -- -b /usr/local/bin - - - name: Run Trivy code vulnerability scanner (JSON Output) - run: | - trivy --quiet fs \ - --format json \ - --output trivy-code-results.json \ - --ignore-unfixed \ - --vuln-type os,library \ - --severity CRITICAL,HIGH,MEDIUM \ - . - - - name: Display Trivy code Scan Results - if: failure() - run: | - echo "Trivy Scan Results:" - cat trivy-code-results.json | jq '.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[] | {VulnerabilityID, PkgName, InstalledVersion, Severity, Description}' - - - name: Upload Code Vulnerability Scan Results - uses: actions/upload-artifact@v4 - with: - name: trivy-code-report-json - path: trivy-code-results.json - - - name: Build an image from Dockerfile - run: | - docker build --pull -t docker.io/securefederatedai/openfl:${{ github.sha }} -f openfl-docker/Dockerfile.base . - - - name: Run Trivy vulnerability scanner for Docker image (JSON Output) - id: trivy-scan + # ============ SCANNING PHASE ============ + - name: Run security scans uses: aquasecurity/trivy-action@0.30.0 with: - image-ref: 'docker.io/securefederatedai/openfl:${{ github.sha }}' + scan-type: 'fs' format: 'json' - output: 'trivy-docker-results.json' - exit-code: '1' + output: 'trivy-fs-report.json' + severity: 'CRITICAL,HIGH' ignore-unfixed: true vuln-type: 'os,library' - severity: 'CRITICAL,HIGH,MEDIUM' - trivyignores: '.trivyignore' - - - name: Display Trivy Docker Scan Results - if: failure() - run: | - if [ -s trivy-docker-results.json ]; then - echo "Trivy Scan Results:" - cat trivy-docker-results.json | jq '.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[] | {VulnerabilityID, PkgName, InstalledVersion, Severity, Description}' - else - echo "Trivy scan results file is empty or not found." - fi - - - name: Upload final Trivy Docker Vulnerability Scan - uses: actions/upload-artifact@v4 - with: - name: trivy-docker-report-json - path: trivy-docker-results.json + security-checks: 'vuln' - - name: Run Trivy code vulnerability scanner (SPDX-JSON Output) + - name: Build Docker image run: | - trivy --quiet fs \ - --format spdx-json \ - --output trivy-code-spdx-results.json \ - --ignore-unfixed \ - --vuln-type os,library \ - --severity CRITICAL,HIGH,MEDIUM \ - . - - - name: Upload SPDX Code Vulnerability Scan Results - uses: actions/upload-artifact@v4 - with: - name: trivy-code-spdx-report-json - path: trivy-code-spdx-results.json - - - name: Run Trivy vulnerability scanner for Docker image (SPDX-JSON Output) + docker buildx build \ + --pull \ + --tag local/scan-target:${{ github.run_id }} \ + --file openfl-docker/Dockerfile.base \ + --load \ + . + + - name: Scan Docker image uses: aquasecurity/trivy-action@0.30.0 with: - image-ref: 'docker.io/securefederatedai/openfl:${{ github.sha }}' - format: 'spdx-json' - output: 'trivy-docker-spdx-results.json' - exit-code: '1' + image-ref: 'local/scan-target:${{ github.run_id }}' + format: 'json' + output: 'trivy-image-report.json' + severity: 'CRITICAL,HIGH' ignore-unfixed: true vuln-type: 'os,library' - severity: 'CRITICAL,HIGH,MEDIUM' - trivyignores: '.trivyignore' + security-checks: 'vuln' - - name: Upload SPDX Docker Vulnerability Scan - uses: actions/upload-artifact@v4 - with: - name: trivy-docker-spdx-report-json - path: trivy-docker-spdx-results.json + # ============ REPORTING PHASE ============ + - name: Generate SBOM reports + run: | + trivy fs --format spdx-json --output trivy-fs-sbom.json . + trivy image --format spdx-json --output trivy-image-sbom.json local/scan-target:${{ github.run_id }} - - name: Generate Vulnerability Summary - id: summary - if: always() + - name: Create consolidated report + id: report run: | - echo "## Trivy Security Scan Summary" > vulnerability-summary.md - echo "Scan Date: $(date)" >> vulnerability-summary.md - echo "Repository: ${{ github.repository }}" >> vulnerability-summary.md - echo "Commit: ${{ env.COMMIT_ID }}" >> vulnerability-summary.md - echo "" >> vulnerability-summary.md - - if [ -s trivy-code-results.json ]; then - VULN_COUNT=$(jq '[.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[]] | length' trivy-code-results.json) - if [ "$VULN_COUNT" -gt 0 ]; then - echo "### Code Vulnerabilities Detected: $VULN_COUNT" >> vulnerability-summary.md - echo "" >> vulnerability-summary.md - echo "| Severity | Vulnerability ID | Package | Version | Description |" >> vulnerability-summary.md - echo "|----------|------------------|---------|---------|-------------|" >> vulnerability-summary.md - jq -r '.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[] | "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-code-results.json >> vulnerability-summary.md - echo "has_vulnerabilities=true" >> $GITHUB_OUTPUT + # Initialize markdown report + echo "# Security Scan Report - OpenFL" > report.md + echo "**Scan Date:** $(date -u '+%Y-%m-%d %H:%M:%S UTC')" >> report.md + echo "**Commit:** [${{ env.COMMIT_ID }}](https://github.com/rajithkrishnegowda/openfl/commit/${{ env.COMMIT_ID }})" >> report.md + echo -e "\n## Vulnerability Summary\n" >> report.md + + # Process filesystem results + if [ -f "trivy-fs-report.json" ]; then + FS_VULNS=$(jq '[.Results[]?.Vulnerabilities[]?] | length' trivy-fs-report.json || echo 0) + echo "### Filesystem Scans" >> report.md + echo "**Critical/High Vulnerabilities:** $FS_VULNS" >> report.md + + if [ "$FS_VULNS" -gt 0 ]; then + echo -e "\n| Severity | ID | Package | Version | Description |" >> report.md + echo "|----------|----|---------|---------|-------------|" >> report.md + jq -r '.Results[]?.Vulnerabilities[]? | "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-fs-report.json >> report.md + echo "::set-output name=has_vulnerabilities::true" fi fi - if [ -s trivy-docker-results.json ]; then - VULN_COUNT=$(jq '[.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[]] | length' trivy-docker-results.json) - if [ "$VULN_COUNT" -gt 0 ]; then - echo "### Docker Image Vulnerabilities Detected: $VULN_COUNT" >> vulnerability-summary.md - echo "" >> vulnerability-summary.md - echo "| Severity | Vulnerability ID | Package | Version | Description |" >> vulnerability-summary.md - echo "|----------|------------------|---------|---------|-------------|" >> vulnerability-summary.md - jq -r '.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[] | "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-docker-results.json >> vulnerability-summary.md - echo "has_vulnerabilities=true" >> $GITHUB_OUTPUT + # Process image results + if [ -f "trivy-image-report.json" ]; then + IMG_VULNS=$(jq '[.Results[]?.Vulnerabilities[]?] | length' trivy-image-report.json || echo 0) + echo -e "\n### Container Image Scans" >> report.md + echo "**Critical/High Vulnerabilities:** $IMG_VULNS" >> report.md + + if [ "$IMG_VULNS" -gt 0 ]; then + echo -e "\n| Severity | ID | Package | Version | Description |" >> report.md + echo "|----------|----|---------|---------|-------------|" >> report.md + jq -r '.Results[]?.Vulnerabilities[]? | "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-image-report.json >> report.md + echo "::set-output name=has_vulnerabilities::true" fi fi - cat vulnerability-summary.md + # Add artifact download links + echo -e "\n## Next Steps\n" >> report.md + echo "1. Review the full reports in the workflow artifacts" >> report.md + echo "2. Address critical vulnerabilities immediately" >> report.md + echo "3. Create GitHub issues for tracking remediation" >> report.md - - name: Upload Vulnerability Summary - uses: actions/upload-artifact@v4 - if: always() - with: - name: vulnerability-summary - path: vulnerability-summary.md + cat report.md - - name: Extract Code Owners + # ============ NOTIFICATION PHASE ============ + - name: Extract CODEOWNERS emails id: codeowners - if: always() run: | - if [ -f "CODEOWNERS" ]; then - OWNERS=$(grep -v "^#" CODEOWNERS | grep -o '@[^ ]*' | sort -u | tr '\n' ',' | sed 's/,$//') - echo "owners=$OWNERS" >> $GITHUB_OUTPUT - echo "Found code owners: $OWNERS" - else - echo "No CODEOWNERS file found, using default recipients" - echo "owners=" >> $GITHUB_OUTPUT + # Install Python if not already present + if ! command -v python &> /dev/null; then + sudo apt-get update && sudo apt-get install -y python3 fi - - name: Read vulnerability summary into output - id: read_summary - if: always() - run: | - { - echo "summary<> $GITHUB_OUTPUT - - - name: Send Email Notification - if: always() + # Run the Python script + OUTPUT=$(python .github/scripts/extract_emails.py) + echo "Extracted emails: $OUTPUT" + + # Parse JSON output and set outputs + EMAILS=$(echo "$OUTPUT" | jq -r '.emails | join(",")') + echo "emails=${EMAILS:-${{ secrets.SECURITY_EMAIL_RECIPIENTS }}}" >> $GITHUB_OUTPUT + echo "codeowners_path=$(echo "$OUTPUT" | jq -r '.codeowners_path')" >> $GITHUB_OUTPUT + + env: + PYTHONIOENCODING: utf-8 + + - name: Send email notification + if: always() && (steps.report.outputs.has_vulnerabilities == 'true' || failure()) uses: dawidd6/action-send-mail@v3 with: server_address: ${{ secrets.SMTP_SERVER }} server_port: ${{ secrets.SMTP_PORT }} username: ${{ secrets.SMTP_USERNAME }} password: ${{ secrets.SMTP_PASSWORD }} - subject: > - ${{ steps.summary.outputs.has_vulnerabilities == 'true' && '⚠️ Vulnerabilities Found:' || '✅ Scan Completed:' }} Security Scan for ${{ github.repository }} - html_body: | -

View workflow run | commit

- ${{ steps.read_summary.outputs.summary }} -

Download full reports from workflow artifacts.

- to: ${{ steps.codeowners.outputs.owners || secrets.SECURITY_EMAIL_RECIPIENTS }} - from: GitHub Actions - + subject: | + ${{ + failure() && '🚨 OpenFL Security Scan Failed' || + steps.report.outputs.has_vulnerabilities == 'true' && '⚠️ OpenFL Vulnerabilities Found' || + '✅ OpenFL Security Scan Passed' + }} + body: file://report.md + to: ${{ steps.codeowners.outputs.owners }} + from: "OpenFL Security Bot " + content_type: text/html + convert_markdown: true + + # ============ ARTIFACT UPLOADS ============ + - name: Upload scan artifacts + uses: actions/upload-artifact@v4 + with: + name: security-reports-${{ github.run_id }} + path: | + trivy-fs-report.json + trivy-image-report.json + trivy-fs-sbom.json + trivy-image-sbom.json + report.md + retention-days: 30 + + # ============ FAILURE HANDLING ============ + - name: Fail workflow if vulnerabilities found + if: steps.report.outputs.has_vulnerabilities == 'true' && github.event_name != 'schedule' + run: | + echo "::error::Critical/High vulnerabilities detected!" + exit 1 From 2d99f1e71c985a51b2aaf7ac2286f2b823c5c2d1 Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Fri, 25 Apr 2025 11:26:10 +0530 Subject: [PATCH 06/34] Update CODEOWNERS --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index cb0b89fc6b..b36cb38d58 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -30,6 +30,6 @@ /scripts/ aayush.garg@intel.com giribabu.bikki@intel.com karan.shah@intel.com patrick.foley@intel.com srikanth.enugula@intel.com teodor.parvanov@intel.com # File level ownership -CODEOWNERS aayush.garg@intel.com giribabu.bikki@intel.com patrick.foley@intel.com preethi.asokan@intel.com rahul.garg@intel.com srikanth.enugula@intel.com teodor.parvanov@intel.com +CODEOWNERS akshay.pant@intel.com karan.shah@intel.com kevin.ta@intel.com noopur@intel.com patrick.foley@intel.com payal.chaurasiya@intel.com rahul.garg@intel.com rajith.krishnegowda@intel.com shailesh.pant@intel.com shailesh.tanwar@intel.com teodor.parvanov@intel.com test-requirements.txt akshay.pant@intel.com karan.shah@intel.com kevin.ta@intel.com noopur@intel.com patrick.foley@intel.com payal.chaurasiya@intel.com rahul.garg@intel.com rajith.krishnegowda@intel.com shailesh.pant@intel.com shailesh.tanwar@intel.com teodor.parvanov@intel.com From 522ad36cc150c709203b0fc0eb7aaeea880f434e Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Fri, 25 Apr 2025 11:30:33 +0530 Subject: [PATCH 07/34] Update trivy.yml --- .github/workflows/trivy.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index 8e7c6c60ac..357a0d292a 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -144,14 +144,13 @@ jobs: server_port: ${{ secrets.SMTP_PORT }} username: ${{ secrets.SMTP_USERNAME }} password: ${{ secrets.SMTP_PASSWORD }} - subject: | - ${{ - failure() && '🚨 OpenFL Security Scan Failed' || - steps.report.outputs.has_vulnerabilities == 'true' && '⚠️ OpenFL Vulnerabilities Found' || - '✅ OpenFL Security Scan Passed' - }} + subject: ${{ + (failure() && '🚨 OpenFL Security Scan Failed') || + (steps.report.outputs.has_vulnerabilities == 'true' && '⚠️ OpenFL Vulnerabilities Found') || + '✅ OpenFL Security Scan Passed' + }} body: file://report.md - to: ${{ steps.codeowners.outputs.owners }} + to: ${{ steps.codeowners.outputs.emails }} from: "OpenFL Security Bot " content_type: text/html convert_markdown: true From eaa2bcc1bea16c18b25366df9fd2435d581e7315 Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Fri, 25 Apr 2025 11:33:31 +0530 Subject: [PATCH 08/34] Update trivy.yml --- .github/workflows/trivy.yml | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index 357a0d292a..124f32e725 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -17,7 +17,7 @@ jobs: security-events: write actions: read packages: read - issues: write # Needed for creating issues if vulnerabilities found + issues: write runs-on: ubuntu-22.04 timeout-minutes: 45 env: @@ -33,7 +33,7 @@ jobs: fetch-depth: 0 # ============ SCANNING PHASE ============ - - name: Run security scans + - name: Run filesystem scan uses: aquasecurity/trivy-action@0.30.0 with: scan-type: 'fs' @@ -89,7 +89,7 @@ jobs: echo -e "\n| Severity | ID | Package | Version | Description |" >> report.md echo "|----------|----|---------|---------|-------------|" >> report.md jq -r '.Results[]?.Vulnerabilities[]? | "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-fs-report.json >> report.md - echo "::set-output name=has_vulnerabilities::true" + echo "has_vulnerabilities=true" >> $GITHUB_OUTPUT fi fi @@ -103,7 +103,7 @@ jobs: echo -e "\n| Severity | ID | Package | Version | Description |" >> report.md echo "|----------|----|---------|---------|-------------|" >> report.md jq -r '.Results[]?.Vulnerabilities[]? | "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-image-report.json >> report.md - echo "::set-output name=has_vulnerabilities::true" + echo "has_vulnerabilities=true" >> $GITHUB_OUTPUT fi fi @@ -116,19 +116,27 @@ jobs: cat report.md # ============ NOTIFICATION PHASE ============ + - name: Set notification subject + id: set-subject + run: | + if [[ "${{ job.status }}" == "failure" ]]; then + echo "subject=🚨 OpenFL Security Scan Failed" >> $GITHUB_OUTPUT + elif [[ "${{ steps.report.outputs.has_vulnerabilities }}" == "true" ]]; then + echo "subject=⚠️ OpenFL Vulnerabilities Found" >> $GITHUB_OUTPUT + else + echo "subject=✅ OpenFL Security Scan Passed" >> $GITHUB_OUTPUT + fi + - name: Extract CODEOWNERS emails id: codeowners run: | - # Install Python if not already present if ! command -v python &> /dev/null; then sudo apt-get update && sudo apt-get install -y python3 fi - # Run the Python script OUTPUT=$(python .github/scripts/extract_emails.py) echo "Extracted emails: $OUTPUT" - # Parse JSON output and set outputs EMAILS=$(echo "$OUTPUT" | jq -r '.emails | join(",")') echo "emails=${EMAILS:-${{ secrets.SECURITY_EMAIL_RECIPIENTS }}}" >> $GITHUB_OUTPUT echo "codeowners_path=$(echo "$OUTPUT" | jq -r '.codeowners_path')" >> $GITHUB_OUTPUT @@ -144,11 +152,7 @@ jobs: server_port: ${{ secrets.SMTP_PORT }} username: ${{ secrets.SMTP_USERNAME }} password: ${{ secrets.SMTP_PASSWORD }} - subject: ${{ - (failure() && '🚨 OpenFL Security Scan Failed') || - (steps.report.outputs.has_vulnerabilities == 'true' && '⚠️ OpenFL Vulnerabilities Found') || - '✅ OpenFL Security Scan Passed' - }} + subject: ${{ steps.set-subject.outputs.subject }} body: file://report.md to: ${{ steps.codeowners.outputs.emails }} from: "OpenFL Security Bot " From 9601e1d77ae51a0570e26ca69b4b0734c80619d3 Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Fri, 25 Apr 2025 11:43:55 +0530 Subject: [PATCH 09/34] Update trivy.yml --- .github/workflows/trivy.yml | 125 ++++-------------------------------- 1 file changed, 12 insertions(+), 113 deletions(-) diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index 124f32e725..4279b4beed 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -25,95 +25,7 @@ jobs: COMMIT_ID: ${{ inputs.commit_id || github.sha }} steps: - # ============ SETUP PHASE ============ - - name: Checkout repository - uses: actions/checkout@v4 - with: - ref: ${{ env.COMMIT_ID }} - fetch-depth: 0 - - # ============ SCANNING PHASE ============ - - name: Run filesystem scan - uses: aquasecurity/trivy-action@0.30.0 - with: - scan-type: 'fs' - format: 'json' - output: 'trivy-fs-report.json' - severity: 'CRITICAL,HIGH' - ignore-unfixed: true - vuln-type: 'os,library' - security-checks: 'vuln' - - - name: Build Docker image - run: | - docker buildx build \ - --pull \ - --tag local/scan-target:${{ github.run_id }} \ - --file openfl-docker/Dockerfile.base \ - --load \ - . - - - name: Scan Docker image - uses: aquasecurity/trivy-action@0.30.0 - with: - image-ref: 'local/scan-target:${{ github.run_id }}' - format: 'json' - output: 'trivy-image-report.json' - severity: 'CRITICAL,HIGH' - ignore-unfixed: true - vuln-type: 'os,library' - security-checks: 'vuln' - - # ============ REPORTING PHASE ============ - - name: Generate SBOM reports - run: | - trivy fs --format spdx-json --output trivy-fs-sbom.json . - trivy image --format spdx-json --output trivy-image-sbom.json local/scan-target:${{ github.run_id }} - - - name: Create consolidated report - id: report - run: | - # Initialize markdown report - echo "# Security Scan Report - OpenFL" > report.md - echo "**Scan Date:** $(date -u '+%Y-%m-%d %H:%M:%S UTC')" >> report.md - echo "**Commit:** [${{ env.COMMIT_ID }}](https://github.com/rajithkrishnegowda/openfl/commit/${{ env.COMMIT_ID }})" >> report.md - echo -e "\n## Vulnerability Summary\n" >> report.md - - # Process filesystem results - if [ -f "trivy-fs-report.json" ]; then - FS_VULNS=$(jq '[.Results[]?.Vulnerabilities[]?] | length' trivy-fs-report.json || echo 0) - echo "### Filesystem Scans" >> report.md - echo "**Critical/High Vulnerabilities:** $FS_VULNS" >> report.md - - if [ "$FS_VULNS" -gt 0 ]; then - echo -e "\n| Severity | ID | Package | Version | Description |" >> report.md - echo "|----------|----|---------|---------|-------------|" >> report.md - jq -r '.Results[]?.Vulnerabilities[]? | "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-fs-report.json >> report.md - echo "has_vulnerabilities=true" >> $GITHUB_OUTPUT - fi - fi - - # Process image results - if [ -f "trivy-image-report.json" ]; then - IMG_VULNS=$(jq '[.Results[]?.Vulnerabilities[]?] | length' trivy-image-report.json || echo 0) - echo -e "\n### Container Image Scans" >> report.md - echo "**Critical/High Vulnerabilities:** $IMG_VULNS" >> report.md - - if [ "$IMG_VULNS" -gt 0 ]; then - echo -e "\n| Severity | ID | Package | Version | Description |" >> report.md - echo "|----------|----|---------|---------|-------------|" >> report.md - jq -r '.Results[]?.Vulnerabilities[]? | "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-image-report.json >> report.md - echo "has_vulnerabilities=true" >> $GITHUB_OUTPUT - fi - fi - - # Add artifact download links - echo -e "\n## Next Steps\n" >> report.md - echo "1. Review the full reports in the workflow artifacts" >> report.md - echo "2. Address critical vulnerabilities immediately" >> report.md - echo "3. Create GitHub issues for tracking remediation" >> report.md - - cat report.md + # [Previous steps remain unchanged...] # ============ NOTIFICATION PHASE ============ - name: Set notification subject @@ -139,11 +51,17 @@ jobs: EMAILS=$(echo "$OUTPUT" | jq -r '.emails | join(",")') echo "emails=${EMAILS:-${{ secrets.SECURITY_EMAIL_RECIPIENTS }}}" >> $GITHUB_OUTPUT - echo "codeowners_path=$(echo "$OUTPUT" | jq -r '.codeowners_path')" >> $GITHUB_OUTPUT env: PYTHONIOENCODING: utf-8 + - name: Convert report to HTML + id: convert-report + run: | + pip install markdown + python -c "import markdown; print(markdown.markdown(open('report.md').read()))" > report.html + echo "html_body=$(cat report.html)" >> $GITHUB_OUTPUT + - name: Send email notification if: always() && (steps.report.outputs.has_vulnerabilities == 'true' || failure()) uses: dawidd6/action-send-mail@v3 @@ -153,28 +71,9 @@ jobs: username: ${{ secrets.SMTP_USERNAME }} password: ${{ secrets.SMTP_PASSWORD }} subject: ${{ steps.set-subject.outputs.subject }} - body: file://report.md + html_body: ${{ steps.convert-report.outputs.html_body }} to: ${{ steps.codeowners.outputs.emails }} - from: "OpenFL Security Bot " - content_type: text/html - convert_markdown: true + from: OpenFL Security Bot + convert_markdown: false - # ============ ARTIFACT UPLOADS ============ - - name: Upload scan artifacts - uses: actions/upload-artifact@v4 - with: - name: security-reports-${{ github.run_id }} - path: | - trivy-fs-report.json - trivy-image-report.json - trivy-fs-sbom.json - trivy-image-sbom.json - report.md - retention-days: 30 - - # ============ FAILURE HANDLING ============ - - name: Fail workflow if vulnerabilities found - if: steps.report.outputs.has_vulnerabilities == 'true' && github.event_name != 'schedule' - run: | - echo "::error::Critical/High vulnerabilities detected!" - exit 1 + # [Remaining steps remain unchanged...] From 7ec5b90c616349c8951774a768f742c916358396 Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Fri, 25 Apr 2025 11:47:20 +0530 Subject: [PATCH 10/34] Update trivy.yml --- .github/workflows/trivy.yml | 110 +++++++++++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 2 deletions(-) diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index 4279b4beed..7b550fb18a 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -25,7 +25,95 @@ jobs: COMMIT_ID: ${{ inputs.commit_id || github.sha }} steps: - # [Previous steps remain unchanged...] + # ============ SETUP PHASE ============ + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: ${{ env.COMMIT_ID }} + fetch-depth: 0 + + # ============ SCANNING PHASE ============ + - name: Run filesystem scan + uses: aquasecurity/trivy-action@0.30.0 + with: + scan-type: 'fs' + format: 'json' + output: 'trivy-fs-report.json' + severity: 'CRITICAL,HIGH' + ignore-unfixed: true + vuln-type: 'os,library' + security-checks: 'vuln' + + - name: Build Docker image + run: | + docker buildx build \ + --pull \ + --tag local/scan-target:${{ github.run_id }} \ + --file openfl-docker/Dockerfile.base \ + --load \ + . + + - name: Scan Docker image + uses: aquasecurity/trivy-action@0.30.0 + with: + image-ref: 'local/scan-target:${{ github.run_id }}' + format: 'json' + output: 'trivy-image-report.json' + severity: 'CRITICAL,HIGH' + ignore-unfixed: true + vuln-type: 'os,library' + security-checks: 'vuln' + + # ============ REPORTING PHASE ============ + - name: Generate SBOM reports + run: | + trivy fs --format spdx-json --output trivy-fs-sbom.json . + trivy image --format spdx-json --output trivy-image-sbom.json local/scan-target:${{ github.run_id }} + + - name: Create consolidated report + id: report + run: | + # Initialize markdown report + echo "# Security Scan Report - OpenFL" > report.md + echo "**Scan Date:** $(date -u '+%Y-%m-%d %H:%M:%S UTC')" >> report.md + echo "**Commit:** [${{ env.COMMIT_ID }}](https://github.com/rajithkrishnegowda/openfl/commit/${{ env.COMMIT_ID }})" >> report.md + echo -e "\n## Vulnerability Summary\n" >> report.md + + # Process filesystem results + if [ -f "trivy-fs-report.json" ]; then + FS_VULNS=$(jq '[.Results[]?.Vulnerabilities[]?] | length' trivy-fs-report.json || echo 0) + echo "### Filesystem Scans" >> report.md + echo "**Critical/High Vulnerabilities:** $FS_VULNS" >> report.md + + if [ "$FS_VULNS" -gt 0 ]; then + echo -e "\n| Severity | ID | Package | Version | Description |" >> report.md + echo "|----------|----|---------|---------|-------------|" >> report.md + jq -r '.Results[]?.Vulnerabilities[]? | "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-fs-report.json >> report.md + echo "has_vulnerabilities=true" >> $GITHUB_OUTPUT + fi + fi + + # Process image results + if [ -f "trivy-image-report.json" ]; then + IMG_VULNS=$(jq '[.Results[]?.Vulnerabilities[]?] | length' trivy-image-report.json || echo 0) + echo -e "\n### Container Image Scans" >> report.md + echo "**Critical/High Vulnerabilities:** $IMG_VULNS" >> report.md + + if [ "$IMG_VULNS" -gt 0 ]; then + echo -e "\n| Severity | ID | Package | Version | Description |" >> report.md + echo "|----------|----|---------|---------|-------------|" >> report.md + jq -r '.Results[]?.Vulnerabilities[]? | "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-image-report.json >> report.md + echo "has_vulnerabilities=true" >> $GITHUB_OUTPUT + fi + fi + + # Add artifact download links + echo -e "\n## Next Steps\n" >> report.md + echo "1. Review the full reports in the workflow artifacts" >> report.md + echo "2. Address critical vulnerabilities immediately" >> report.md + echo "3. Create GitHub issues for tracking remediation" >> report.md + + cat report.md # ============ NOTIFICATION PHASE ============ - name: Set notification subject @@ -76,4 +164,22 @@ jobs: from: OpenFL Security Bot convert_markdown: false - # [Remaining steps remain unchanged...] + # ============ ARTIFACT UPLOADS ============ + - name: Upload scan artifacts + uses: actions/upload-artifact@v4 + with: + name: security-reports-${{ github.run_id }} + path: | + trivy-fs-report.json + trivy-image-report.json + trivy-fs-sbom.json + trivy-image-sbom.json + report.md + retention-days: 30 + + # ============ FAILURE HANDLING ============ + - name: Fail workflow if vulnerabilities found + if: steps.report.outputs.has_vulnerabilities == 'true' && github.event_name != 'schedule' + run: | + echo "::error::Critical/High vulnerabilities detected!" + exit 1 From 447c9423a23e687491ae85af46445c4c86147570 Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Fri, 25 Apr 2025 11:55:51 +0530 Subject: [PATCH 11/34] Update trivy.yml --- .github/workflows/trivy.yml | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index 7b550fb18a..0380bdf26b 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -143,23 +143,29 @@ jobs: env: PYTHONIOENCODING: utf-8 - - name: Convert report to HTML - id: convert-report + - name: Prepare HTML email content + id: prepare-email run: | - pip install markdown - python -c "import markdown; print(markdown.markdown(open('report.md').read()))" > report.html - echo "html_body=$(cat report.html)" >> $GITHUB_OUTPUT + # Install markdown processor + python -m pip install markdown + + # Convert markdown to HTML and properly escape for GITHUB_OUTPUT + HTML_CONTENT=$(python -c "import markdown, json; print(json.dumps(markdown.markdown(open('report.md').read())))") + echo "html_body=${HTML_CONTENT}" >> $GITHUB_OUTPUT - name: Send email notification if: always() && (steps.report.outputs.has_vulnerabilities == 'true' || failure()) uses: dawidd6/action-send-mail@v3 with: - server_address: ${{ secrets.SMTP_SERVER }} - server_port: ${{ secrets.SMTP_PORT }} - username: ${{ secrets.SMTP_USERNAME }} - password: ${{ secrets.SMTP_PASSWORD }} + # Try connection_url format if server_address fails + connection_url: ${{ secrets.SMTP_CONNECTION_URL }} # Format: "smtps://user:pass@host:port" + # Alternative if connection_url doesn't work: + # server_address: ${{ secrets.SMTP_SERVER }} + # server_port: ${{ secrets.SMTP_PORT }} + # username: ${{ secrets.SMTP_USERNAME }} + # password: ${{ secrets.SMTP_PASSWORD }} subject: ${{ steps.set-subject.outputs.subject }} - html_body: ${{ steps.convert-report.outputs.html_body }} + html_body: ${{ fromJSON(steps.prepare-email.outputs.html_body) }} to: ${{ steps.codeowners.outputs.emails }} from: OpenFL Security Bot convert_markdown: false From 68f986d127eb8d26133ee925f58dcb0c82fa7f40 Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Fri, 25 Apr 2025 12:26:28 +0530 Subject: [PATCH 12/34] Update trivy.yml --- .github/workflows/trivy.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index 0380bdf26b..1d69915fb8 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -158,12 +158,12 @@ jobs: uses: dawidd6/action-send-mail@v3 with: # Try connection_url format if server_address fails - connection_url: ${{ secrets.SMTP_CONNECTION_URL }} # Format: "smtps://user:pass@host:port" + #connection_url: ${{ secrets.SMTP_CONNECTION_URL }} # Format: "smtps://user:pass@host:port" # Alternative if connection_url doesn't work: - # server_address: ${{ secrets.SMTP_SERVER }} - # server_port: ${{ secrets.SMTP_PORT }} - # username: ${{ secrets.SMTP_USERNAME }} - # password: ${{ secrets.SMTP_PASSWORD }} + server_address: ${{ secrets.SMTP_SERVER }} + server_port: ${{ secrets.SMTP_PORT }} + username: ${{ secrets.SMTP_USERNAME }} + password: ${{ secrets.SMTP_PASSWORD }} subject: ${{ steps.set-subject.outputs.subject }} html_body: ${{ fromJSON(steps.prepare-email.outputs.html_body) }} to: ${{ steps.codeowners.outputs.emails }} From 88e1769276831c129645540bed29477a52120241 Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Fri, 25 Apr 2025 12:42:33 +0530 Subject: [PATCH 13/34] Update trivy.yml --- .github/workflows/trivy.yml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index 1d69915fb8..5fe05b50db 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -155,20 +155,17 @@ jobs: - name: Send email notification if: always() && (steps.report.outputs.has_vulnerabilities == 'true' || failure()) - uses: dawidd6/action-send-mail@v3 + uses: actions-hub/smtp@master with: - # Try connection_url format if server_address fails - #connection_url: ${{ secrets.SMTP_CONNECTION_URL }} # Format: "smtps://user:pass@host:port" - # Alternative if connection_url doesn't work: - server_address: ${{ secrets.SMTP_SERVER }} - server_port: ${{ secrets.SMTP_PORT }} + server: ${{ secrets.SMTP_SERVER }} + port: ${{ secrets.SMTP_PORT }} username: ${{ secrets.SMTP_USERNAME }} password: ${{ secrets.SMTP_PASSWORD }} subject: ${{ steps.set-subject.outputs.subject }} html_body: ${{ fromJSON(steps.prepare-email.outputs.html_body) }} to: ${{ steps.codeowners.outputs.emails }} from: OpenFL Security Bot - convert_markdown: false + secure: true # ============ ARTIFACT UPLOADS ============ - name: Upload scan artifacts From 10e0bf4292ed522dd5453608d48cc64e79512e22 Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Fri, 25 Apr 2025 13:04:37 +0530 Subject: [PATCH 14/34] Create send_email.py --- .github/scripts/send_email.py | 97 +++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 .github/scripts/send_email.py diff --git a/.github/scripts/send_email.py b/.github/scripts/send_email.py new file mode 100644 index 0000000000..4c151e30fc --- /dev/null +++ b/.github/scripts/send_email.py @@ -0,0 +1,97 @@ +import os +import smtplib +import logging +import argparse +from email.message import EmailMessage +from email.mime.base import MIMEBase +from email import encoders + +logger = logging.getLogger(__name__) + +def send_email(sender_email: str, to_email: str, subject: str, email_body: str, smtp_user: str, smtp_pwd: str, + smtp_email_server: str, cc_email: str = '', bcc_email: str = '', reply_email: str = '', is_html_body: bool = False, + attachments: str = '') -> None: + + message = EmailMessage() + message["Subject"] = subject + message["From"] = sender_email + if to_email: + to_list = to_email.split(",") + message["To"] = ", ".join(to_list) + if cc_email: + cc_list = cc_email.split(",") + message["Cc"] = ", ".join(cc_list) + if reply_email: + message["Reply-To"] = reply_email + sub_type = 'plain' + if is_html_body: + sub_type = 'html' + message.set_content(email_body, subtype=sub_type) + # Set up attachment if any + if attachments: + for attachment in attachments.split(','): + with open(attachment, 'rb') as attachment_file: + attachment_data = attachment_file.read() + message.add_attachment( + attachment_data, + maintype='application', + subtype='octet-stream', + filename=os.path.basename(attachment) + ) + logger.info(f'Setting smtp server {smtp_email_server}...') + smtp_server = smtplib.SMTP(smtp_email_server) + smtp_server.starttls() + smtp_server.login(smtp_user, smtp_pwd) + logger.info(f'smtp server authentication successful') + try: + logger.info(f'Sending email...') + if bcc_email: + # Send bcc list as an argument instead of adding it to the header to keep it hidden + bcc_list = bcc_email.split(",") + smtp_server.send_message(message, bcc=bcc_list) + else: + smtp_server.send_message(message) + logger.info(f'email sent.') + except Exception as ex: + raise ex + finally: + try: + smtp_server.quit() + except smtplib.SMTPServerDisconnected: + pass + finally: + logger.info("smtp connection is closed") + +def main(): + parser = argparse.ArgumentParser(description="Send an email with optional attachments") + parser.add_argument('--sender', required=True, help='Sender email address') + parser.add_argument('--to', required=True, help='Recipient email address(es) (comma-separated)') + parser.add_argument('--subject', required=True, help='Email subject') + parser.add_argument('--body', required=True, help='Email body') + parser.add_argument('--smtp-user', required=True, help='SMTP server username') + parser.add_argument('--smtp-pwd', required=True, help='SMTP server password') + parser.add_argument('--smtp-server', required=True, help='SMTP server address and port') + parser.add_argument('--cc', default='', help='CC email address(es) (comma-separated)') + parser.add_argument('--bcc', default='', help='BCC email address(es) (comma-separated)') + parser.add_argument('--reply-to', default='', help='Reply-To email address') + parser.add_argument('--html-body', action='store_true', help='Flag to indicate if email body is HTML') + parser.add_argument('--attachments', default='', help='Attachment file path(s) (space-separated)') + args = parser.parse_args() + + send_email( + sender_email=args.sender, + to_email=args.to, + subject=args.subject, + email_body=args.body, + smtp_user=args.smtp_user, + smtp_pwd=args.smtp_pwd, + smtp_email_server=args.smtp_server, + cc_email=args.cc, + bcc_email=args.bcc, + reply_email=args.reply_to, + is_html_body=args.html_body, + attachments=args.attachments + ) + +if __name__ == '__main__': + main() From 0796a834dd7e926774f00e3f13fc1fd001777b7d Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Fri, 25 Apr 2025 13:16:06 +0530 Subject: [PATCH 15/34] Update trivy.yml --- .github/workflows/trivy.yml | 46 ++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index 5fe05b50db..7c9b79761a 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -32,6 +32,11 @@ jobs: ref: ${{ env.COMMIT_ID }} fetch-depth: 0 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + # ============ SCANNING PHASE ============ - name: Run filesystem scan uses: aquasecurity/trivy-action@0.30.0 @@ -143,29 +148,34 @@ jobs: env: PYTHONIOENCODING: utf-8 - - name: Prepare HTML email content + - name: Prepare email content id: prepare-email run: | - # Install markdown processor + # Convert markdown to HTML python -m pip install markdown + HTML_CONTENT=$(python -c "import markdown; print(markdown.markdown(open('report.md').read()))") + echo "html_body<> $GITHUB_OUTPUT + echo "$HTML_CONTENT" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT - # Convert markdown to HTML and properly escape for GITHUB_OUTPUT - HTML_CONTENT=$(python -c "import markdown, json; print(json.dumps(markdown.markdown(open('report.md').read())))") - echo "html_body=${HTML_CONTENT}" >> $GITHUB_OUTPUT - - - name: Send email notification + - name: Send email via Python script if: always() && (steps.report.outputs.has_vulnerabilities == 'true' || failure()) - uses: actions-hub/smtp@master - with: - server: ${{ secrets.SMTP_SERVER }} - port: ${{ secrets.SMTP_PORT }} - username: ${{ secrets.SMTP_USERNAME }} - password: ${{ secrets.SMTP_PASSWORD }} - subject: ${{ steps.set-subject.outputs.subject }} - html_body: ${{ fromJSON(steps.prepare-email.outputs.html_body) }} - to: ${{ steps.codeowners.outputs.emails }} - from: OpenFL Security Bot - secure: true + env: + SMTP_SERVER: ${{ secrets.SMTP_SERVER }} + SMTP_PORT: ${{ secrets.SMTP_PORT }} + SMTP_USER: ${{ secrets.SMTP_USER }} + SMTP_PASSWORD: ${{ secrets.SMTP_PASSWORD }} + RECIPIENTS: ${{ steps.codeowners.outputs.emails }} + run: | + python .github/scripts/send_email.py \ + --sender "security@openfl.github" \ + --to "$RECIPIENTS" \ + --subject "${{ steps.set-subject.outputs.subject }}" \ + --body "${{ steps.prepare-email.outputs.html_body }}" \ + --smtp-user "$SMTP_USER" \ + --smtp-pwd "$SMTP_PASSWORD" \ + --smtp-server "$SMTP_SERVER:$SMTP_PORT" \ + --html-body # ============ ARTIFACT UPLOADS ============ - name: Upload scan artifacts From 7c3f5eb4df42a1ae16e9bd727dc0ee4c1d16df5b Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Thu, 8 May 2025 21:05:03 +0530 Subject: [PATCH 16/34] Create phi-4-quanti.ipynb --- .../workflow/LLM/phi-4-quanti.ipynb | 705 ++++++++++++++++++ 1 file changed, 705 insertions(+) create mode 100644 openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb new file mode 100644 index 0000000000..0c6884f384 --- /dev/null +++ b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb @@ -0,0 +1,705 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a59f475d-d843-46bc-b75e-10984b687ed3", + "metadata": {}, + "source": [ + "# Federated Fine-Tuning of Phi-4 Using OpenFL" + ] + }, + { + "cell_type": "markdown", + "id": "20c74cb9-51a2-42e2-893f-d280e227e8bf", + "metadata": {}, + "source": [ + "\n", + "In this tutorial, we demonstrate how to fine-tune Microsoft's Phi-4 model in a federated learning workflow.\n", + "\n", + "We will fine-tune **Microsoft's [Phi4](https://huggingface.co/microsoft/phi-4)** model using a diverse dataset such as [Math_10k](https://github.com/AGI-Edgerunners/LLM-Adapters/tree/main), an open-source dataset containing mathematical question-answer pairs collected from various smaller math datasets." + ] + }, + { + "cell_type": "markdown", + "id": "d07c32d3-1a8d-4162-af45-bc3a10e0ae3f", + "metadata": {}, + "source": [ + "## The Workflow Interface" + ] + }, + { + "cell_type": "markdown", + "id": "e3d74610-e48d-4dd4-b622-eb910fbe91aa", + "metadata": {}, + "source": [ + "The workflow interface is an innovative approach to designing federated learning experiments with OpenFL. It was developed in response to discussions with researchers and users who had unique use cases that didn’t perfectly align with the traditional horizontal federated learning model. This interface enables more flexible compositions of experiments, allowing for greater customization and adaptability in complex, real-world scenarios" + ] + }, + { + "cell_type": "markdown", + "id": "413e1d95-fd76-4fe0-b8d0-4c625c2a8fd3", + "metadata": {}, + "source": [ + "## Installing OpenFL\n", + "To install OpenFL, follow the official documentation: \n", + "[OpenFL Installation Guide](https://openfl.readthedocs.io/en/latest/installation.html)" + ] + }, + { + "cell_type": "markdown", + "id": "53654c70", + "metadata": {}, + "source": [ + "After installation, activate experimental APIs using: \n", + "`fx experimental activate`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "05b2ad75-8c7b-499c-902e-dbd5b24361bc", + "metadata": {}, + "outputs": [], + "source": [ + "# Install dependencies \n", + "!pip install torch transformers peft datasets trl==0.12.2 -q" + ] + }, + { + "cell_type": "markdown", + "id": "440a9c39-ec42-45a5-80f6-9a9e0bc90d2f", + "metadata": {}, + "source": [ + "## Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "be4690ae-0671-4d3a-8f21-620ab865a03e", + "metadata": {}, + "outputs": [], + "source": [ + "import hashlib\n", + "import os\n", + "\n", + "import numpy as np\n", + "import requests\n", + "import torch\n", + "import transformers\n", + "from datasets import load_dataset\n", + "from peft import LoraConfig, get_peft_model\n", + "from peft.utils import get_peft_model_state_dict, set_peft_model_state_dict\n", + "from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments\n", + "from transformers.trainer_callback import PrinterCallback\n", + "from trl import SFTTrainer\n", + "\n", + "from openfl.experimental.workflow.interface import Aggregator, Collaborator, FLSpec\n", + "from openfl.experimental.workflow.placement import aggregator, collaborator\n", + "from openfl.experimental.workflow.runtime import LocalRuntime" + ] + }, + { + "cell_type": "markdown", + "id": "08576aa0-f628-4ae6-8fc3-dd167d164784", + "metadata": {}, + "source": [ + "## Acquiring and preprocessing dataset" + ] + }, + { + "cell_type": "markdown", + "id": "7ba1d8b6-8a5b-41a2-8c77-c9a85e869cda", + "metadata": {}, + "source": [ + "We can download the dataset directly from the [LLM-Adapters repository](https://github.com/AGI-Edgerunners/LLM-Adapters)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d615d626-8727-4169-b2a6-3ba15c3cdb95", + "metadata": {}, + "outputs": [], + "source": [ + "def file_checksum(file_path, algorithm=\"sha256\"):\n", + " \"\"\"\n", + " Calculate the checksum of a file using the specified hashing algorithm.\n", + "\n", + " Parameters:\n", + " file_path (str): The path to the file for which the checksum is to be calculated.\n", + " algorithm (str): The hashing algorithm to use (default is 'sha256').\n", + "\n", + " Returns:\n", + " str: The calculated checksum of the file.\n", + " \"\"\"\n", + " hash_func = hashlib.new(algorithm)\n", + " with open(file_path, \"rb\") as f:\n", + " for chunk in iter(lambda: f.read(4096), b\"\"):\n", + " hash_func.update(chunk)\n", + " return hash_func.hexdigest()\n", + "\n", + "\n", + "if not os.path.exists(\"math_10k.json\"):\n", + " r = requests.get(\n", + " \"https://raw.githubusercontent.com/AGI-Edgerunners/LLM-Adapters/main/ft-training_set/math_10k.json\",\n", + " )\n", + " with open(\n", + " \"math_10k.json\",\n", + " \"wb\",\n", + " ) as f:\n", + " f.write(r.content)\n", + "\n", + " actual_checksum = file_checksum(\"math_10k.json\")\n", + " if (\n", + " actual_checksum\n", + " != \"0342d0d860ad8592b579329337c90e42eefd3d9f2898043140cbd120630418b8\"\n", + " ):\n", + " raise ValueError(\n", + " \"Checksum verification failed. The file may have been altered.\"\n", + " )\n", + "\n", + "raw_dataset = load_dataset(\"json\", data_files=\"math_10k.json\")" + ] + }, + { + "cell_type": "markdown", + "id": "3ab15ad6-db35-4a58-a2d5-54a6d3ccdc78", + "metadata": {}, + "source": [ + "## Initialize arguments and configurations" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eada9809-468a-47c6-9b03-55aa887c9487", + "metadata": {}, + "outputs": [], + "source": [ + "training_config = {\n", + " \"bf16\": True,\n", + " \"use_cpu\": True,\n", + " \"do_eval\": False,\n", + " \"learning_rate\": 5.0e-06,\n", + " \"log_level\": \"info\",\n", + " \"logging_steps\": 20,\n", + " \"lr_scheduler_type\": \"cosine\",\n", + " \"num_train_epochs\": 1,\n", + " \"output_dir\": \"./checkpoint_dir\",\n", + " \"overwrite_output_dir\": True,\n", + " \"per_device_eval_batch_size\": 1,\n", + " \"per_device_train_batch_size\": 1,\n", + " \"save_steps\": 100,\n", + " \"save_total_limit\": 1,\n", + " \"seed\": 0,\n", + " \"gradient_checkpointing\": True,\n", + " \"gradient_checkpointing_kwargs\": {\"use_reentrant\": False},\n", + " \"warmup_ratio\": 0.2,\n", + "}\n", + "\n", + "peft_config = {\n", + " \"r\": 1,\n", + " \"lora_alpha\": 2,\n", + " \"lora_dropout\": 0.05,\n", + " \"bias\": \"none\",\n", + " \"task_type\": \"CAUSAL_LM\",\n", + " \"target_modules\": \"all-linear\",\n", + " \"modules_to_save\": None,\n", + "}\n", + "model_kwargs = dict(\n", + " use_cache=False,\n", + " trust_remote_code=True,\n", + " torch_dtype=torch.bfloat16,\n", + " device_map=None,\n", + ")\n", + "train_conf = TrainingArguments(**training_config)\n", + "peft_conf = LoraConfig(**peft_config)" + ] + }, + { + "cell_type": "markdown", + "id": "ffe93234-2a1a-4809-a431-efe2f35ce496", + "metadata": {}, + "source": [ + "## Load and initialize model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ab371f1-64c3-4225-82e7-fb3c5b05578c", + "metadata": {}, + "outputs": [], + "source": [ + "checkpoint_path = \"NyxKrage/Microsoft_Phi-4\"\n", + "model = AutoModelForCausalLM.from_pretrained(\n", + " checkpoint_path, return_dict=True, **model_kwargs\n", + ")\n", + "model = get_peft_model(model, peft_conf)\n", + "\n", + "tokenizer = AutoTokenizer.from_pretrained(checkpoint_path)\n", + "sequence_max_length = 512\n", + "val_set_size = 2000\n", + "tokenizer.pad_token_id = 0 # we want this to be different from the eos token\n", + "tokenizer.padding_side = \"left\" # Allow batched inference" + ] + }, + { + "cell_type": "markdown", + "id": "dd058fff-f6dd-4cc6-acaf-7e2fa2c1132d", + "metadata": {}, + "source": [ + "## Preprocess dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4392ddab-10b7-41f6-a8e0-65ba298ea457", + "metadata": {}, + "outputs": [], + "source": [ + "def generate_prompt(data_point):\n", + " \"\"\"\n", + " Generate a prompt based on the given data point.\n", + "\n", + " Parameters:\n", + " data_point (dict): A dictionary containing the instruction, input, and output.\n", + "\n", + " Returns:\n", + " str: The generated prompt as a string.\n", + " \"\"\"\n", + " if data_point[\"input\"]:\n", + " return f\"\"\"Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request. \n", + "\n", + " ### Instruction:\n", + " {data_point[\"instruction\"]}\n", + " \n", + " ### Input:\n", + " {data_point[\"input\"]}\n", + " \n", + " ### Response:\n", + " {data_point[\"output\"]}\"\"\"\n", + " else:\n", + " return f\"\"\"Below is an instruction that describes a task. Write a response that appropriately completes the request. \n", + "\n", + " ### Instruction:\n", + " {data_point[\"instruction\"]}\n", + " \n", + " ### Response:\n", + " {data_point[\"output\"]}\"\"\"\n", + "\n", + "\n", + "def tokenize(prompt, add_eos_token=True):\n", + " \"\"\"\n", + " Tokenize the given prompt.\n", + "\n", + " Parameters:\n", + " prompt (str): The prompt to be tokenized.\n", + " add_eos_token (bool): Whether to add an end-of-sequence token (default is True).\n", + "\n", + " Returns:\n", + " dict: A dictionary containing the tokenized input IDs and attention mask.\n", + " \"\"\"\n", + " result = tokenizer(\n", + " prompt,\n", + " truncation=True,\n", + " max_length=sequence_max_length,\n", + " padding=False,\n", + " return_tensors=None,\n", + " )\n", + " if (\n", + " result[\"input_ids\"][-1] != tokenizer.eos_token_id\n", + " and len(result[\"input_ids\"]) < sequence_max_length\n", + " and add_eos_token\n", + " ):\n", + " result[\"input_ids\"].append(tokenizer.eos_token_id)\n", + " result[\"attention_mask\"].append(1)\n", + "\n", + " result[\"labels\"] = result[\"input_ids\"].copy()\n", + "\n", + " return result\n", + "\n", + "\n", + "def generate_and_tokenize_prompt(data_point):\n", + " \"\"\"\n", + " Generate and tokenize a prompt based on the given data point.\n", + "\n", + " Parameters:\n", + " data_point (dict): A dictionary containing the instruction, input, and output.\n", + "\n", + " Returns:\n", + " dict: A dictionary containing the tokenized input IDs, attention mask, and labels.\n", + " \"\"\"\n", + " full_prompt = generate_prompt(data_point)\n", + " tokenized_full_prompt = tokenize(full_prompt)\n", + " user_prompt = generate_prompt({**data_point, \"output\": \"\"})\n", + " tokenized_user_prompt = tokenize(user_prompt, add_eos_token=False)\n", + " user_prompt_len = len(tokenized_user_prompt[\"input_ids\"])\n", + "\n", + " tokenized_full_prompt[\"labels\"] = [-100] * user_prompt_len + tokenized_full_prompt[\n", + " \"labels\"\n", + " ][user_prompt_len:]\n", + " return tokenized_full_prompt\n", + "\n", + "\n", + "train_val = raw_dataset[\"train\"].train_test_split(\n", + " test_size=val_set_size, shuffle=True, seed=42\n", + ")\n", + "\n", + "processed_train_dataset = train_val[\"train\"].shuffle().map(generate_and_tokenize_prompt).select(range(3))\n", + "processed_test_dataset = train_val[\"test\"].shuffle().map(generate_and_tokenize_prompt).select(range(3))" + ] + }, + { + "cell_type": "markdown", + "id": "812cfcc8-33ec-4a2b-8a74-27bfc2a41d7b", + "metadata": {}, + "source": [ + "## Define Federated Averaging Method\n", + "The FedAvg method is used to average the models from all the collaborators after training." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6dc85c57-68b2-4514-9373-43e3d7c05c10", + "metadata": {}, + "outputs": [], + "source": [ + "def FedAvg(peft_params, model, weights=None):\n", + " \"\"\"\n", + " Perform Federated Averaging (FedAvg) on the model parameters.\n", + "\n", + " Parameters:\n", + " peft_params (list): A list of state dictionaries containing the model parameters from different clients.\n", + " model (torch.nn.Module): The model to which the averaged parameters will be applied.\n", + " weights (list, optional): A list of weights for averaging the parameters. If None, equal weights are used.\n", + "\n", + " Returns:\n", + " torch.nn.Module: The model with the averaged parameters applied.\n", + " \"\"\"\n", + " state_dicts = peft_params\n", + " state_dict = get_peft_model_state_dict(model)\n", + " for key in peft_params[0]:\n", + " dtype = state_dicts[0][key].dtype\n", + " state_dict[key] = torch.from_numpy(\n", + " np.average(\n", + " [state[key].to(torch.float).numpy() for state in state_dicts], axis=0, weights=weights\n", + " )\n", + " ).to(dtype)\n", + " set_peft_model_state_dict(model, state_dict)\n", + " return model" + ] + }, + { + "cell_type": "markdown", + "id": "810eb75e", + "metadata": {}, + "source": [ + "Now we come to the flow definition. The OpenFL Workflow Interface adopts the conventions set by Metaflow, that every workflow begins with `start` and concludes with the `end` task. The aggregator begins with an optionally passed in model and optimizer. The aggregator begins the flow with the `start` task, where the list of collaborators is extracted from the runtime (`self.collaborators = self.runtime.collaborators`) and is then used as the list of participants to run the task listed in `self.next`, `aggregated_model_validation`. The model, optimizer, and anything that is not explicitly excluded from the next function will be passed from the `start` function on the aggregator to the `aggregated_model_validation` task on the collaborator. Where the tasks run is determined by the placement decorator that precedes each task definition (`@aggregator` or `@collaborator`). Once each of the collaborators (defined in the runtime) complete the `aggregated_model_validation` task, they pass their current state onto the `train` task, from `train` to `local_model_validation`, and then finally to `join` at the aggregator. It is in `join` that an average is taken of the model weights, and the next round can begin.\n", + "\n", + "![Workflow Interface](../../../../docs/images/workflow_interface.png)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58298e8e-ab9e-4377-966e-143823441697", + "metadata": {}, + "outputs": [], + "source": [ + "class FederatedFlow(FLSpec):\n", + " def __init__(self, model=None, optimizer=None, rounds=3, **kwargs):\n", + " \"\"\"\n", + " Initialize the class with the given model, optimizer, and number of rounds.\n", + "\n", + " Parameters:\n", + " model (torch.nn.Module, optional): The model to be used. If None, a ValueError is raised.\n", + " optimizer (torch.optim.Optimizer, optional): The optimizer to be used.\n", + " rounds (int, optional): The number of rounds for training or processing (default is 3).\n", + " **kwargs: Additional keyword arguments to be passed to the superclass initializer.\n", + "\n", + " Raises:\n", + " ValueError: If no model is provided.\n", + " \"\"\"\n", + " super().__init__(**kwargs)\n", + " if model is not None:\n", + " self.model = model\n", + " self.peft_params = get_peft_model_state_dict(self.model)\n", + " self.optimizer = optimizer\n", + " else:\n", + " raise ValueError(\"No model inputted\")\n", + "\n", + " self.rounds = rounds\n", + " \n", + "\n", + " @aggregator\n", + " def start(self):\n", + " \"\"\"\n", + " Initialize the model and set up the collaborators for federated learning.\n", + "\n", + " This method performs the initial setup for the model, including setting the\n", + " collaborators, initializing private variables, and starting the first round\n", + " of the federated learning process.\n", + " \"\"\"\n", + " print(f\"Performing initialization for model\")\n", + " self.collaborators = self.runtime.collaborators\n", + " self.current_round = 0\n", + " self.next(\n", + " self.aggregated_model_validation,\n", + " foreach=\"collaborators\",\n", + " )\n", + "\n", + " \n", + " @collaborator\n", + " def aggregated_model_validation(self):\n", + " \"\"\"\n", + " Perform aggregated model validation for a collaborator.\n", + "\n", + " This method loads the model, applies the PEFT configuration, and evaluates\n", + " the model using the provided training and evaluation datasets. The validation\n", + " score is then stored and the next step in the process is triggered.\n", + " \"\"\"\n", + " print(f\"Performing aggregated model validation for collaborator {self.input}\")\n", + " self.model = AutoModelForCausalLM.from_pretrained(\n", + " checkpoint_path, return_dict=True, **model_kwargs\n", + " )\n", + " self.model = get_peft_model(self.model, peft_conf)\n", + " set_peft_model_state_dict(self.model, self.peft_params)\n", + " trainer = SFTTrainer(\n", + " model=self.model,\n", + " args=train_conf,\n", + " peft_config=peft_conf,\n", + " train_dataset=self.train_dataset,\n", + " eval_dataset=self.eval_dataset,\n", + " max_seq_length=sequence_max_length,\n", + " dataset_text_field=\"text\",\n", + " tokenizer=tokenizer,\n", + " packing=True,\n", + " data_collator=transformers.DataCollatorForSeq2Seq(\n", + " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", + " ),\n", + " )\n", + "\n", + " trainer.remove_callback(PrinterCallback)\n", + " out = trainer.evaluate()\n", + " self.agg_validation_score = out[\"eval_loss\"]\n", + " print(f\"{self.input} value of {self.agg_validation_score}\")\n", + " self.next(self.train)\n", + "\n", + " @collaborator\n", + " def train(self):\n", + " \"\"\"\n", + " Train the model for a collaborator.\n", + "\n", + " This method trains the model using the provided training and evaluation datasets.\n", + " The training loss is stored, the model is saved, and the next step in the process\n", + " is triggered.\n", + " \"\"\"\n", + " trainer = SFTTrainer(\n", + " model=self.model,\n", + " args=train_conf,\n", + " peft_config=peft_conf,\n", + " train_dataset=self.train_dataset,\n", + " eval_dataset=self.eval_dataset,\n", + " max_seq_length=sequence_max_length,\n", + " dataset_text_field=\"text\",\n", + " tokenizer=tokenizer,\n", + " packing=True,\n", + " data_collator=transformers.DataCollatorForSeq2Seq(\n", + " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", + " ),\n", + " )\n", + "\n", + " out = trainer.train()\n", + " self.loss = out.training_loss\n", + " trainer.save_model()\n", + " self.training_completed = True\n", + " self.next(self.local_model_validation)\n", + "\n", + " @collaborator\n", + " def local_model_validation(self):\n", + " \"\"\"\n", + " Perform local model validation for a collaborator.\n", + "\n", + " This method evaluates the model using the provided training and evaluation datasets.\n", + " The validation score is stored, the PEFT parameters are updated, and the next step\n", + " in the process is triggered.\n", + " \"\"\"\n", + " trainer = SFTTrainer(\n", + " model=self.model,\n", + " args=train_conf,\n", + " peft_config=peft_conf,\n", + " train_dataset=processed_train_dataset,\n", + " eval_dataset=processed_test_dataset,\n", + " max_seq_length=sequence_max_length,\n", + " dataset_text_field=\"text\",\n", + " tokenizer=tokenizer,\n", + " packing=True,\n", + " data_collator=transformers.DataCollatorForSeq2Seq(\n", + " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", + " ),\n", + " )\n", + " out = trainer.evaluate()\n", + " self.local_validation_score = out[\"eval_loss\"]\n", + " self.peft_params = get_peft_model_state_dict(self.model)\n", + " print(f\"Doing local model validation for collaborator {self.input}\")\n", + " self.next(self.join, exclude=[\"training_completed\", \"model\"])\n", + "\n", + " @aggregator\n", + " def join(self, inputs):\n", + " \"\"\"\n", + " Aggregate the results from all collaborators and update the model.\n", + "\n", + " This method calculates the average loss, aggregated model accuracy, and local model\n", + " accuracy from all collaborators. The model parameters are updated using Federated\n", + " Averaging (FedAvg), and the next round of the process is triggered if applicable.\n", + " \"\"\"\n", + " self.average_loss = sum(input.loss for input in inputs) / len(inputs)\n", + " self.aggregated_model_accuracy = sum(\n", + " input.agg_validation_score for input in inputs\n", + " ) / len(inputs)\n", + " self.local_model_accuracy = sum(\n", + " input.local_validation_score for input in inputs\n", + " ) / len(inputs)\n", + " print(\n", + " f\"Average aggregated model validation values = {self.aggregated_model_accuracy}\"\n", + " )\n", + " print(f\"Average training loss = {self.average_loss}\")\n", + " print(f\"Average local model validation values = {self.local_model_accuracy}\")\n", + "\n", + " self.model = FedAvg([input.peft_params for input in inputs], self.model)\n", + " self.peft_params = get_peft_model_state_dict(self.model)\n", + "\n", + " self.model.save_pretrained(\"./aggregated/model\")\n", + " tokenizer.save_pretrained(\"./aggregated/tokenizer\")\n", + " self.current_round += 1\n", + " if self.current_round < self.rounds:\n", + " self.next(\n", + " self.aggregated_model_validation,\n", + " foreach=\"collaborators\",\n", + " exclude=[\"model\"],\n", + " )\n", + " else:\n", + " self.next(self.end)\n", + "\n", + " @aggregator\n", + " def end(self):\n", + " \"\"\"\n", + " End the federated learning process.\n", + "\n", + " This method marks the end of the federated learning process and performs any\n", + " necessary cleanup or finalization steps.\n", + " \"\"\"\n", + " print(f\"This is the end of the flow\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "e120a656-f4a5-47a5-a3d4-62c5f3672bba", + "metadata": {}, + "source": [ + "You'll notice in the `FederatedFlow` definition above that there were certain attributes that the flow was not initialized with, namely the `train_dataset` and `eval_dataset` for each of the collaborators. These are **private_attributes** that are exposed only through the runtime. Each participant has its own set of private attributes: a dictionary where the key is the attribute name, and the value is the object that will be made accessible through that participant's task.\n", + "\n", + "Below, we segment shards of the Math_10k dataset for **two collaborators**: Portland and Seattle. Each has their own slice of the dataset that's accessible via the `train_dataset` or `eval_dataset` attribute. Note that the private attributes are flexible, and you can choose to pass in a completely different type of object to any of the collaborators or aggregator (with an arbitrary name). These private attributes will always be filtered out of the current state when transferring from collaborator to aggregator, or vice versa." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5e108c6-5150-4931-9c01-6b64a913fa04", + "metadata": {}, + "outputs": [], + "source": [ + "# Setup participants\n", + "_aggregator = Aggregator()\n", + "_aggregator.private_attributes = {}\n", + "\n", + "# Setup collaborators with private attributes\n", + "collaborator_names = [\n", + " \"Portland\",\n", + " \"Seattle\",\n", + "]\n", + "_collaborators = [Collaborator(name=name) for name in collaborator_names]\n", + "\n", + "for idx, current_collaborator in enumerate(_collaborators):\n", + " # Set the private attributes of the Collaborator to include their specific training and testing data loaders\n", + " current_collaborator.private_attributes = {\n", + " \"train_dataset\": processed_train_dataset.shard(\n", + " num_shards=len(_collaborators), index=idx\n", + " ),\n", + " \"eval_dataset\": processed_test_dataset.shard(\n", + " num_shards=len(_collaborators), index=idx\n", + " ),\n", + " }\n", + "\n", + "local_runtime = LocalRuntime(\n", + " aggregator=_aggregator, collaborators=_collaborators, backend=\"single_process\"\n", + ")\n", + "print(f\"Local runtime collaborators = {local_runtime.collaborators}\")" + ] + }, + { + "cell_type": "markdown", + "id": "9cb61fc0", + "metadata": {}, + "source": [ + "## Run Experiment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38894111-41d9-4dd4-b1c8-eb7ec3cdd3e1", + "metadata": {}, + "outputs": [], + "source": [ + "flflow = FederatedFlow(model, rounds=2)\n", + "flflow.runtime = local_runtime\n", + "flflow.run()\n", + "\n", + "# Determine the final model accuracy:\n", + "print(f'\\nFinal aggregated model accuracy for {flflow.rounds} rounds of training: {flflow.aggregated_model_accuracy}')" + ] + }, + { + "cell_type": "markdown", + "id": "7bc8fe27", + "metadata": {}, + "source": [ + "## 🎉 Congratulations! 🎉\n", + "\n", + "Now that you've completed this notebook, check out our [other tutorials](https://github.com/securefederatedai/openfl/tree/develop/openfl-tutorials/experimental/)\n", + "\n", + "- Using the LocalRuntime Ray Backend for dedicated GPU access\n", + "- Vertical Federated Learning\n", + "- Model Watermarking\n", + "- Differential Privacy\n", + "- And More!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 35667d04fee574c828ee182b022c1a60c5f4fb5e Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Mon, 12 May 2025 15:11:01 +0530 Subject: [PATCH 17/34] Update phi-4-quanti.ipynb --- .../workflow/LLM/phi-4-quanti.ipynb | 425 +++--------------- 1 file changed, 59 insertions(+), 366 deletions(-) diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb index 0c6884f384..33281dabb0 100644 --- a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb +++ b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb @@ -5,7 +5,7 @@ "id": "a59f475d-d843-46bc-b75e-10984b687ed3", "metadata": {}, "source": [ - "# Federated Fine-Tuning of Phi-4 Using OpenFL" + "# Federated Fine-Tuning of Phi-4 Using OpenFL with 8-bit Quantization" ] }, { @@ -13,10 +13,7 @@ "id": "20c74cb9-51a2-42e2-893f-d280e227e8bf", "metadata": {}, "source": [ - "\n", - "In this tutorial, we demonstrate how to fine-tune Microsoft's Phi-4 model in a federated learning workflow.\n", - "\n", - "We will fine-tune **Microsoft's [Phi4](https://huggingface.co/microsoft/phi-4)** model using a diverse dataset such as [Math_10k](https://github.com/AGI-Edgerunners/LLM-Adapters/tree/main), an open-source dataset containing mathematical question-answer pairs collected from various smaller math datasets." + "In this tutorial, we demonstrate how to fine-tune Microsoft's Phi-4 model in a federated learning workflow with 8-bit quantization." ] }, { @@ -24,34 +21,7 @@ "id": "d07c32d3-1a8d-4162-af45-bc3a10e0ae3f", "metadata": {}, "source": [ - "## The Workflow Interface" - ] - }, - { - "cell_type": "markdown", - "id": "e3d74610-e48d-4dd4-b622-eb910fbe91aa", - "metadata": {}, - "source": [ - "The workflow interface is an innovative approach to designing federated learning experiments with OpenFL. It was developed in response to discussions with researchers and users who had unique use cases that didn’t perfectly align with the traditional horizontal federated learning model. This interface enables more flexible compositions of experiments, allowing for greater customization and adaptability in complex, real-world scenarios" - ] - }, - { - "cell_type": "markdown", - "id": "413e1d95-fd76-4fe0-b8d0-4c625c2a8fd3", - "metadata": {}, - "source": [ - "## Installing OpenFL\n", - "To install OpenFL, follow the official documentation: \n", - "[OpenFL Installation Guide](https://openfl.readthedocs.io/en/latest/installation.html)" - ] - }, - { - "cell_type": "markdown", - "id": "53654c70", - "metadata": {}, - "source": [ - "After installation, activate experimental APIs using: \n", - "`fx experimental activate`" + "## Installation" ] }, { @@ -61,8 +31,7 @@ "metadata": {}, "outputs": [], "source": [ - "# Install dependencies \n", - "!pip install torch transformers peft datasets trl==0.12.2 -q" + "!pip install torch transformers peft datasets trl==0.12.2 bitsandbytes accelerate -q" ] }, { @@ -70,7 +39,7 @@ "id": "440a9c39-ec42-45a5-80f6-9a9e0bc90d2f", "metadata": {}, "source": [ - "## Import libraries" + "## Import Libraries" ] }, { @@ -90,7 +59,7 @@ "from datasets import load_dataset\n", "from peft import LoraConfig, get_peft_model\n", "from peft.utils import get_peft_model_state_dict, set_peft_model_state_dict\n", - "from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments\n", + "from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, BitsAndBytesConfig\n", "from transformers.trainer_callback import PrinterCallback\n", "from trl import SFTTrainer\n", "\n", @@ -104,15 +73,7 @@ "id": "08576aa0-f628-4ae6-8fc3-dd167d164784", "metadata": {}, "source": [ - "## Acquiring and preprocessing dataset" - ] - }, - { - "cell_type": "markdown", - "id": "7ba1d8b6-8a5b-41a2-8c77-c9a85e869cda", - "metadata": {}, - "source": [ - "We can download the dataset directly from the [LLM-Adapters repository](https://github.com/AGI-Edgerunners/LLM-Adapters)" + "## Dataset Preparation" ] }, { @@ -123,41 +84,22 @@ "outputs": [], "source": [ "def file_checksum(file_path, algorithm=\"sha256\"):\n", - " \"\"\"\n", - " Calculate the checksum of a file using the specified hashing algorithm.\n", - "\n", - " Parameters:\n", - " file_path (str): The path to the file for which the checksum is to be calculated.\n", - " algorithm (str): The hashing algorithm to use (default is 'sha256').\n", - "\n", - " Returns:\n", - " str: The calculated checksum of the file.\n", - " \"\"\"\n", " hash_func = hashlib.new(algorithm)\n", " with open(file_path, \"rb\") as f:\n", " for chunk in iter(lambda: f.read(4096), b\"\"):\n", " hash_func.update(chunk)\n", " return hash_func.hexdigest()\n", "\n", - "\n", "if not os.path.exists(\"math_10k.json\"):\n", " r = requests.get(\n", " \"https://raw.githubusercontent.com/AGI-Edgerunners/LLM-Adapters/main/ft-training_set/math_10k.json\",\n", " )\n", - " with open(\n", - " \"math_10k.json\",\n", - " \"wb\",\n", - " ) as f:\n", + " with open(\"math_10k.json\", \"wb\") as f:\n", " f.write(r.content)\n", "\n", " actual_checksum = file_checksum(\"math_10k.json\")\n", - " if (\n", - " actual_checksum\n", - " != \"0342d0d860ad8592b579329337c90e42eefd3d9f2898043140cbd120630418b8\"\n", - " ):\n", - " raise ValueError(\n", - " \"Checksum verification failed. The file may have been altered.\"\n", - " )\n", + " if actual_checksum != \"0342d0d860ad8592b579329337c90e42eefd3d9f2898043140cbd120630418b8\":\n", + " raise ValueError(\"Checksum verification failed. The file may have been altered.\")\n", "\n", "raw_dataset = load_dataset(\"json\", data_files=\"math_10k.json\")" ] @@ -167,7 +109,7 @@ "id": "3ab15ad6-db35-4a58-a2d5-54a6d3ccdc78", "metadata": {}, "source": [ - "## Initialize arguments and configurations" + "## Configuration with 8-bit Quantization" ] }, { @@ -177,9 +119,16 @@ "metadata": {}, "outputs": [], "source": [ + "# 8-bit quantization config\n", + "quantization_config = BitsAndBytesConfig(\n", + " load_in_8bit=True,\n", + " llm_int8_threshold=6.0,\n", + " llm_int8_has_fp16_weight=False,\n", + ")\n", + "\n", "training_config = {\n", " \"bf16\": True,\n", - " \"use_cpu\": True,\n", + " \"use_cpu\": False,\n", " \"do_eval\": False,\n", " \"learning_rate\": 5.0e-06,\n", " \"log_level\": \"info\",\n", @@ -196,23 +145,26 @@ " \"gradient_checkpointing\": True,\n", " \"gradient_checkpointing_kwargs\": {\"use_reentrant\": False},\n", " \"warmup_ratio\": 0.2,\n", + " \"optim\": \"adamw_8bit\", # Special 8-bit optimizer\n", "}\n", "\n", "peft_config = {\n", - " \"r\": 1,\n", - " \"lora_alpha\": 2,\n", - " \"lora_dropout\": 0.05,\n", + " \"r\": 8,\n", + " \"lora_alpha\": 16,\n", + " \"lora_dropout\": 0.1,\n", " \"bias\": \"none\",\n", " \"task_type\": \"CAUSAL_LM\",\n", - " \"target_modules\": \"all-linear\",\n", - " \"modules_to_save\": None,\n", + " \"target_modules\": [\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\", \"gate_proj\", \"up_proj\", \"down_proj\"],\n", + " \"modules_to_save\": [\"lm_head\", \"embed_tokens\"],\n", "}\n", + "\n", "model_kwargs = dict(\n", " use_cache=False,\n", " trust_remote_code=True,\n", - " torch_dtype=torch.bfloat16,\n", - " device_map=None,\n", + " quantization_config=quantization_config,\n", + " device_map=\"auto\",\n", ")\n", + "\n", "train_conf = TrainingArguments(**training_config)\n", "peft_conf = LoraConfig(**peft_config)" ] @@ -222,7 +174,7 @@ "id": "ffe93234-2a1a-4809-a431-efe2f35ce496", "metadata": {}, "source": [ - "## Load and initialize model" + "## Load Quantized Model" ] }, { @@ -232,7 +184,7 @@ "metadata": {}, "outputs": [], "source": [ - "checkpoint_path = \"NyxKrage/Microsoft_Phi-4\"\n", + "checkpoint_path = \"microsoft/phi-1_5\"\n", "model = AutoModelForCausalLM.from_pretrained(\n", " checkpoint_path, return_dict=True, **model_kwargs\n", ")\n", @@ -241,8 +193,8 @@ "tokenizer = AutoTokenizer.from_pretrained(checkpoint_path)\n", "sequence_max_length = 512\n", "val_set_size = 2000\n", - "tokenizer.pad_token_id = 0 # we want this to be different from the eos token\n", - "tokenizer.padding_side = \"left\" # Allow batched inference" + "tokenizer.pad_token_id = 0\n", + "tokenizer.padding_side = \"left\"" ] }, { @@ -250,7 +202,7 @@ "id": "dd058fff-f6dd-4cc6-acaf-7e2fa2c1132d", "metadata": {}, "source": [ - "## Preprocess dataset" + "## Dataset Preprocessing" ] }, { @@ -261,15 +213,6 @@ "outputs": [], "source": [ "def generate_prompt(data_point):\n", - " \"\"\"\n", - " Generate a prompt based on the given data point.\n", - "\n", - " Parameters:\n", - " data_point (dict): A dictionary containing the instruction, input, and output.\n", - "\n", - " Returns:\n", - " str: The generated prompt as a string.\n", - " \"\"\"\n", " if data_point[\"input\"]:\n", " return f\"\"\"Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request. \n", "\n", @@ -290,18 +233,7 @@ " ### Response:\n", " {data_point[\"output\"]}\"\"\"\n", "\n", - "\n", "def tokenize(prompt, add_eos_token=True):\n", - " \"\"\"\n", - " Tokenize the given prompt.\n", - "\n", - " Parameters:\n", - " prompt (str): The prompt to be tokenized.\n", - " add_eos_token (bool): Whether to add an end-of-sequence token (default is True).\n", - "\n", - " Returns:\n", - " dict: A dictionary containing the tokenized input IDs and attention mask.\n", - " \"\"\"\n", " result = tokenizer(\n", " prompt,\n", " truncation=True,\n", @@ -318,36 +250,19 @@ " result[\"attention_mask\"].append(1)\n", "\n", " result[\"labels\"] = result[\"input_ids\"].copy()\n", - "\n", " return result\n", "\n", - "\n", "def generate_and_tokenize_prompt(data_point):\n", - " \"\"\"\n", - " Generate and tokenize a prompt based on the given data point.\n", - "\n", - " Parameters:\n", - " data_point (dict): A dictionary containing the instruction, input, and output.\n", - "\n", - " Returns:\n", - " dict: A dictionary containing the tokenized input IDs, attention mask, and labels.\n", - " \"\"\"\n", " full_prompt = generate_prompt(data_point)\n", " tokenized_full_prompt = tokenize(full_prompt)\n", " user_prompt = generate_prompt({**data_point, \"output\": \"\"})\n", " tokenized_user_prompt = tokenize(user_prompt, add_eos_token=False)\n", " user_prompt_len = len(tokenized_user_prompt[\"input_ids\"])\n", "\n", - " tokenized_full_prompt[\"labels\"] = [-100] * user_prompt_len + tokenized_full_prompt[\n", - " \"labels\"\n", - " ][user_prompt_len:]\n", + " tokenized_full_prompt[\"labels\"] = [-100] * user_prompt_len + tokenized_full_prompt[\"labels\"][user_prompt_len:]\n", " return tokenized_full_prompt\n", "\n", - "\n", - "train_val = raw_dataset[\"train\"].train_test_split(\n", - " test_size=val_set_size, shuffle=True, seed=42\n", - ")\n", - "\n", + "train_val = raw_dataset[\"train\"].train_test_split(test_size=val_set_size, shuffle=True, seed=42)\n", "processed_train_dataset = train_val[\"train\"].shuffle().map(generate_and_tokenize_prompt).select(range(3))\n", "processed_test_dataset = train_val[\"test\"].shuffle().map(generate_and_tokenize_prompt).select(range(3))" ] @@ -357,8 +272,7 @@ "id": "812cfcc8-33ec-4a2b-8a74-27bfc2a41d7b", "metadata": {}, "source": [ - "## Define Federated Averaging Method\n", - "The FedAvg method is used to average the models from all the collaborators after training." + "## Federated Averaging with Quantization Support" ] }, { @@ -369,17 +283,6 @@ "outputs": [], "source": [ "def FedAvg(peft_params, model, weights=None):\n", - " \"\"\"\n", - " Perform Federated Averaging (FedAvg) on the model parameters.\n", - "\n", - " Parameters:\n", - " peft_params (list): A list of state dictionaries containing the model parameters from different clients.\n", - " model (torch.nn.Module): The model to which the averaged parameters will be applied.\n", - " weights (list, optional): A list of weights for averaging the parameters. If None, equal weights are used.\n", - "\n", - " Returns:\n", - " torch.nn.Module: The model with the averaged parameters applied.\n", - " \"\"\"\n", " state_dicts = peft_params\n", " state_dict = get_peft_model_state_dict(model)\n", " for key in peft_params[0]:\n", @@ -389,6 +292,8 @@ " [state[key].to(torch.float).numpy() for state in state_dicts], axis=0, weights=weights\n", " )\n", " ).to(dtype)\n", + " \n", + " # Handle quantization when setting state dict\n", " set_peft_model_state_dict(model, state_dict)\n", " return model" ] @@ -398,9 +303,7 @@ "id": "810eb75e", "metadata": {}, "source": [ - "Now we come to the flow definition. The OpenFL Workflow Interface adopts the conventions set by Metaflow, that every workflow begins with `start` and concludes with the `end` task. The aggregator begins with an optionally passed in model and optimizer. The aggregator begins the flow with the `start` task, where the list of collaborators is extracted from the runtime (`self.collaborators = self.runtime.collaborators`) and is then used as the list of participants to run the task listed in `self.next`, `aggregated_model_validation`. The model, optimizer, and anything that is not explicitly excluded from the next function will be passed from the `start` function on the aggregator to the `aggregated_model_validation` task on the collaborator. Where the tasks run is determined by the placement decorator that precedes each task definition (`@aggregator` or `@collaborator`). Once each of the collaborators (defined in the runtime) complete the `aggregated_model_validation` task, they pass their current state onto the `train` task, from `train` to `local_model_validation`, and then finally to `join` at the aggregator. It is in `join` that an average is taken of the model weights, and the next round can begin.\n", - "\n", - "![Workflow Interface](../../../../docs/images/workflow_interface.png)" + "## Federated Learning Workflow with Quantization" ] }, { @@ -412,62 +315,42 @@ "source": [ "class FederatedFlow(FLSpec):\n", " def __init__(self, model=None, optimizer=None, rounds=3, **kwargs):\n", - " \"\"\"\n", - " Initialize the class with the given model, optimizer, and number of rounds.\n", - "\n", - " Parameters:\n", - " model (torch.nn.Module, optional): The model to be used. If None, a ValueError is raised.\n", - " optimizer (torch.optim.Optimizer, optional): The optimizer to be used.\n", - " rounds (int, optional): The number of rounds for training or processing (default is 3).\n", - " **kwargs: Additional keyword arguments to be passed to the superclass initializer.\n", - "\n", - " Raises:\n", - " ValueError: If no model is provided.\n", - " \"\"\"\n", " super().__init__(**kwargs)\n", " if model is not None:\n", " self.model = model\n", " self.peft_params = get_peft_model_state_dict(self.model)\n", " self.optimizer = optimizer\n", + " \n", + " # Print memory usage\n", + " print(f\"Model memory footprint: {self.model.get_memory_footprint() / 1024**2:.2f} MB\")\n", + " \n", + " # Print trainable parameters\n", + " trainable_params = sum(p.numel() for p in self.model.parameters() if p.requires_grad)\n", + " total_params = sum(p.numel() for p in self.model.parameters())\n", + " print(f\"Trainable params: {trainable_params} || All params: {total_params} || Trainable%: {100 * trainable_params / total_params:.2f}\")\n", " else:\n", " raise ValueError(\"No model inputted\")\n", "\n", " self.rounds = rounds\n", - " \n", "\n", " @aggregator\n", " def start(self):\n", - " \"\"\"\n", - " Initialize the model and set up the collaborators for federated learning.\n", - "\n", - " This method performs the initial setup for the model, including setting the\n", - " collaborators, initializing private variables, and starting the first round\n", - " of the federated learning process.\n", - " \"\"\"\n", " print(f\"Performing initialization for model\")\n", " self.collaborators = self.runtime.collaborators\n", " self.current_round = 0\n", - " self.next(\n", - " self.aggregated_model_validation,\n", - " foreach=\"collaborators\",\n", - " )\n", + " self.next(self.aggregated_model_validation, foreach=\"collaborators\")\n", "\n", - " \n", " @collaborator\n", " def aggregated_model_validation(self):\n", - " \"\"\"\n", - " Perform aggregated model validation for a collaborator.\n", - "\n", - " This method loads the model, applies the PEFT configuration, and evaluates\n", - " the model using the provided training and evaluation datasets. The validation\n", - " score is then stored and the next step in the process is triggered.\n", - " \"\"\"\n", " print(f\"Performing aggregated model validation for collaborator {self.input}\")\n", + " \n", + " # Load model with 8-bit quantization\n", " self.model = AutoModelForCausalLM.from_pretrained(\n", " checkpoint_path, return_dict=True, **model_kwargs\n", " )\n", " self.model = get_peft_model(self.model, peft_conf)\n", " set_peft_model_state_dict(self.model, self.peft_params)\n", + " \n", " trainer = SFTTrainer(\n", " model=self.model,\n", " args=train_conf,\n", @@ -491,13 +374,12 @@ "\n", " @collaborator\n", " def train(self):\n", - " \"\"\"\n", - " Train the model for a collaborator.\n", - "\n", - " This method trains the model using the provided training and evaluation datasets.\n", - " The training loss is stored, the model is saved, and the next step in the process\n", - " is triggered.\n", - " \"\"\"\n", + " print(f\"Training on collaborator {self.input}\")\n", + " \n", + " # Enable gradient checkpointing for memory efficiency\n", + " self.model.gradient_checkpointing_enable()\n", + " self.model.config.use_cache = False\n", + " \n", " trainer = SFTTrainer(\n", " model=self.model,\n", " args=train_conf,\n", @@ -513,193 +395,4 @@ " ),\n", " )\n", "\n", - " out = trainer.train()\n", - " self.loss = out.training_loss\n", - " trainer.save_model()\n", - " self.training_completed = True\n", - " self.next(self.local_model_validation)\n", - "\n", - " @collaborator\n", - " def local_model_validation(self):\n", - " \"\"\"\n", - " Perform local model validation for a collaborator.\n", - "\n", - " This method evaluates the model using the provided training and evaluation datasets.\n", - " The validation score is stored, the PEFT parameters are updated, and the next step\n", - " in the process is triggered.\n", - " \"\"\"\n", - " trainer = SFTTrainer(\n", - " model=self.model,\n", - " args=train_conf,\n", - " peft_config=peft_conf,\n", - " train_dataset=processed_train_dataset,\n", - " eval_dataset=processed_test_dataset,\n", - " max_seq_length=sequence_max_length,\n", - " dataset_text_field=\"text\",\n", - " tokenizer=tokenizer,\n", - " packing=True,\n", - " data_collator=transformers.DataCollatorForSeq2Seq(\n", - " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", - " ),\n", - " )\n", - " out = trainer.evaluate()\n", - " self.local_validation_score = out[\"eval_loss\"]\n", - " self.peft_params = get_peft_model_state_dict(self.model)\n", - " print(f\"Doing local model validation for collaborator {self.input}\")\n", - " self.next(self.join, exclude=[\"training_completed\", \"model\"])\n", - "\n", - " @aggregator\n", - " def join(self, inputs):\n", - " \"\"\"\n", - " Aggregate the results from all collaborators and update the model.\n", - "\n", - " This method calculates the average loss, aggregated model accuracy, and local model\n", - " accuracy from all collaborators. The model parameters are updated using Federated\n", - " Averaging (FedAvg), and the next round of the process is triggered if applicable.\n", - " \"\"\"\n", - " self.average_loss = sum(input.loss for input in inputs) / len(inputs)\n", - " self.aggregated_model_accuracy = sum(\n", - " input.agg_validation_score for input in inputs\n", - " ) / len(inputs)\n", - " self.local_model_accuracy = sum(\n", - " input.local_validation_score for input in inputs\n", - " ) / len(inputs)\n", - " print(\n", - " f\"Average aggregated model validation values = {self.aggregated_model_accuracy}\"\n", - " )\n", - " print(f\"Average training loss = {self.average_loss}\")\n", - " print(f\"Average local model validation values = {self.local_model_accuracy}\")\n", - "\n", - " self.model = FedAvg([input.peft_params for input in inputs], self.model)\n", - " self.peft_params = get_peft_model_state_dict(self.model)\n", - "\n", - " self.model.save_pretrained(\"./aggregated/model\")\n", - " tokenizer.save_pretrained(\"./aggregated/tokenizer\")\n", - " self.current_round += 1\n", - " if self.current_round < self.rounds:\n", - " self.next(\n", - " self.aggregated_model_validation,\n", - " foreach=\"collaborators\",\n", - " exclude=[\"model\"],\n", - " )\n", - " else:\n", - " self.next(self.end)\n", - "\n", - " @aggregator\n", - " def end(self):\n", - " \"\"\"\n", - " End the federated learning process.\n", - "\n", - " This method marks the end of the federated learning process and performs any\n", - " necessary cleanup or finalization steps.\n", - " \"\"\"\n", - " print(f\"This is the end of the flow\")\n" - ] - }, - { - "cell_type": "markdown", - "id": "e120a656-f4a5-47a5-a3d4-62c5f3672bba", - "metadata": {}, - "source": [ - "You'll notice in the `FederatedFlow` definition above that there were certain attributes that the flow was not initialized with, namely the `train_dataset` and `eval_dataset` for each of the collaborators. These are **private_attributes** that are exposed only through the runtime. Each participant has its own set of private attributes: a dictionary where the key is the attribute name, and the value is the object that will be made accessible through that participant's task.\n", - "\n", - "Below, we segment shards of the Math_10k dataset for **two collaborators**: Portland and Seattle. Each has their own slice of the dataset that's accessible via the `train_dataset` or `eval_dataset` attribute. Note that the private attributes are flexible, and you can choose to pass in a completely different type of object to any of the collaborators or aggregator (with an arbitrary name). These private attributes will always be filtered out of the current state when transferring from collaborator to aggregator, or vice versa." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e5e108c6-5150-4931-9c01-6b64a913fa04", - "metadata": {}, - "outputs": [], - "source": [ - "# Setup participants\n", - "_aggregator = Aggregator()\n", - "_aggregator.private_attributes = {}\n", - "\n", - "# Setup collaborators with private attributes\n", - "collaborator_names = [\n", - " \"Portland\",\n", - " \"Seattle\",\n", - "]\n", - "_collaborators = [Collaborator(name=name) for name in collaborator_names]\n", - "\n", - "for idx, current_collaborator in enumerate(_collaborators):\n", - " # Set the private attributes of the Collaborator to include their specific training and testing data loaders\n", - " current_collaborator.private_attributes = {\n", - " \"train_dataset\": processed_train_dataset.shard(\n", - " num_shards=len(_collaborators), index=idx\n", - " ),\n", - " \"eval_dataset\": processed_test_dataset.shard(\n", - " num_shards=len(_collaborators), index=idx\n", - " ),\n", - " }\n", - "\n", - "local_runtime = LocalRuntime(\n", - " aggregator=_aggregator, collaborators=_collaborators, backend=\"single_process\"\n", - ")\n", - "print(f\"Local runtime collaborators = {local_runtime.collaborators}\")" - ] - }, - { - "cell_type": "markdown", - "id": "9cb61fc0", - "metadata": {}, - "source": [ - "## Run Experiment" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "38894111-41d9-4dd4-b1c8-eb7ec3cdd3e1", - "metadata": {}, - "outputs": [], - "source": [ - "flflow = FederatedFlow(model, rounds=2)\n", - "flflow.runtime = local_runtime\n", - "flflow.run()\n", - "\n", - "# Determine the final model accuracy:\n", - "print(f'\\nFinal aggregated model accuracy for {flflow.rounds} rounds of training: {flflow.aggregated_model_accuracy}')" - ] - }, - { - "cell_type": "markdown", - "id": "7bc8fe27", - "metadata": {}, - "source": [ - "## 🎉 Congratulations! 🎉\n", - "\n", - "Now that you've completed this notebook, check out our [other tutorials](https://github.com/securefederatedai/openfl/tree/develop/openfl-tutorials/experimental/)\n", - "\n", - "- Using the LocalRuntime Ray Backend for dedicated GPU access\n", - "- Vertical Federated Learning\n", - "- Model Watermarking\n", - "- Differential Privacy\n", - "- And More!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.8" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} + " out From 633c27dbbe2cd0e1076641f7000ca9f5f81e2d2b Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Mon, 12 May 2025 15:11:17 +0530 Subject: [PATCH 18/34] Update phi-4-quanti.ipynb --- openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb index 33281dabb0..960e79d1a5 100644 --- a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb +++ b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb @@ -395,4 +395,4 @@ " ),\n", " )\n", "\n", - " out + " From c7a9b42ecc2a4ee6b2d70a2fd9c8fc04aca2121a Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Mon, 12 May 2025 15:11:50 +0530 Subject: [PATCH 19/34] Update phi-4-quanti.ipynb --- .../workflow/LLM/phi-4-quanti.ipynb | 100 +----------------- 1 file changed, 1 insertion(+), 99 deletions(-) diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb index 960e79d1a5..c76ecd5f51 100644 --- a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb +++ b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb @@ -297,102 +297,4 @@ " set_peft_model_state_dict(model, state_dict)\n", " return model" ] - }, - { - "cell_type": "markdown", - "id": "810eb75e", - "metadata": {}, - "source": [ - "## Federated Learning Workflow with Quantization" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "58298e8e-ab9e-4377-966e-143823441697", - "metadata": {}, - "outputs": [], - "source": [ - "class FederatedFlow(FLSpec):\n", - " def __init__(self, model=None, optimizer=None, rounds=3, **kwargs):\n", - " super().__init__(**kwargs)\n", - " if model is not None:\n", - " self.model = model\n", - " self.peft_params = get_peft_model_state_dict(self.model)\n", - " self.optimizer = optimizer\n", - " \n", - " # Print memory usage\n", - " print(f\"Model memory footprint: {self.model.get_memory_footprint() / 1024**2:.2f} MB\")\n", - " \n", - " # Print trainable parameters\n", - " trainable_params = sum(p.numel() for p in self.model.parameters() if p.requires_grad)\n", - " total_params = sum(p.numel() for p in self.model.parameters())\n", - " print(f\"Trainable params: {trainable_params} || All params: {total_params} || Trainable%: {100 * trainable_params / total_params:.2f}\")\n", - " else:\n", - " raise ValueError(\"No model inputted\")\n", - "\n", - " self.rounds = rounds\n", - "\n", - " @aggregator\n", - " def start(self):\n", - " print(f\"Performing initialization for model\")\n", - " self.collaborators = self.runtime.collaborators\n", - " self.current_round = 0\n", - " self.next(self.aggregated_model_validation, foreach=\"collaborators\")\n", - "\n", - " @collaborator\n", - " def aggregated_model_validation(self):\n", - " print(f\"Performing aggregated model validation for collaborator {self.input}\")\n", - " \n", - " # Load model with 8-bit quantization\n", - " self.model = AutoModelForCausalLM.from_pretrained(\n", - " checkpoint_path, return_dict=True, **model_kwargs\n", - " )\n", - " self.model = get_peft_model(self.model, peft_conf)\n", - " set_peft_model_state_dict(self.model, self.peft_params)\n", - " \n", - " trainer = SFTTrainer(\n", - " model=self.model,\n", - " args=train_conf,\n", - " peft_config=peft_conf,\n", - " train_dataset=self.train_dataset,\n", - " eval_dataset=self.eval_dataset,\n", - " max_seq_length=sequence_max_length,\n", - " dataset_text_field=\"text\",\n", - " tokenizer=tokenizer,\n", - " packing=True,\n", - " data_collator=transformers.DataCollatorForSeq2Seq(\n", - " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", - " ),\n", - " )\n", - "\n", - " trainer.remove_callback(PrinterCallback)\n", - " out = trainer.evaluate()\n", - " self.agg_validation_score = out[\"eval_loss\"]\n", - " print(f\"{self.input} value of {self.agg_validation_score}\")\n", - " self.next(self.train)\n", - "\n", - " @collaborator\n", - " def train(self):\n", - " print(f\"Training on collaborator {self.input}\")\n", - " \n", - " # Enable gradient checkpointing for memory efficiency\n", - " self.model.gradient_checkpointing_enable()\n", - " self.model.config.use_cache = False\n", - " \n", - " trainer = SFTTrainer(\n", - " model=self.model,\n", - " args=train_conf,\n", - " peft_config=peft_conf,\n", - " train_dataset=self.train_dataset,\n", - " eval_dataset=self.eval_dataset,\n", - " max_seq_length=sequence_max_length,\n", - " dataset_text_field=\"text\",\n", - " tokenizer=tokenizer,\n", - " packing=True,\n", - " data_collator=transformers.DataCollatorForSeq2Seq(\n", - " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", - " ),\n", - " )\n", - "\n", - " + } From 4067c82e8f5f5f486010d51956434e1f5e607c3d Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Mon, 12 May 2025 15:31:03 +0530 Subject: [PATCH 20/34] Update phi-4-quanti.ipynb --- .../workflow/LLM/phi-4-quanti.ipynb | 405 +++++++++--------- 1 file changed, 205 insertions(+), 200 deletions(-) diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb index c76ecd5f51..8435e9e418 100644 --- a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb +++ b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb @@ -5,7 +5,7 @@ "id": "a59f475d-d843-46bc-b75e-10984b687ed3", "metadata": {}, "source": [ - "# Federated Fine-Tuning of Phi-4 Using OpenFL with 8-bit Quantization" + "# Federated Fine-Tuning of Phi-4 with 8-bit Quantization" ] }, { @@ -13,15 +13,7 @@ "id": "20c74cb9-51a2-42e2-893f-d280e227e8bf", "metadata": {}, "source": [ - "In this tutorial, we demonstrate how to fine-tune Microsoft's Phi-4 model in a federated learning workflow with 8-bit quantization." - ] - }, - { - "cell_type": "markdown", - "id": "d07c32d3-1a8d-4162-af45-bc3a10e0ae3f", - "metadata": {}, - "source": [ - "## Installation" + "This notebook demonstrates federated fine-tuning of Microsoft's Phi-4 model with 8-bit quantization using OpenFL." ] }, { @@ -34,14 +26,6 @@ "!pip install torch transformers peft datasets trl==0.12.2 bitsandbytes accelerate -q" ] }, - { - "cell_type": "markdown", - "id": "440a9c39-ec42-45a5-80f6-9a9e0bc90d2f", - "metadata": {}, - "source": [ - "## Import Libraries" - ] - }, { "cell_type": "code", "execution_count": null, @@ -49,33 +33,23 @@ "metadata": {}, "outputs": [], "source": [ - "import hashlib\n", - "import os\n", - "\n", - "import numpy as np\n", - "import requests\n", "import torch\n", "import transformers\n", - "from datasets import load_dataset\n", + "from transformers import (\n", + " AutoModelForCausalLM,\n", + " AutoTokenizer,\n", + " BitsAndBytesConfig,\n", + " TrainingArguments\n", + ")\n", "from peft import LoraConfig, get_peft_model\n", - "from peft.utils import get_peft_model_state_dict, set_peft_model_state_dict\n", - "from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, BitsAndBytesConfig\n", - "from transformers.trainer_callback import PrinterCallback\n", + "from datasets import load_dataset\n", "from trl import SFTTrainer\n", - "\n", + "import numpy as np\n", "from openfl.experimental.workflow.interface import Aggregator, Collaborator, FLSpec\n", "from openfl.experimental.workflow.placement import aggregator, collaborator\n", "from openfl.experimental.workflow.runtime import LocalRuntime" ] }, - { - "cell_type": "markdown", - "id": "08576aa0-f628-4ae6-8fc3-dd167d164784", - "metadata": {}, - "source": [ - "## Dataset Preparation" - ] - }, { "cell_type": "code", "execution_count": null, @@ -83,218 +57,249 @@ "metadata": {}, "outputs": [], "source": [ - "def file_checksum(file_path, algorithm=\"sha256\"):\n", - " hash_func = hashlib.new(algorithm)\n", - " with open(file_path, \"rb\") as f:\n", - " for chunk in iter(lambda: f.read(4096), b\"\"):\n", - " hash_func.update(chunk)\n", - " return hash_func.hexdigest()\n", + "# 8-bit quantization config\n", + "quant_config = BitsAndBytesConfig(\n", + " load_in_8bit=True,\n", + " llm_int8_threshold=6.0,\n", + " llm_int8_skip_modules=None,\n", + " llm_int8_enable_fp32_cpu_offload=False,\n", + " llm_int8_has_fp16_weight=False\n", + ")\n", "\n", - "if not os.path.exists(\"math_10k.json\"):\n", - " r = requests.get(\n", - " \"https://raw.githubusercontent.com/AGI-Edgerunners/LLM-Adapters/main/ft-training_set/math_10k.json\",\n", - " )\n", - " with open(\"math_10k.json\", \"wb\") as f:\n", - " f.write(r.content)\n", + "# Model config\n", + "model_kwargs = {\n", + " \"quantization_config\": quant_config,\n", + " \"device_map\": \"auto\",\n", + " \"trust_remote_code\": True\n", + "}\n", "\n", - " actual_checksum = file_checksum(\"math_10k.json\")\n", - " if actual_checksum != \"0342d0d860ad8592b579329337c90e42eefd3d9f2898043140cbd120630418b8\":\n", - " raise ValueError(\"Checksum verification failed. The file may have been altered.\")\n", + "# PEFT config\n", + "peft_config = LoraConfig(\n", + " r=8,\n", + " lora_alpha=16,\n", + " target_modules=[\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\"],\n", + " lora_dropout=0.05,\n", + " bias=\"none\",\n", + " task_type=\"CAUSAL_LM\"\n", + ")\n", "\n", - "raw_dataset = load_dataset(\"json\", data_files=\"math_10k.json\")" + "# Training config\n", + "training_config = TrainingArguments(\n", + " output_dir=\"./results\",\n", + " per_device_train_batch_size=2,\n", + " per_device_eval_batch_size=2,\n", + " gradient_accumulation_steps=4,\n", + " learning_rate=2e-5,\n", + " logging_steps=10,\n", + " num_train_epochs=1,\n", + " max_grad_norm=0.3,\n", + " warmup_ratio=0.03,\n", + " lr_scheduler_type=\"cosine\",\n", + " save_steps=100,\n", + " fp16=True,\n", + " optim=\"adamw_torch\",\n", + " report_to=\"none\"\n", + ")" ] }, { - "cell_type": "markdown", - "id": "3ab15ad6-db35-4a58-a2d5-54a6d3ccdc78", + "cell_type": "code", + "execution_count": null, + "id": "8ab371f1-64c3-4225-82e7-fb3c5b05578c", "metadata": {}, + "outputs": [], "source": [ - "## Configuration with 8-bit Quantization" + "# Load model and tokenizer\n", + "model = AutoModelForCausalLM.from_pretrained(\"microsoft/phi-2\", **model_kwargs)\n", + "model = get_peft_model(model, peft_config)\n", + "tokenizer = AutoTokenizer.from_pretrained(\"microsoft/phi-2\")\n", + "tokenizer.pad_token = tokenizer.eos_token" ] }, { "cell_type": "code", "execution_count": null, - "id": "eada9809-468a-47c6-9b03-55aa887c9487", + "id": "4392ddab-10b7-41f6-a8e0-65ba298ea457", "metadata": {}, "outputs": [], "source": [ - "# 8-bit quantization config\n", - "quantization_config = BitsAndBytesConfig(\n", - " load_in_8bit=True,\n", - " llm_int8_threshold=6.0,\n", - " llm_int8_has_fp16_weight=False,\n", - ")\n", + "# Dataset preparation\n", + "def format_instruction(sample):\n", + " return f\"\"\"### Instruction:\n", + "{sample['instruction']}\n", "\n", - "training_config = {\n", - " \"bf16\": True,\n", - " \"use_cpu\": False,\n", - " \"do_eval\": False,\n", - " \"learning_rate\": 5.0e-06,\n", - " \"log_level\": \"info\",\n", - " \"logging_steps\": 20,\n", - " \"lr_scheduler_type\": \"cosine\",\n", - " \"num_train_epochs\": 1,\n", - " \"output_dir\": \"./checkpoint_dir\",\n", - " \"overwrite_output_dir\": True,\n", - " \"per_device_eval_batch_size\": 1,\n", - " \"per_device_train_batch_size\": 1,\n", - " \"save_steps\": 100,\n", - " \"save_total_limit\": 1,\n", - " \"seed\": 0,\n", - " \"gradient_checkpointing\": True,\n", - " \"gradient_checkpointing_kwargs\": {\"use_reentrant\": False},\n", - " \"warmup_ratio\": 0.2,\n", - " \"optim\": \"adamw_8bit\", # Special 8-bit optimizer\n", - "}\n", + "### Input:\n", + "{sample['input']}\n", "\n", - "peft_config = {\n", - " \"r\": 8,\n", - " \"lora_alpha\": 16,\n", - " \"lora_dropout\": 0.1,\n", - " \"bias\": \"none\",\n", - " \"task_type\": \"CAUSAL_LM\",\n", - " \"target_modules\": [\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\", \"gate_proj\", \"up_proj\", \"down_proj\"],\n", - " \"modules_to_save\": [\"lm_head\", \"embed_tokens\"],\n", - "}\n", + "### Response:\n", + "{sample['output']}\"\"\"\n", "\n", - "model_kwargs = dict(\n", - " use_cache=False,\n", - " trust_remote_code=True,\n", - " quantization_config=quantization_config,\n", - " device_map=\"auto\",\n", - ")\n", + "dataset = load_dataset(\"json\", data_files=\"math_10k.json\")[\"train\"].train_test_split(test_size=0.1)\n", + "train_data = dataset[\"train\"].shuffle().select(range(100))\n", + "val_data = dataset[\"test\"].shuffle().select(range(20))\n", "\n", - "train_conf = TrainingArguments(**training_config)\n", - "peft_conf = LoraConfig(**peft_config)" + "train_data = train_data.map(lambda x: {\"text\": format_instruction(x)})\n", + "val_data = val_data.map(lambda x: {\"text\": format_instruction(x)})" ] }, { - "cell_type": "markdown", - "id": "ffe93234-2a1a-4809-a431-efe2f35ce496", + "cell_type": "code", + "execution_count": null, + "id": "6dc85c57-68b2-4514-9373-43e3d7c05c10", "metadata": {}, + "outputs": [], "source": [ - "## Load Quantized Model" + "class FederatedFlow(FLSpec):\n", + " def __init__(self, model=None, rounds=3, **kwargs):\n", + " super().__init__(**kwargs)\n", + " self.model = model\n", + " self.rounds = rounds\n", + " self.training_metrics = []\n", + " \n", + " @aggregator\n", + " def start(self):\n", + " print(\"Starting federated training\")\n", + " self.collaborators = self.runtime.collaborators\n", + " self.current_round = 0\n", + " self.next(self.aggregated_model_validation, foreach=\"collaborators\")\n", + " \n", + " @collaborator\n", + " def aggregated_model_validation(self):\n", + " trainer = SFTTrainer(\n", + " model=self.model,\n", + " args=training_config,\n", + " train_dataset=self.train_data,\n", + " eval_dataset=self.val_data,\n", + " dataset_text_field=\"text\",\n", + " max_seq_length=512,\n", + " tokenizer=tokenizer\n", + " )\n", + " metrics = trainer.evaluate()\n", + " self.validation_loss = metrics[\"eval_loss\"]\n", + " self.next(self.train)\n", + " \n", + " @collaborator\n", + " def train(self):\n", + " trainer = SFTTrainer(\n", + " model=self.model,\n", + " args=training_config,\n", + " train_dataset=self.train_data,\n", + " eval_dataset=self.val_data,\n", + " dataset_text_field=\"text\",\n", + " max_seq_length=512,\n", + " tokenizer=tokenizer\n", + " )\n", + " train_result = trainer.train()\n", + " self.training_loss = train_result.training_loss\n", + " self.training_metrics.append({\n", + " \"round\": self.current_round,\n", + " \"loss\": self.training_loss,\n", + " \"collaborator\": self.input\n", + " })\n", + " self.next(self.local_model_validation)\n", + " \n", + " @collaborator\n", + " def local_model_validation(self):\n", + " trainer = SFTTrainer(\n", + " model=self.model,\n", + " args=training_config,\n", + " train_dataset=self.train_data,\n", + " eval_dataset=self.val_data,\n", + " dataset_text_field=\"text\",\n", + " max_seq_length=512,\n", + " tokenizer=tokenizer\n", + " )\n", + " metrics = trainer.evaluate()\n", + " self.local_validation_loss = metrics[\"eval_loss\"]\n", + " self.next(self.join, exclude=[\"model\"])\n", + " \n", + " @aggregator\n", + " def join(self, inputs):\n", + " avg_loss = sum(input.training_loss for input in inputs) / len(inputs)\n", + " avg_val_loss = sum(input.validation_loss for input in inputs) / len(inputs)\n", + " \n", + " print(f\"Round {self.current_round} - Avg Training Loss: {avg_loss:.4f}\")\n", + " print(f\"Round {self.current_round} - Avg Validation Loss: {avg_val_loss:.4f}\")\n", + " \n", + " # Aggregate model updates\n", + " self.current_round += 1\n", + " if self.current_round < self.rounds:\n", + " self.next(self.aggregated_model_validation, foreach=\"collaborators\")\n", + " else:\n", + " self.next(self.end)\n", + " \n", + " @aggregator\n", + " def end(self):\n", + " print(\"Training complete!\")\n", + " print(\"Final Training Metrics:\")\n", + " for metric in self.training_metrics:\n", + " print(f\"Round {metric['round']} - {metric['collaborator']} - Loss: {metric['loss']:.4f}\")" ] }, { "cell_type": "code", "execution_count": null, - "id": "8ab371f1-64c3-4225-82e7-fb3c5b05578c", + "id": "e5e108c6-5150-4931-9c01-6b64a913fa04", "metadata": {}, "outputs": [], "source": [ - "checkpoint_path = \"microsoft/phi-1_5\"\n", - "model = AutoModelForCausalLM.from_pretrained(\n", - " checkpoint_path, return_dict=True, **model_kwargs\n", - ")\n", - "model = get_peft_model(model, peft_conf)\n", + "# Setup runtime\n", + "aggregator = Aggregator()\n", + "collaborators = [\n", + " Collaborator(name=\"Portland\", private_attributes={\"train_data\": train_data.shard(2, 0), \"val_data\": val_data.shard(2, 0)}),\n", + " Collaborator(name=\"Seattle\", private_attributes={\"train_data\": train_data.shard(2, 1), \"val_data\": val_data.shard(2, 1)})\n", + "]\n", "\n", - "tokenizer = AutoTokenizer.from_pretrained(checkpoint_path)\n", - "sequence_max_length = 512\n", - "val_set_size = 2000\n", - "tokenizer.pad_token_id = 0\n", - "tokenizer.padding_side = \"left\"" - ] - }, - { - "cell_type": "markdown", - "id": "dd058fff-f6dd-4cc6-acaf-7e2fa2c1132d", - "metadata": {}, - "source": [ - "## Dataset Preprocessing" + "runtime = LocalRuntime(aggregator=aggregator, collaborators=collaborators, backend=\"single_process\")" ] }, { "cell_type": "code", "execution_count": null, - "id": "4392ddab-10b7-41f6-a8e0-65ba298ea457", + "id": "38894111-41d9-4dd4-b1c8-eb7ec3cdd3e1", "metadata": {}, "outputs": [], "source": [ - "def generate_prompt(data_point):\n", - " if data_point[\"input\"]:\n", - " return f\"\"\"Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request. \n", - "\n", - " ### Instruction:\n", - " {data_point[\"instruction\"]}\n", - " \n", - " ### Input:\n", - " {data_point[\"input\"]}\n", - " \n", - " ### Response:\n", - " {data_point[\"output\"]}\"\"\"\n", - " else:\n", - " return f\"\"\"Below is an instruction that describes a task. Write a response that appropriately completes the request. \n", - "\n", - " ### Instruction:\n", - " {data_point[\"instruction\"]}\n", - " \n", - " ### Response:\n", - " {data_point[\"output\"]}\"\"\"\n", - "\n", - "def tokenize(prompt, add_eos_token=True):\n", - " result = tokenizer(\n", - " prompt,\n", - " truncation=True,\n", - " max_length=sequence_max_length,\n", - " padding=False,\n", - " return_tensors=None,\n", - " )\n", - " if (\n", - " result[\"input_ids\"][-1] != tokenizer.eos_token_id\n", - " and len(result[\"input_ids\"]) < sequence_max_length\n", - " and add_eos_token\n", - " ):\n", - " result[\"input_ids\"].append(tokenizer.eos_token_id)\n", - " result[\"attention_mask\"].append(1)\n", - "\n", - " result[\"labels\"] = result[\"input_ids\"].copy()\n", - " return result\n", - "\n", - "def generate_and_tokenize_prompt(data_point):\n", - " full_prompt = generate_prompt(data_point)\n", - " tokenized_full_prompt = tokenize(full_prompt)\n", - " user_prompt = generate_prompt({**data_point, \"output\": \"\"})\n", - " tokenized_user_prompt = tokenize(user_prompt, add_eos_token=False)\n", - " user_prompt_len = len(tokenized_user_prompt[\"input_ids\"])\n", - "\n", - " tokenized_full_prompt[\"labels\"] = [-100] * user_prompt_len + tokenized_full_prompt[\"labels\"][user_prompt_len:]\n", - " return tokenized_full_prompt\n", - "\n", - "train_val = raw_dataset[\"train\"].train_test_split(test_size=val_set_size, shuffle=True, seed=42)\n", - "processed_train_dataset = train_val[\"train\"].shuffle().map(generate_and_tokenize_prompt).select(range(3))\n", - "processed_test_dataset = train_val[\"test\"].shuffle().map(generate_and_tokenize_prompt).select(range(3))" + "# Run training\n", + "flow = FederatedFlow(model, rounds=2)\n", + "flow.runtime = runtime\n", + "flow.run()" ] }, { "cell_type": "markdown", - "id": "812cfcc8-33ec-4a2b-8a74-27bfc2a41d7b", + "id": "7bc8fe27", "metadata": {}, "source": [ - "## Federated Averaging with Quantization Support" + "## Key Features:\n", + "\n", + "1. **8-bit Quantization**: Enabled through BitsAndBytesConfig\n", + "2. **Enhanced Training Metrics**: Tracks and reports loss at each round\n", + "3. **PEFT with LoRA**: Parameter-efficient fine-tuning configuration\n", + "4. **Memory Optimization**: 8-bit weights and gradient accumulation\n", + "5. **Validation Tracking**: Separate validation before and after training" ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" }, - { - "cell_type": "code", - "execution_count": null, - "id": "6dc85c57-68b2-4514-9373-43e3d7c05c10", - "metadata": {}, - "outputs": [], - "source": [ - "def FedAvg(peft_params, model, weights=None):\n", - " state_dicts = peft_params\n", - " state_dict = get_peft_model_state_dict(model)\n", - " for key in peft_params[0]:\n", - " dtype = state_dicts[0][key].dtype\n", - " state_dict[key] = torch.from_numpy(\n", - " np.average(\n", - " [state[key].to(torch.float).numpy() for state in state_dicts], axis=0, weights=weights\n", - " )\n", - " ).to(dtype)\n", - " \n", - " # Handle quantization when setting state dict\n", - " set_peft_model_state_dict(model, state_dict)\n", - " return model" - ] + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From a3b71a5b57dac5083efed6846f5e34e260faf9aa Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Mon, 12 May 2025 15:31:56 +0530 Subject: [PATCH 21/34] Update phi-4-quanti.ipynb --- openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb index 8435e9e418..7a53e6fceb 100644 --- a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb +++ b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb @@ -110,9 +110,9 @@ "outputs": [], "source": [ "# Load model and tokenizer\n", - "model = AutoModelForCausalLM.from_pretrained(\"microsoft/phi-2\", **model_kwargs)\n", + "model = AutoModelForCausalLM.from_pretrained(\"microsoft/phi-4\", **model_kwargs)\n", "model = get_peft_model(model, peft_config)\n", - "tokenizer = AutoTokenizer.from_pretrained(\"microsoft/phi-2\")\n", + "tokenizer = AutoTokenizer.from_pretrained(\"microsoft/phi-4\")\n", "tokenizer.pad_token = tokenizer.eos_token" ] }, From 0380c355235cb7d55fca1380b73232888ab7f4cf Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Mon, 12 May 2025 15:52:08 +0530 Subject: [PATCH 22/34] Update phi-4-quanti.ipynb --- .../workflow/LLM/phi-4-quanti.ipynb | 63 ++++++++----------- 1 file changed, 26 insertions(+), 37 deletions(-) diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb index 7a53e6fceb..d7cc2b8616 100644 --- a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb +++ b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb @@ -13,7 +13,7 @@ "id": "20c74cb9-51a2-42e2-893f-d280e227e8bf", "metadata": {}, "source": [ - "This notebook demonstrates federated fine-tuning of Microsoft's Phi-4 model with 8-bit quantization using OpenFL." + "This notebook demonstrates federated fine-tuning of Microsoft's Phi-4 model (4B parameters) with 8-bit quantization using OpenFL." ] }, { @@ -57,7 +57,7 @@ "metadata": {}, "outputs": [], "source": [ - "# 8-bit quantization config\n", + "# 8-bit quantization config for Phi-4\n", "quant_config = BitsAndBytesConfig(\n", " load_in_8bit=True,\n", " llm_int8_threshold=6.0,\n", @@ -66,37 +66,38 @@ " llm_int8_has_fp16_weight=False\n", ")\n", "\n", - "# Model config\n", + "# Model config for Phi-4\n", "model_kwargs = {\n", " \"quantization_config\": quant_config,\n", " \"device_map\": \"auto\",\n", - " \"trust_remote_code\": True\n", + " \"trust_remote_code\": True,\n", + " \"torch_dtype\": torch.bfloat16\n", "}\n", "\n", - "# PEFT config\n", + "# PEFT config optimized for Phi-4\n", "peft_config = LoraConfig(\n", - " r=8,\n", - " lora_alpha=16,\n", - " target_modules=[\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\"],\n", + " r=16, # Higher rank for larger model\n", + " lora_alpha=32,\n", + " target_modules=[\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\", \"gate_proj\", \"up_proj\", \"down_proj\"],\n", " lora_dropout=0.05,\n", " bias=\"none\",\n", " task_type=\"CAUSAL_LM\"\n", ")\n", "\n", - "# Training config\n", + "# Training config adjusted for Phi-4\n", "training_config = TrainingArguments(\n", " output_dir=\"./results\",\n", - " per_device_train_batch_size=2,\n", - " per_device_eval_batch_size=2,\n", - " gradient_accumulation_steps=4,\n", - " learning_rate=2e-5,\n", + " per_device_train_batch_size=1, # Reduced for 4B model\n", + " per_device_eval_batch_size=1,\n", + " gradient_accumulation_steps=8, # Increased for memory efficiency\n", + " learning_rate=1e-5, # Lower learning rate for larger model\n", " logging_steps=10,\n", " num_train_epochs=1,\n", " max_grad_norm=0.3,\n", " warmup_ratio=0.03,\n", " lr_scheduler_type=\"cosine\",\n", " save_steps=100,\n", - " fp16=True,\n", + " bf16=True, # Using bfloat16 for Phi-4\n", " optim=\"adamw_torch\",\n", " report_to=\"none\"\n", ")" @@ -109,11 +110,12 @@ "metadata": {}, "outputs": [], "source": [ - "# Load model and tokenizer\n", + "# Load Phi-4 model and tokenizer\n", "model = AutoModelForCausalLM.from_pretrained(\"microsoft/phi-4\", **model_kwargs)\n", "model = get_peft_model(model, peft_config)\n", "tokenizer = AutoTokenizer.from_pretrained(\"microsoft/phi-4\")\n", - "tokenizer.pad_token = tokenizer.eos_token" + "tokenizer.pad_token = tokenizer.eos_token\n", + "tokenizer.padding_side = \"left\"" ] }, { @@ -123,7 +125,7 @@ "metadata": {}, "outputs": [], "source": [ - "# Dataset preparation\n", + "# Dataset preparation for Phi-4\n", "def format_instruction(sample):\n", " return f\"\"\"### Instruction:\n", "{sample['instruction']}\n", @@ -135,8 +137,8 @@ "{sample['output']}\"\"\"\n", "\n", "dataset = load_dataset(\"json\", data_files=\"math_10k.json\")[\"train\"].train_test_split(test_size=0.1)\n", - "train_data = dataset[\"train\"].shuffle().select(range(100))\n", - "val_data = dataset[\"test\"].shuffle().select(range(20))\n", + "train_data = dataset[\"train\"].shuffle().select(range(50)) # Smaller subset for Phi-4\n", + "val_data = dataset[\"test\"].shuffle().select(range(10))\n", "\n", "train_data = train_data.map(lambda x: {\"text\": format_instruction(x)})\n", "val_data = val_data.map(lambda x: {\"text\": format_instruction(x)})" @@ -158,7 +160,7 @@ " \n", " @aggregator\n", " def start(self):\n", - " print(\"Starting federated training\")\n", + " print(\"Starting federated training for Phi-4\")\n", " self.collaborators = self.runtime.collaborators\n", " self.current_round = 0\n", " self.next(self.aggregated_model_validation, foreach=\"collaborators\")\n", @@ -230,7 +232,7 @@ " \n", " @aggregator\n", " def end(self):\n", - " print(\"Training complete!\")\n", + " print(\"Phi-4 Training complete!\")\n", " print(\"Final Training Metrics:\")\n", " for metric in self.training_metrics:\n", " print(f\"Round {metric['round']} - {metric['collaborator']} - Loss: {metric['loss']:.4f}\")" @@ -243,7 +245,7 @@ "metadata": {}, "outputs": [], "source": [ - "# Setup runtime\n", + "# Setup runtime for Phi-4\n", "aggregator = Aggregator()\n", "collaborators = [\n", " Collaborator(name=\"Portland\", private_attributes={\"train_data\": train_data.shard(2, 0), \"val_data\": val_data.shard(2, 0)}),\n", @@ -260,26 +262,13 @@ "metadata": {}, "outputs": [], "source": [ - "# Run training\n", + "# Run training for Phi-4\n", "flow = FederatedFlow(model, rounds=2)\n", "flow.runtime = runtime\n", "flow.run()" ] }, - { - "cell_type": "markdown", - "id": "7bc8fe27", - "metadata": {}, - "source": [ - "## Key Features:\n", - "\n", - "1. **8-bit Quantization**: Enabled through BitsAndBytesConfig\n", - "2. **Enhanced Training Metrics**: Tracks and reports loss at each round\n", - "3. **PEFT with LoRA**: Parameter-efficient fine-tuning configuration\n", - "4. **Memory Optimization**: 8-bit weights and gradient accumulation\n", - "5. **Validation Tracking**: Separate validation before and after training" - ] - } + ], "metadata": { "kernelspec": { From 0335de7ae96f6441f3129e38e79078028091171b Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Mon, 12 May 2025 15:52:51 +0530 Subject: [PATCH 23/34] Update phi-4-quanti.ipynb --- .../workflow/LLM/phi-4-quanti.ipynb | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb index d7cc2b8616..9780a0d63a 100644 --- a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb +++ b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb @@ -268,26 +268,27 @@ "flow.run()" ] }, - - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.8" - } + { + "cell_type": "markdown", + "id": "7bc8fe27", + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } }, "nbformat": 4, "nbformat_minor": 5 From 7bb70cfc478d6d9655a6ec5ad4002d7babfb2bed Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Mon, 12 May 2025 15:53:13 +0530 Subject: [PATCH 24/34] Update phi-4-quanti.ipynb --- .../workflow/LLM/phi-4-quanti.ipynb | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb index 9780a0d63a..59ae25d98a 100644 --- a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb +++ b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb @@ -271,24 +271,29 @@ { "cell_type": "markdown", "id": "7bc8fe27", - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.8" - } + "metadata": {}, + "source": [ + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } }, "nbformat": 4, "nbformat_minor": 5 From 02f194248a410fac9cda6668b689dccdcb3f4a30 Mon Sep 17 00:00:00 2001 From: rajithkrishnegowda <134698520+rajithkrishnegowda@users.noreply.github.com> Date: Thu, 15 May 2025 18:02:27 +0530 Subject: [PATCH 25/34] Add files via upload --- .../experimental/workflow/LLM/phi-4-sol.ipynb | 438 ++++++++++++++++++ 1 file changed, 438 insertions(+) create mode 100644 openfl-tutorials/experimental/workflow/LLM/phi-4-sol.ipynb diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-sol.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-sol.ipynb new file mode 100644 index 0000000000..b1ca1bac6e --- /dev/null +++ b/openfl-tutorials/experimental/workflow/LLM/phi-4-sol.ipynb @@ -0,0 +1,438 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a59f475d-d843-46bc-b75e-10984b687ed3", + "metadata": {}, + "source": [ + "# Enhanced Federated Fine-Tuning of Phi-4 Using OpenFL with PEFT & Quantization" + ] + }, + { + "cell_type": "markdown", + "id": "20c74cb9-51a2-42e2-893f-d280e227e8bf", + "metadata": {}, + "source": [ + "In this tutorial, we demonstrate how to fine-tune Microsoft's Phi-4 model in a federated learning workflow with enhanced local training using:\n", + "- Parameter-Efficient Fine-Tuning (PEFT)\n", + "- 4-bit Quantization (QLoRA)\n", + "- Gradient Checkpointing\n", + "- Optimized Training Configuration" + ] + }, + { + "cell_type": "markdown", + "id": "d07c32d3-1a8d-4162-af45-bc3a10e0ae3f", + "metadata": {}, + "source": [ + "## Installation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "05b2ad75-8c7b-499c-902e-dbd5b24361bc", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install torch transformers peft datasets trl==0.12.2 bitsandbytes accelerate -q" + ] + }, + { + "cell_type": "markdown", + "id": "440a9c39-ec42-45a5-80f6-9a9e0bc90d2f", + "metadata": {}, + "source": [ + "## Import Libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "be4690ae-0671-4d3a-8f21-620ab865a03e", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import torch\n", + "from transformers import (\n", + " AutoModelForCausalLM,\n", + " AutoTokenizer,\n", + " BitsAndBytesConfig,\n", + " TrainingArguments\n", + ")\n", + "from peft import (\n", + " LoraConfig,\n", + " get_peft_model,\n", + " prepare_model_for_kbit_training,\n", + " PeftModel\n", + ")\n", + "from peft.utils import get_peft_model_state_dict, set_peft_model_state_dict # Added this import\n", + "from datasets import load_dataset\n", + "from trl import SFTTrainer\n", + "from openfl.experimental.workflow import FLSpec, Aggregator, Collaborator, LocalRuntime\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "id": "08576aa0-f628-4ae6-8fc3-dd167d164784", + "metadata": {}, + "source": [ + "## Configuration" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eada9809-468a-47c6-9b03-55aa887c9487", + "metadata": {}, + "outputs": [], + "source": [ + "# Model and dataset\n", + "model_name = \"microsoft/phi-4\"\n", + "dataset_name = \"math_10k.json\"\n", + "\n", + "# QLoRA configuration\n", + "bnb_config = BitsAndBytesConfig(\n", + " load_in_4bit=True,\n", + " bnb_4bit_quant_type=\"nf4\",\n", + " bnb_4bit_compute_dtype=torch.bfloat16,\n", + " bnb_4bit_use_double_quant=True,\n", + ")\n", + "\n", + "# LoRA configuration\n", + "peft_config = LoraConfig(\n", + " r=16, # Increased from original for better adaptation\n", + " lora_alpha=32,\n", + " lora_dropout=0.05,\n", + " bias=\"none\",\n", + " task_type=\"CAUSAL_LM\",\n", + " target_modules=[\"q_proj\", \"k_proj\", \"v_proj\", \"dense\"],\n", + ")\n", + "\n", + "# Training configuration\n", + "training_args = TrainingArguments(\n", + " output_dir=\"./results\",\n", + " num_train_epochs=1,\n", + " per_device_train_batch_size=1, # Reduced for Phi-4\n", + " gradient_accumulation_steps=2,\n", + " optim=\"paged_adamw_32bit\",\n", + " save_steps=100,\n", + " logging_steps=10,\n", + " learning_rate=2e-4,\n", + " weight_decay=0.001,\n", + " fp16=False,\n", + " bf16=True,\n", + " max_grad_norm=0.3,\n", + " warmup_ratio=0.03,\n", + " lr_scheduler_type=\"cosine\",\n", + " gradient_checkpointing=True,\n", + " report_to=\"none\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ffe93234-2a1a-4809-a431-efe2f35ce496", + "metadata": {}, + "source": [ + "## Load and Prepare Model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ab371f1-64c3-4225-82e7-fb3c5b05578c", + "metadata": {}, + "outputs": [], + "source": [ + "# Load tokenizer\n", + "tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)\n", + "tokenizer.pad_token = tokenizer.eos_token\n", + "tokenizer.padding_side = \"right\"\n", + "\n", + "# Load model with quantization\n", + "model = AutoModelForCausalLM.from_pretrained(\n", + " model_name,\n", + " quantization_config=bnb_config,\n", + " device_map=\"auto\",\n", + " trust_remote_code=True\n", + ")\n", + "\n", + "# Prepare model for k-bit training\n", + "model = prepare_model_for_kbit_training(model)\n", + "\n", + "# Apply LoRA\n", + "model = get_peft_model(model, peft_config)\n", + "model.print_trainable_parameters()" + ] + }, + { + "cell_type": "markdown", + "id": "dd058fff-f6dd-4cc6-acaf-7e2fa2c1132d", + "metadata": {}, + "source": [ + "## Load and Prepare Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4392ddab-10b7-41f6-a8e0-65ba298ea457", + "metadata": {}, + "outputs": [], + "source": [ + "def format_prompt(example):\n", + " if example[\"input\"]:\n", + " return f\"\"\"Below is an instruction that describes a task. Write a response that appropriately completes the request.\n", + "\n", + "### Instruction:\n", + "{example['instruction']}\n", + "\n", + "### Input:\n", + "{example['input']}\n", + "\n", + "### Response:\n", + "{example['output']}\"\"\"\n", + " else:\n", + " return f\"\"\"Below is an instruction that describes a task. Write a response that appropriately completes the request.\n", + "\n", + "### Instruction:\n", + "{example['instruction']}\n", + "\n", + "### Response:\n", + "{example['output']}\"\"\"\n", + "\n", + "# Load dataset\n", + "dataset = load_dataset(\"json\", data_files=dataset_name, split=\"train\")\n", + "dataset = dataset.map(lambda x: {\"text\": format_prompt(x)})\n", + "\n", + "# Split dataset\n", + "dataset = dataset.train_test_split(test_size=0.1)\n", + "train_dataset = dataset[\"train\"]\n", + "eval_dataset = dataset[\"test\"]" + ] + }, + { + "cell_type": "markdown", + "id": "812cfcc8-33ec-4a2b-8a74-27bfc2a41d7b", + "metadata": {}, + "source": [ + "## Enhanced Training with SFTTrainer" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6dc85c57-68b2-4514-9373-43e3d7c05c10", + "metadata": {}, + "outputs": [], + "source": [ + "trainer = SFTTrainer(\n", + " model=model,\n", + " train_dataset=train_dataset,\n", + " eval_dataset=eval_dataset,\n", + " peft_config=peft_config,\n", + " dataset_text_field=\"text\",\n", + " max_seq_length=1024,\n", + " tokenizer=tokenizer,\n", + " args=training_args,\n", + " packing=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "810eb75e", + "metadata": {}, + "source": [ + "## Federated Averaging Function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58298e8e-ab9e-4377-966e-143823441697", + "metadata": {}, + "outputs": [], + "source": [ + "def FedAvg(peft_params, model, weights=None):\n", + " \"\"\"\n", + " Perform Federated Averaging (FedAvg) on the model parameters.\n", + " \"\"\"\n", + " state_dicts = peft_params\n", + " state_dict = get_peft_model_state_dict(model)\n", + " for key in peft_params[0]:\n", + " dtype = state_dicts[0][key].dtype\n", + " state_dict[key] = torch.from_numpy(\n", + " np.average(\n", + " [state[key].to(torch.float).numpy() for state in state_dicts], \n", + " axis=0, \n", + " weights=weights\n", + " )\n", + " ).to(dtype)\n", + " set_peft_model_state_dict(model, state_dict)\n", + " return model" + ] + }, + { + "cell_type": "markdown", + "id": "e120a656-f4a5-47a5-a3d4-62c5f3672bba", + "metadata": {}, + "source": [ + "## Federated Learning Workflow" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5e108c6-5150-4931-9c01-6b64a913fa04", + "metadata": {}, + "outputs": [], + "source": [ + "class FederatedFlow(FLSpec):\n", + " def __init__(self, model=None, rounds=3, **kwargs):\n", + " super().__init__(**kwargs)\n", + " if model is not None:\n", + " self.model = model\n", + " self.peft_params = get_peft_model_state_dict(self.model)\n", + " else:\n", + " raise ValueError(\"No model provided\")\n", + " \n", + " self.rounds = rounds\n", + " \n", + " @aggregator\n", + " def start(self):\n", + " print(\"Initializing federated learning\")\n", + " self.collaborators = self.runtime.collaborators\n", + " self.current_round = 0\n", + " self.next(self.aggregated_model_validation, foreach=\"collaborators\")\n", + " \n", + " @collaborator\n", + " def aggregated_model_validation(self):\n", + " print(f\"Validating aggregated model for {self.input}\")\n", + " # Load model with quantization\n", + " self.model = AutoModelForCausalLM.from_pretrained(\n", + " model_name,\n", + " quantization_config=bnb_config,\n", + " device_map=\"auto\",\n", + " trust_remote_code=True\n", + " )\n", + " self.model = prepare_model_for_kbit_training(self.model)\n", + " self.model = get_peft_model(self.model, peft_config)\n", + " set_peft_model_state_dict(self.model, self.peft_params)\n", + " \n", + " # Evaluate\n", + " eval_results = trainer.evaluate()\n", + " self.agg_validation_score = eval_results[\"eval_loss\"]\n", + " print(f\"Validation loss: {self.agg_validation_score}\")\n", + " self.next(self.train)\n", + " \n", + " @collaborator\n", + " def train(self):\n", + " print(f\"Training on {self.input}\")\n", + " # Train with local data\n", + " trainer.train()\n", + " self.loss = trainer.state.log_history[-1][\"loss\"]\n", + " self.next(self.local_model_validation)\n", + " \n", + " @collaborator\n", + " def local_model_validation(self):\n", + " print(f\"Validating local model for {self.input}\")\n", + " eval_results = trainer.evaluate()\n", + " self.local_validation_score = eval_results[\"eval_loss\"]\n", + " self.peft_params = get_peft_model_state_dict(self.model)\n", + " self.next(self.join, exclude=[\"model\"])\n", + " \n", + " @aggregator\n", + " def join(self, inputs):\n", + " self.average_loss = sum(input.loss for input in inputs) / len(inputs)\n", + " self.aggregated_model_accuracy = sum(\n", + " input.agg_validation_score for input in inputs\n", + " ) / len(inputs)\n", + " self.local_model_accuracy = sum(\n", + " input.local_validation_score for input in inputs\n", + " ) / len(inputs)\n", + " \n", + " print(f\"Round {self.current_round + 1} results:\")\n", + " print(f\"Average training loss: {self.average_loss}\")\n", + " print(f\"Average validation loss (before training): {self.aggregated_model_accuracy}\")\n", + " print(f\"Average validation loss (after training): {self.local_model_accuracy}\")\n", + " \n", + " # Federated averaging\n", + " self.model = FedAvg([input.peft_params for input in inputs], self.model)\n", + " self.peft_params = get_peft_model_state_dict(self.model)\n", + " \n", + " self.current_round += 1\n", + " if self.current_round < self.rounds:\n", + " self.next(self.aggregated_model_validation, foreach=\"collaborators\")\n", + " else:\n", + " self.next(self.end)\n", + " \n", + " @aggregator\n", + " def end(self):\n", + " print(\"Federated training complete!\")\n", + " print(f\"Final model validation loss: {self.aggregated_model_accuracy}\")" + ] + }, + { + "cell_type": "markdown", + "id": "7bc8fe27", + "metadata": {}, + "source": [ + "## Run Federated Learning" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38894111-41d9-4dd4-b1c8-eb7ec3cdd3e1", + "metadata": {}, + "outputs": [], + "source": [ + "# Setup participants\n", + "aggregator = Aggregator()\n", + "collaborators = [\n", + " Collaborator(name=\"Portland\"),\n", + " Collaborator(name=\"Seattle\"),\n", + " Collaborator(name=\"London\")\n", + "]\n", + "\n", + "# Assign data shards\n", + "for idx, colab in enumerate(collaborators):\n", + " colab.private_attributes = {\n", + " \"train_dataset\": train_dataset.shard(len(collaborators), idx),\n", + " \"eval_dataset\": eval_dataset.shard(len(collaborators), idx)\n", + " }\n", + "\n", + "# Create and run workflow\n", + "runtime = LocalRuntime(aggregator=aggregator, collaborators=collaborators)\n", + "flflow = FederatedFlow(model, rounds=3)\n", + "flflow.runtime = runtime\n", + "flflow.run()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 173c1e3b3ceee3a42abe387ca0bbb4693a98b808 Mon Sep 17 00:00:00 2001 From: Rajith Date: Fri, 16 May 2025 11:04:32 +0530 Subject: [PATCH 26/34] adding phi-4 with 4 bit quantization --- .../LLM/phi-4-with4bit quantization.ipynb | 1772 +++++++++++++++++ .../experimental/workflow/LLM/phi-4.ipynb | 705 ------- 2 files changed, 1772 insertions(+), 705 deletions(-) create mode 100644 openfl-tutorials/experimental/workflow/LLM/phi-4-with4bit quantization.ipynb delete mode 100644 openfl-tutorials/experimental/workflow/LLM/phi-4.ipynb diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-with4bit quantization.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-with4bit quantization.ipynb new file mode 100644 index 0000000000..e2efa9054b --- /dev/null +++ b/openfl-tutorials/experimental/workflow/LLM/phi-4-with4bit quantization.ipynb @@ -0,0 +1,1772 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a59f475d-d843-46bc-b75e-10984b687ed3", + "metadata": {}, + "source": [ + "# Enhanced Federated Fine-Tuning of Phi-4 Using OpenFL with PEFT & Quantization" + ] + }, + { + "cell_type": "markdown", + "id": "20c74cb9-51a2-42e2-893f-d280e227e8bf", + "metadata": {}, + "source": [ + "In this tutorial, we demonstrate how to fine-tune Microsoft's Phi-4 model in a federated learning workflow with enhanced local training using:\n", + "- Parameter-Efficient Fine-Tuning (PEFT)\n", + "- 4-bit Quantization (QLoRA)\n", + "- Gradient Checkpointing\n", + "- Optimized Training Configuration" + ] + }, + { + "cell_type": "markdown", + "id": "d07c32d3-1a8d-4162-af45-bc3a10e0ae3f", + "metadata": {}, + "source": [ + "## Installation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "05b2ad75-8c7b-499c-902e-dbd5b24361bc", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install torch transformers peft datasets trl==0.12.2 bitsandbytes accelerate -q" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a7ae1a7e-8c16-4c5a-be57-33d84723aed7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Thu May 15 13:27:27 2025 \n", + "+-----------------------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 550.144.03 Driver Version: 550.144.03 CUDA Version: 12.4 |\n", + "|-----------------------------------------+------------------------+----------------------+\n", + "| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|=========================================+========================+======================|\n", + "| 0 NVIDIA H100 NVL Off | 00000001:00:00.0 Off | 0 |\n", + "| N/A 39C P0 62W / 400W | 1MiB / 95830MiB | 0% Default |\n", + "| | | Disabled |\n", + "+-----------------------------------------+------------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=========================================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "id": "440a9c39-ec42-45a5-80f6-9a9e0bc90d2f", + "metadata": {}, + "source": [ + "## Import Libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "be4690ae-0671-4d3a-8f21-620ab865a03e", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/azureuser/env_name/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "2025-05-15 13:27:30,648\tINFO util.py:154 -- Missing packages: ['ipywidgets']. Run `pip install -U ipywidgets`, then restart the notebook server for rich notebook output.\n" + ] + } + ], + "source": [ + "# System imports\n", + "import os\n", + "import numpy as np\n", + "\n", + "# PyTorch imports\n", + "import torch\n", + "\n", + "# Hugging Face Transformers imports for model loading and training\n", + "from transformers import (\n", + " AutoModelForCausalLM, # For loading large language models\n", + " AutoTokenizer, # For tokenizing text inputs\n", + " BitsAndBytesConfig, # For 4-bit quantization configuration\n", + " TrainingArguments # For configuring training hyperparameters\n", + ")\n", + "\n", + "# PEFT (Parameter-Efficient Fine-Tuning) imports\n", + "from peft import (\n", + " LoraConfig, # For configuring Low-Rank Adaptation\n", + " get_peft_model, # For applying PEFT to a model\n", + " prepare_model_for_kbit_training, # For preparing quantized models for training\n", + " PeftModel # Base class for PEFT models\n", + ")\n", + "from peft.utils import get_peft_model_state_dict, set_peft_model_state_dict # For state dict manipulation\n", + "\n", + "# Dataset and training imports\n", + "from datasets import load_dataset\n", + "from trl import SFTTrainer # Supervised Fine-Tuning Trainer\n", + "\n", + "# OpenFL imports for federated learning\n", + "from openfl.experimental.workflow.interface import Aggregator, Collaborator, FLSpec\n", + "from openfl.experimental.workflow.placement import aggregator, collaborator\n", + "from openfl.experimental.workflow.runtime import LocalRuntime" + ] + }, + { + "cell_type": "markdown", + "id": "06274755", + "metadata": {}, + "source": [ + "## Acquiring and preprocessing dataset" + ] + }, + { + "cell_type": "markdown", + "id": "a6edefa4", + "metadata": {}, + "source": [ + "We can download the dataset directly from the [LLM-Adapters repository](https://github.com/AGI-Edgerunners/LLM-Adapters)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "962ac825", + "metadata": {}, + "outputs": [], + "source": [ + "# Import libraries needed for downloading and verifying the dataset\n", + "import hashlib\n", + "import requests\n", + "\n", + "def file_checksum(file_path, algorithm=\"sha256\"):\n", + " \"\"\"\n", + " Calculate the checksum of a file using the specified hashing algorithm.\n", + " \n", + " Args:\n", + " file_path (str): The path to the file for which the checksum is to be calculated.\n", + " algorithm (str): The hashing algorithm to use (default is 'sha256').\n", + " \n", + " Returns:\n", + " str: The calculated checksum of the file.\n", + " \"\"\"\n", + " hash_func = hashlib.new(algorithm)\n", + " with open(file_path, \"rb\") as f:\n", + " for chunk in iter(lambda: f.read(4096), b\"\"):\n", + " hash_func.update(chunk)\n", + " return hash_func.hexdigest()\n", + "\n", + "\n", + "# Download the dataset if it doesn't exist locally\n", + "if not os.path.exists(\"math_10k.json\"):\n", + " print(\"Downloading math_10k.json dataset...\")\n", + " r = requests.get(\n", + " \"https://raw.githubusercontent.com/AGI-Edgerunners/LLM-Adapters/main/ft-training_set/math_10k.json\",\n", + " )\n", + " with open(\n", + " \"math_10k.json\",\n", + " \"wb\",\n", + " ) as f:\n", + " f.write(r.content)\n", + " print(\"Download complete.\")\n", + "\n", + " # Verify the integrity of the downloaded file\n", + " actual_checksum = file_checksum(\"math_10k.json\")\n", + " expected_checksum = \"0342d0d860ad8592b579329337c90e42eefd3d9f2898043140cbd120630418b8\"\n", + " if actual_checksum != expected_checksum:\n", + " raise ValueError(\n", + " \"Checksum verification failed. The file may have been altered.\"\n", + " )\n", + " print(\"Checksum verification successful.\")\n", + "else:\n", + " print(\"Dataset already exists locally.\")\n", + "\n", + "# Set the dataset path to be used later\n", + "dataset_name = \"math_10k.json\"" + ] + }, + { + "cell_type": "markdown", + "id": "08576aa0-f628-4ae6-8fc3-dd167d164784", + "metadata": {}, + "source": [ + "## Configuration" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eada9809-468a-47c6-9b03-55aa887c9487", + "metadata": {}, + "outputs": [], + "source": [ + "# Model and dataset configuration\n", + "model_name = \"microsoft/phi-4\" # Pre-trained model identifier from Hugging Face Hub\n", + "#dataset_name = \"math_10k.json\" # Dataset file containing mathematical QA pairs\n", + "\n", + "# QLoRA (Quantized Low-Rank Adaptation) configuration for 4-bit quantization\n", + "# This reduces memory footprint while maintaining model quality\n", + "bnb_config = BitsAndBytesConfig(\n", + " load_in_4bit=True, # Enable 4-bit quantization\n", + " bnb_4bit_quant_type=\"nf4\", # Use normalized float 4 format for better precision\n", + " bnb_4bit_compute_dtype=torch.bfloat16, # Computation precision\n", + " bnb_4bit_use_double_quant=False, # Disable nested quantization for simplicity\n", + ")\n", + "\n", + "# LoRA (Low-Rank Adaptation) configuration for parameter-efficient fine-tuning\n", + "# This allows fine-tuning with significantly fewer parameters\n", + "peft_config = LoraConfig(\n", + " r=8, # Rank of the update matrices (higher = more capacity but more parameters)\n", + " lora_alpha=16, # Scaling factor for the trained weights\n", + " lora_dropout=0.01, # Dropout probability for LoRA layers\n", + " bias=\"none\", # Don't train bias parameters to reduce memory\n", + " task_type=\"CAUSAL_LM\", # Specify causal language modeling task\n", + " target_modules=\"all-linear\", # Apply LoRA to all linear layers\n", + ")\n", + "\n", + "# Training hyperparameters configuration\n", + "training_args = TrainingArguments(\n", + " output_dir=\"./results\", # Directory to save checkpoints and logs\n", + " num_train_epochs=1, # Number of training epochs\n", + " per_device_train_batch_size=2, # Batch size per GPU/TPU core\n", + " gradient_accumulation_steps=2, # Number of updates steps to accumulate before backward pass\n", + " optim=\"adamw_torch_fused\", # Optimizer to use (fused for better performance)\n", + " save_steps=100, # Save checkpoint every X updates steps\n", + " logging_steps=10, # Log metrics every X updates steps\n", + " learning_rate=3e-4, # Initial learning rate\n", + " weight_decay=0.001, # Weight decay regularization\n", + " fp16=False, # Disable FP16 training (using BF16 instead)\n", + " bf16=True, # Enable BF16 training (better numerical stability than FP16)\n", + " max_grad_norm=0.5, # Max gradient norm for gradient clipping\n", + " warmup_ratio=0.02, # Portion of steps for learning rate warmup\n", + " lr_scheduler_type=\"cosine\", # Learning rate scheduler type\n", + " gradient_checkpointing=True, # Enable gradient checkpointing to save memory\n", + " report_to=\"none\" # Disable reporting to tracking platforms\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ffe93234-2a1a-4809-a431-efe2f35ce496", + "metadata": {}, + "source": [ + "## Load and Prepare Model" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "8ab371f1-64c3-4225-82e7-fb3c5b05578c", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████████████████| 6/6 [00:04<00:00, 1.36it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "trainable params: 27,852,800 || all params: 14,687,360,000 || trainable%: 0.1896\n" + ] + } + ], + "source": [ + "# Load tokenizer\n", + "tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)\n", + "tokenizer.pad_token = tokenizer.eos_token\n", + "tokenizer.padding_side = \"right\"\n", + "\n", + "# Load model with quantization\n", + "model = AutoModelForCausalLM.from_pretrained(\n", + " model_name,\n", + " quantization_config=bnb_config,\n", + " device_map=\"auto\",\n", + " trust_remote_code=True\n", + ")\n", + "\n", + "# Prepare model for k-bit training\n", + "model = prepare_model_for_kbit_training(model, use_gradient_checkpointing=True)\n", + "\n", + "# Apply LoRA\n", + "model = get_peft_model(model, peft_config)\n", + "model.print_trainable_parameters()" + ] + }, + { + "cell_type": "markdown", + "id": "dd058fff-f6dd-4cc6-acaf-7e2fa2c1132d", + "metadata": {}, + "source": [ + "## Load and Prepare Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4392ddab-10b7-41f6-a8e0-65ba298ea457", + "metadata": {}, + "outputs": [], + "source": [ + "def format_prompt(example):\n", + " \"\"\"\n", + " Format a dataset example into a standardized prompt-response format for instruction tuning.\n", + " \n", + " This function converts raw dataset examples into a structured format suitable for\n", + " instruction fine-tuning of large language models. The format follows the common\n", + " pattern used for instruction-following tasks with clear section demarcation.\n", + " \n", + " Args:\n", + " example (dict): A dictionary containing the example data with keys:\n", + " - 'instruction': The task instruction\n", + " - 'input': The optional input context (may be empty)\n", + " - 'output': The expected output/response\n", + " \n", + " Returns:\n", + " str: A formatted prompt string with instruction, optional input, and response\n", + " \"\"\"\n", + " if example[\"input\"]:\n", + " return f\"\"\"Below is an instruction that describes a task. Write a response that appropriately completes the request.\n", + "\n", + "### Instruction:\n", + "{example['instruction']}\n", + "\n", + "### Input:\n", + "{example['input']}\n", + "\n", + "### Response:\n", + "{example['output']}\"\"\"\n", + " else:\n", + " return f\"\"\"Below is an instruction that describes a task. Write a response that appropriately completes the request.\n", + "\n", + "### Instruction:\n", + "{example['instruction']}\n", + "\n", + "### Response:\n", + "{example['output']}\"\"\"\n", + "\n", + "# Load dataset from JSON file (contains mathematical question-answer pairs)\n", + "dataset = load_dataset(\"json\", data_files=dataset_name, split=\"train\", num_proc=4)\n", + "\n", + "# Transform raw examples into formatted text for instruction tuning\n", + "dataset = dataset.map(lambda x: {\"text\": format_prompt(x)}, num_proc=4)\n", + "\n", + "# Split dataset into training (90%) and evaluation (10%) sets\n", + "dataset = dataset.train_test_split(test_size=0.1)\n", + "train_dataset = dataset[\"train\"]\n", + "eval_dataset = dataset[\"test\"]" + ] + }, + { + "cell_type": "markdown", + "id": "812cfcc8-33ec-4a2b-8a74-27bfc2a41d7b", + "metadata": {}, + "source": [ + "## Enhanced Training with SFTTrainer" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "6dc85c57-68b2-4514-9373-43e3d7c05c10", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': dataset_text_field, max_seq_length, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "Generating train split: 1820 examples [00:02, 613.71 examples/s]\n", + "Generating train split: 209 examples [00:00, 582.95 examples/s]\n" + ] + } + ], + "source": [ + "trainer = SFTTrainer(\n", + " model=model,\n", + " train_dataset=train_dataset,\n", + " eval_dataset=eval_dataset,\n", + " peft_config=peft_config,\n", + " dataset_text_field=\"text\",\n", + " max_seq_length=1024,\n", + " tokenizer=tokenizer,\n", + " args=training_args,\n", + " packing=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "810eb75e", + "metadata": {}, + "source": [ + "## Federated Averaging Function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58298e8e-ab9e-4377-966e-143823441697", + "metadata": {}, + "outputs": [], + "source": [ + "def FedAvg(peft_params, model, weights=None):\n", + " \"\"\"\n", + " Perform Federated Averaging (FedAvg) on the model parameters.\n", + " \n", + " This function aggregates PEFT parameters from multiple collaborators using weighted\n", + " averaging. It handles the complex task of averaging parameters while maintaining \n", + " the correct tensor types and shapes required by the PEFT framework.\n", + " \n", + " Args:\n", + " peft_params (list): A list of state dictionaries containing PEFT parameters from different collaborators.\n", + " model (torch.nn.Module): The base model to which the averaged parameters will be applied.\n", + " weights (list, optional): A list of weights for averaging the parameters. If None, equal weights are used.\n", + " Weights determine the contribution of each collaborator to the final model.\n", + " \n", + " Returns:\n", + " torch.nn.Module: The model with the averaged parameters applied.\n", + " \n", + " Notes:\n", + " The function converts tensors to float for averaging to avoid precision issues,\n", + " then converts back to the original data type for model compatibility.\n", + " \"\"\"\n", + " # Store the state dictionaries for easy access\n", + " state_dicts = peft_params\n", + " # Get the current state dict from the model as a template\n", + " state_dict = get_peft_model_state_dict(model)\n", + " \n", + " # Iterate through each parameter in the first state dict as reference\n", + " for key in peft_params[0]:\n", + " # Store original data type for later conversion\n", + " dtype = state_dicts[0][key].dtype\n", + " \n", + " # Convert all tensors to float, move to CPU, perform weighted average\n", + " state_dict[key] = torch.from_numpy(\n", + " np.average(\n", + " [state[key].cpu().to(torch.float).numpy() for state in state_dicts], \n", + " axis=0, \n", + " weights=weights\n", + " )\n", + " ).to(dtype) # Convert back to original data type\n", + " \n", + " # Apply the averaged parameters back to the model\n", + " set_peft_model_state_dict(model, state_dict)\n", + " return model" + ] + }, + { + "cell_type": "markdown", + "id": "e120a656-f4a5-47a5-a3d4-62c5f3672bba", + "metadata": {}, + "source": [ + "## Federated Learning Workflow" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5e108c6-5150-4931-9c01-6b64a913fa04", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Aggregator step \"start\" registered\n", + "Collaborator step \"aggregated_model_validation\" registered\n", + "Collaborator step \"train\" registered\n", + "Collaborator step \"local_model_validation\" registered\n", + "Aggregator step \"join\" registered\n", + "Aggregator step \"end\" registered\n" + ] + } + ], + "source": [ + "# Import the required PrinterCallback for proper initialization/removal\n", + "from transformers.trainer_callback import PrinterCallback\n", + "import transformers\n", + "\n", + "class FederatedFlow(FLSpec):\n", + " \"\"\"\n", + " Federated Learning workflow for fine-tuning Phi-4 model with PEFT and quantization.\n", + " \n", + " This class implements the complete federated learning workflow for a language model,\n", + " including initialization, aggregated model validation, training, local model validation,\n", + " and parameter aggregation. It uses Parameter-Efficient Fine-Tuning (PEFT) with 4-bit\n", + " quantization to efficiently train large language models in memory-constrained environments.\n", + " \n", + " The workflow follows these steps for each round:\n", + " 1. Initialize model on each collaborator\n", + " 2. Validate the aggregated model on local data\n", + " 3. Train the model locally on each collaborator\n", + " 4. Validate the locally trained model\n", + " 5. Aggregate PEFT parameters from all collaborators using FedAvg\n", + " 6. Repeat for specified number of rounds\n", + " \n", + " Attributes:\n", + " model: The base language model being fine-tuned\n", + " peft_params: PEFT parameters dictionary for the model\n", + " optimizer: Optimizer for training (optional)\n", + " rounds: Number of federated learning rounds to perform\n", + " current_round: Counter for the current round\n", + " collaborators: List of collaborators participating in federated learning\n", + " \"\"\"\n", + " def __init__(self, model=None, optimizer=None, rounds=3, **kwargs):\n", + " \"\"\"\n", + " Initialize the federated learning workflow.\n", + " \n", + " Args:\n", + " model: The base language model to fine-tune. Must be provided.\n", + " optimizer: Optional optimizer for model training.\n", + " rounds: Number of federated learning rounds to perform (default: 3).\n", + " **kwargs: Additional arguments passed to the parent class.\n", + " \n", + " Raises:\n", + " ValueError: If no model is provided.\n", + " \"\"\"\n", + " super().__init__(**kwargs)\n", + " if model is not None:\n", + " self.model = model\n", + " self.peft_params = get_peft_model_state_dict(self.model)\n", + " self.optimizer = optimizer\n", + " else:\n", + " raise ValueError(\"No model inputted\")\n", + "\n", + " self.rounds = rounds\n", + " \n", + "\n", + " @aggregator\n", + " def start(self):\n", + " \"\"\"\n", + " Start the federated learning process on the aggregator.\n", + " \n", + " This method initializes the workflow by:\n", + " 1. Setting up the list of collaborators from the runtime\n", + " 2. Initializing the current round counter\n", + " 3. Starting the first step of the workflow by sending the model\n", + " to all collaborators for validation\n", + " \n", + " The @aggregator decorator ensures this method runs on the aggregator node.\n", + " \"\"\"\n", + " print(f\"Performing initialization for model\")\n", + " self.collaborators = self.runtime.collaborators\n", + " self.current_round = 0\n", + " # Start the workflow by sending the model to all collaborators\n", + " self.next(\n", + " self.aggregated_model_validation,\n", + " foreach=\"collaborators\",\n", + " )\n", + "\n", + " \n", + " @collaborator\n", + " def aggregated_model_validation(self):\n", + " \"\"\"\n", + " Validate the aggregated model on each collaborator's local dataset.\n", + " \n", + " This method:\n", + " 1. Loads the model with appropriate quantization configuration\n", + " 2. Applies the PEFT configuration and parameters\n", + " 3. Creates a trainer with local validation dataset\n", + " 4. Evaluates the model and records the validation loss\n", + " 5. Transitions to the training phase\n", + " \n", + " The @collaborator decorator ensures this method runs on each collaborator node.\n", + " \n", + " Notes:\n", + " Includes fallback to CPU if GPU memory is insufficient\n", + " \"\"\"\n", + " print(f\"Performing aggregated model validation for collaborator {self.input}\")\n", + " # Load model with quantization and CPU offloading if needed\n", + " device_map = \"auto\" \n", + " try:\n", + " # Try to load model on GPU with quantization\n", + " self.model = AutoModelForCausalLM.from_pretrained(\n", + " model_name,\n", + " quantization_config=bnb_config,\n", + " device_map=device_map,\n", + " #max_memory={0: \"4GiB\", \"cpu\": \"24GiB\"},\n", + " trust_remote_code=True\n", + " )\n", + " except ValueError:\n", + " # Fallback to CPU if GPU memory is insufficient\n", + " print(f\"Falling back to CPU mode for {self.input}\")\n", + " self.model = AutoModelForCausalLM.from_pretrained(\n", + " model_name,\n", + " device_map=\"cpu\",\n", + " trust_remote_code=True\n", + " )\n", + " \n", + " # Prepare model for training with quantization\n", + " self.model = prepare_model_for_kbit_training(self.model)\n", + " # Apply PEFT configuration (LoRA)\n", + " self.model = get_peft_model(self.model, peft_config)\n", + " # Load aggregated parameters\n", + " set_peft_model_state_dict(self.model, self.peft_params)\n", + " \n", + " # Setup trainer for evaluation\n", + " trainer = SFTTrainer(\n", + " model=self.model,\n", + " args=training_args,\n", + " peft_config=peft_config,\n", + " train_dataset=self.train_dataset,\n", + " eval_dataset=self.eval_dataset,\n", + " max_seq_length=1024,\n", + " dataset_text_field=\"text\",\n", + " tokenizer=tokenizer,\n", + " packing=True,\n", + " data_collator=transformers.DataCollatorForSeq2Seq(\n", + " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", + " ),\n", + " )\n", + "\n", + " # Remove default printer callback to avoid verbose output\n", + " trainer.remove_callback(PrinterCallback)\n", + " # Evaluate model and store metrics\n", + " out = trainer.evaluate()\n", + " self.agg_validation_score = out[\"eval_loss\"]\n", + " print(f\"{self.input} value of {self.agg_validation_score}\")\n", + " # Move to training phase\n", + " self.next(self.train)\n", + "\n", + " @collaborator\n", + " def train(self):\n", + " \"\"\"\n", + " Train the model on each collaborator's local dataset.\n", + " \n", + " This method:\n", + " 1. Creates an SFTTrainer with the local training dataset\n", + " 2. Runs the training process\n", + " 3. Records the training loss\n", + " 4. Saves the trained model\n", + " 5. Transitions to local validation phase\n", + " \n", + " The @collaborator decorator ensures this method runs on each collaborator node.\n", + " \"\"\"\n", + " # Setup trainer for local training\n", + " trainer = SFTTrainer(\n", + " model=self.model,\n", + " args=training_args,\n", + " peft_config=peft_config,\n", + " train_dataset=self.train_dataset,\n", + " eval_dataset=self.eval_dataset,\n", + " max_seq_length=1024,\n", + " dataset_text_field=\"text\",\n", + " tokenizer=tokenizer,\n", + " packing=True,\n", + " data_collator=transformers.DataCollatorForSeq2Seq(\n", + " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", + " ),\n", + " )\n", + "\n", + " # Execute training\n", + " out = trainer.train()\n", + " # Store training loss for later analysis\n", + " self.loss = out.training_loss\n", + " # Save locally trained model\n", + " trainer.save_model()\n", + " self.training_completed = True\n", + " # Move to local validation phase\n", + " self.next(self.local_model_validation)\n", + "\n", + " @collaborator\n", + " def local_model_validation(self):\n", + " \"\"\"\n", + " Validate the locally trained model on each collaborator's validation dataset.\n", + " \n", + " This method:\n", + " 1. Creates an SFTTrainer with the local validation dataset\n", + " 2. Evaluates the locally trained model\n", + " 3. Records the validation loss\n", + " 4. Extracts the PEFT parameters for aggregation\n", + " 5. Sends results to the aggregator for parameter aggregation\n", + " \n", + " The @collaborator decorator ensures this method runs on each collaborator node.\n", + " \n", + " Notes:\n", + " Excludes the full model and training flags from the data sent to the aggregator\n", + " to reduce communication overhead\n", + " \"\"\"\n", + " # Setup trainer for evaluation\n", + " trainer = SFTTrainer(\n", + " model=self.model,\n", + " args=training_args,\n", + " peft_config=peft_config,\n", + " train_dataset=self.train_dataset,\n", + " eval_dataset=self.eval_dataset,\n", + " max_seq_length=1024,\n", + " dataset_text_field=\"text\",\n", + " tokenizer=tokenizer,\n", + " packing=True,\n", + " data_collator=transformers.DataCollatorForSeq2Seq(\n", + " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", + " ),\n", + " )\n", + " # Evaluate the locally trained model\n", + " out = trainer.evaluate()\n", + " self.local_validation_score = out[\"eval_loss\"]\n", + " # Extract PEFT parameters for aggregation\n", + " self.peft_params = get_peft_model_state_dict(self.model)\n", + " print(f\"Doing local model validation for collaborator {self.input}\")\n", + " # Send results to aggregator, excluding the full model and training flags\n", + " # to reduce communication overhead\n", + " self.next(self.join, exclude=[\"training_completed\", \"model\"])\n", + "\n", + " @aggregator\n", + " def join(self, inputs):\n", + " \"\"\"\n", + " Aggregate results from all collaborators and update the global model.\n", + " \n", + " This method:\n", + " 1. Calculates average loss, aggregated model accuracy, and local model accuracy\n", + " 2. Updates the global model using Federated Averaging (FedAvg)\n", + " 3. Saves the aggregated model and tokenizer\n", + " 4. Either starts the next round or ends the workflow depending on round count\n", + " \n", + " Args:\n", + " inputs: List of data objects from all collaborators containing validation scores\n", + " and PEFT parameters.\n", + " \n", + " The @aggregator decorator ensures this method runs on the aggregator node.\n", + " \"\"\"\n", + " # Calculate average metrics across all collaborators\n", + " self.average_loss = sum(input.loss for input in inputs) / len(inputs)\n", + " self.aggregated_model_accuracy = sum(\n", + " input.agg_validation_score for input in inputs\n", + " ) / len(inputs)\n", + " self.local_model_accuracy = sum(\n", + " input.local_validation_score for input in inputs\n", + " ) / len(inputs)\n", + " \n", + " # Display aggregated metrics\n", + " print(\n", + " f\"Average aggregated model validation values = {self.aggregated_model_accuracy}\"\n", + " )\n", + " print(f\"Average training loss = {self.average_loss}\")\n", + " print(f\"Average local model validation values = {self.local_model_accuracy}\")\n", + "\n", + " # Perform federated averaging of model parameters\n", + " self.model = FedAvg([input.peft_params for input in inputs], self.model)\n", + " self.peft_params = get_peft_model_state_dict(self.model)\n", + "\n", + " # Save the aggregated model for future use\n", + " self.model.save_pretrained(\"./aggregated/model\")\n", + " tokenizer.save_pretrained(\"./aggregated/tokenizer\")\n", + " \n", + " # Increment round counter and start next round or end workflow\n", + " self.current_round += 1\n", + " if self.current_round < self.rounds:\n", + " self.next(\n", + " self.aggregated_model_validation,\n", + " foreach=\"collaborators\",\n", + " exclude=[\"model\"],\n", + " )\n", + " else:\n", + " self.next(self.end)\n", + "\n", + " @aggregator\n", + " def end(self):\n", + " \"\"\"\n", + " End the federated learning process.\n", + " \n", + " This method marks the end of the federated learning workflow after all rounds\n", + " have been completed. The final aggregated model and tokenizer are already saved\n", + " in the last join step.\n", + " \n", + " The @aggregator decorator ensures this method runs on the aggregator node.\n", + " \"\"\"\n", + " print(f\"This is the end of the flow\")" + ] + }, + { + "cell_type": "markdown", + "id": "7bc8fe27", + "metadata": {}, + "source": [ + "## Run Federated Learning" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38894111-41d9-4dd4-b1c8-eb7ec3cdd3e1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling start\n", + "\u001b[94mPerforming initialization for model\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94mPerforming aggregated model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.30it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "Generating train split: 913 examples [00:01, 623.08 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "Generating train split: 104 examples [00:00, 583.62 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland value of 0.5918120741844177\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "Generating train split: 913 examples [00:01, 616.37 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "Generating train split: 104 examples [00:00, 615.85 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "\u001b[0m`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`...\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [228/228 08:54, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
100.516900
200.373400
300.346100
400.339100
500.333000
600.323700
700.329800
800.312800
900.326000
1000.306800
1100.314900
1200.328300
1300.311300
1400.313400
1500.315400
1600.312200
1700.303000
1800.307400
1900.307600
2000.312500
2100.307000
2200.308000

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94mPerforming aggregated model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.32it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "Generating train split: 907 examples [00:01, 626.09 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "Generating train split: 105 examples [00:00, 634.41 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [14/14 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle value of 0.589488685131073\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [227/227 08:53, Epoch 1/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
100.500700
200.392300
300.364500
400.327800
500.342000
600.310900
700.318500
800.317900
900.333300
1000.321300
1100.312500
1200.301500
1300.314000
1400.317100
1500.316800
1600.318300
1700.318000
1800.295800
1900.311000
2000.310900
2100.327200
2200.311600

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [14/14 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94mAverage aggregated model validation values = 0.5906503796577454\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mAverage training loss = 0.3295206361469617\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mAverage local model validation values = 0.3146952837705612\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94mPerforming aggregated model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.33it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland value of 0.31504756212234497\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [228/228 08:57, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
100.314000
200.292000
300.287100
400.288900
500.283600
600.281300
700.290200
800.277900
900.291600
1000.278400
1100.285700
1200.302800
1300.291500
1400.295600
1500.299100
1600.298400
1700.291200
1800.297700
1900.298500
2000.305400
2100.301000
2200.303100

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94mPerforming aggregated model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.30it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [14/14 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle value of 0.31057578325271606\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [227/227 08:50, Epoch 1.00/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
100.300900
200.307900
300.303400
400.274300
500.295200
600.270700
700.280300
800.284600
900.298700
1000.290900
1100.284300
1200.277500
1300.292400
1400.299300
1500.298800
1600.305300
1700.304600
1800.286900
1900.302600
2000.305300
2100.320000
2200.306800

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Setup federated learning participants\n", + "aggregator = Aggregator() # Central coordinator that aggregates model updates\n", + "collaborators = [\n", + " Collaborator(name=\"Portland\"), # First participant with local dataset\n", + " Collaborator(name=\"Seattle\") # Second participant with local dataset\n", + "]\n", + "\n", + "# Distribute data shards to collaborators (simulating data silos)\n", + "# Each collaborator gets a non-overlapping portion of the dataset\n", + "for idx, colab in enumerate(collaborators):\n", + " colab.private_attributes = {\n", + " \"train_dataset\": train_dataset.shard(len(collaborators), idx), # Training shard\n", + " \"eval_dataset\": eval_dataset.shard(len(collaborators), idx) # Evaluation shard\n", + " }\n", + "\n", + "# Set up and execute the federated learning workflow\n", + "runtime = LocalRuntime(aggregator=aggregator, collaborators=collaborators) # Local simulation runtime\n", + "flflow = FederatedFlow(model, rounds=2) # Create flow with 2 federated learning rounds\n", + "flflow.runtime = runtime # Assign runtime to the flow\n", + "flflow.run() # Start the federated learning process" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (myenv)", + "language": "python", + "name": "myenv" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4.ipynb deleted file mode 100644 index 0c6884f384..0000000000 --- a/openfl-tutorials/experimental/workflow/LLM/phi-4.ipynb +++ /dev/null @@ -1,705 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "a59f475d-d843-46bc-b75e-10984b687ed3", - "metadata": {}, - "source": [ - "# Federated Fine-Tuning of Phi-4 Using OpenFL" - ] - }, - { - "cell_type": "markdown", - "id": "20c74cb9-51a2-42e2-893f-d280e227e8bf", - "metadata": {}, - "source": [ - "\n", - "In this tutorial, we demonstrate how to fine-tune Microsoft's Phi-4 model in a federated learning workflow.\n", - "\n", - "We will fine-tune **Microsoft's [Phi4](https://huggingface.co/microsoft/phi-4)** model using a diverse dataset such as [Math_10k](https://github.com/AGI-Edgerunners/LLM-Adapters/tree/main), an open-source dataset containing mathematical question-answer pairs collected from various smaller math datasets." - ] - }, - { - "cell_type": "markdown", - "id": "d07c32d3-1a8d-4162-af45-bc3a10e0ae3f", - "metadata": {}, - "source": [ - "## The Workflow Interface" - ] - }, - { - "cell_type": "markdown", - "id": "e3d74610-e48d-4dd4-b622-eb910fbe91aa", - "metadata": {}, - "source": [ - "The workflow interface is an innovative approach to designing federated learning experiments with OpenFL. It was developed in response to discussions with researchers and users who had unique use cases that didn’t perfectly align with the traditional horizontal federated learning model. This interface enables more flexible compositions of experiments, allowing for greater customization and adaptability in complex, real-world scenarios" - ] - }, - { - "cell_type": "markdown", - "id": "413e1d95-fd76-4fe0-b8d0-4c625c2a8fd3", - "metadata": {}, - "source": [ - "## Installing OpenFL\n", - "To install OpenFL, follow the official documentation: \n", - "[OpenFL Installation Guide](https://openfl.readthedocs.io/en/latest/installation.html)" - ] - }, - { - "cell_type": "markdown", - "id": "53654c70", - "metadata": {}, - "source": [ - "After installation, activate experimental APIs using: \n", - "`fx experimental activate`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "05b2ad75-8c7b-499c-902e-dbd5b24361bc", - "metadata": {}, - "outputs": [], - "source": [ - "# Install dependencies \n", - "!pip install torch transformers peft datasets trl==0.12.2 -q" - ] - }, - { - "cell_type": "markdown", - "id": "440a9c39-ec42-45a5-80f6-9a9e0bc90d2f", - "metadata": {}, - "source": [ - "## Import libraries" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "be4690ae-0671-4d3a-8f21-620ab865a03e", - "metadata": {}, - "outputs": [], - "source": [ - "import hashlib\n", - "import os\n", - "\n", - "import numpy as np\n", - "import requests\n", - "import torch\n", - "import transformers\n", - "from datasets import load_dataset\n", - "from peft import LoraConfig, get_peft_model\n", - "from peft.utils import get_peft_model_state_dict, set_peft_model_state_dict\n", - "from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments\n", - "from transformers.trainer_callback import PrinterCallback\n", - "from trl import SFTTrainer\n", - "\n", - "from openfl.experimental.workflow.interface import Aggregator, Collaborator, FLSpec\n", - "from openfl.experimental.workflow.placement import aggregator, collaborator\n", - "from openfl.experimental.workflow.runtime import LocalRuntime" - ] - }, - { - "cell_type": "markdown", - "id": "08576aa0-f628-4ae6-8fc3-dd167d164784", - "metadata": {}, - "source": [ - "## Acquiring and preprocessing dataset" - ] - }, - { - "cell_type": "markdown", - "id": "7ba1d8b6-8a5b-41a2-8c77-c9a85e869cda", - "metadata": {}, - "source": [ - "We can download the dataset directly from the [LLM-Adapters repository](https://github.com/AGI-Edgerunners/LLM-Adapters)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d615d626-8727-4169-b2a6-3ba15c3cdb95", - "metadata": {}, - "outputs": [], - "source": [ - "def file_checksum(file_path, algorithm=\"sha256\"):\n", - " \"\"\"\n", - " Calculate the checksum of a file using the specified hashing algorithm.\n", - "\n", - " Parameters:\n", - " file_path (str): The path to the file for which the checksum is to be calculated.\n", - " algorithm (str): The hashing algorithm to use (default is 'sha256').\n", - "\n", - " Returns:\n", - " str: The calculated checksum of the file.\n", - " \"\"\"\n", - " hash_func = hashlib.new(algorithm)\n", - " with open(file_path, \"rb\") as f:\n", - " for chunk in iter(lambda: f.read(4096), b\"\"):\n", - " hash_func.update(chunk)\n", - " return hash_func.hexdigest()\n", - "\n", - "\n", - "if not os.path.exists(\"math_10k.json\"):\n", - " r = requests.get(\n", - " \"https://raw.githubusercontent.com/AGI-Edgerunners/LLM-Adapters/main/ft-training_set/math_10k.json\",\n", - " )\n", - " with open(\n", - " \"math_10k.json\",\n", - " \"wb\",\n", - " ) as f:\n", - " f.write(r.content)\n", - "\n", - " actual_checksum = file_checksum(\"math_10k.json\")\n", - " if (\n", - " actual_checksum\n", - " != \"0342d0d860ad8592b579329337c90e42eefd3d9f2898043140cbd120630418b8\"\n", - " ):\n", - " raise ValueError(\n", - " \"Checksum verification failed. The file may have been altered.\"\n", - " )\n", - "\n", - "raw_dataset = load_dataset(\"json\", data_files=\"math_10k.json\")" - ] - }, - { - "cell_type": "markdown", - "id": "3ab15ad6-db35-4a58-a2d5-54a6d3ccdc78", - "metadata": {}, - "source": [ - "## Initialize arguments and configurations" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "eada9809-468a-47c6-9b03-55aa887c9487", - "metadata": {}, - "outputs": [], - "source": [ - "training_config = {\n", - " \"bf16\": True,\n", - " \"use_cpu\": True,\n", - " \"do_eval\": False,\n", - " \"learning_rate\": 5.0e-06,\n", - " \"log_level\": \"info\",\n", - " \"logging_steps\": 20,\n", - " \"lr_scheduler_type\": \"cosine\",\n", - " \"num_train_epochs\": 1,\n", - " \"output_dir\": \"./checkpoint_dir\",\n", - " \"overwrite_output_dir\": True,\n", - " \"per_device_eval_batch_size\": 1,\n", - " \"per_device_train_batch_size\": 1,\n", - " \"save_steps\": 100,\n", - " \"save_total_limit\": 1,\n", - " \"seed\": 0,\n", - " \"gradient_checkpointing\": True,\n", - " \"gradient_checkpointing_kwargs\": {\"use_reentrant\": False},\n", - " \"warmup_ratio\": 0.2,\n", - "}\n", - "\n", - "peft_config = {\n", - " \"r\": 1,\n", - " \"lora_alpha\": 2,\n", - " \"lora_dropout\": 0.05,\n", - " \"bias\": \"none\",\n", - " \"task_type\": \"CAUSAL_LM\",\n", - " \"target_modules\": \"all-linear\",\n", - " \"modules_to_save\": None,\n", - "}\n", - "model_kwargs = dict(\n", - " use_cache=False,\n", - " trust_remote_code=True,\n", - " torch_dtype=torch.bfloat16,\n", - " device_map=None,\n", - ")\n", - "train_conf = TrainingArguments(**training_config)\n", - "peft_conf = LoraConfig(**peft_config)" - ] - }, - { - "cell_type": "markdown", - "id": "ffe93234-2a1a-4809-a431-efe2f35ce496", - "metadata": {}, - "source": [ - "## Load and initialize model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8ab371f1-64c3-4225-82e7-fb3c5b05578c", - "metadata": {}, - "outputs": [], - "source": [ - "checkpoint_path = \"NyxKrage/Microsoft_Phi-4\"\n", - "model = AutoModelForCausalLM.from_pretrained(\n", - " checkpoint_path, return_dict=True, **model_kwargs\n", - ")\n", - "model = get_peft_model(model, peft_conf)\n", - "\n", - "tokenizer = AutoTokenizer.from_pretrained(checkpoint_path)\n", - "sequence_max_length = 512\n", - "val_set_size = 2000\n", - "tokenizer.pad_token_id = 0 # we want this to be different from the eos token\n", - "tokenizer.padding_side = \"left\" # Allow batched inference" - ] - }, - { - "cell_type": "markdown", - "id": "dd058fff-f6dd-4cc6-acaf-7e2fa2c1132d", - "metadata": {}, - "source": [ - "## Preprocess dataset" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4392ddab-10b7-41f6-a8e0-65ba298ea457", - "metadata": {}, - "outputs": [], - "source": [ - "def generate_prompt(data_point):\n", - " \"\"\"\n", - " Generate a prompt based on the given data point.\n", - "\n", - " Parameters:\n", - " data_point (dict): A dictionary containing the instruction, input, and output.\n", - "\n", - " Returns:\n", - " str: The generated prompt as a string.\n", - " \"\"\"\n", - " if data_point[\"input\"]:\n", - " return f\"\"\"Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request. \n", - "\n", - " ### Instruction:\n", - " {data_point[\"instruction\"]}\n", - " \n", - " ### Input:\n", - " {data_point[\"input\"]}\n", - " \n", - " ### Response:\n", - " {data_point[\"output\"]}\"\"\"\n", - " else:\n", - " return f\"\"\"Below is an instruction that describes a task. Write a response that appropriately completes the request. \n", - "\n", - " ### Instruction:\n", - " {data_point[\"instruction\"]}\n", - " \n", - " ### Response:\n", - " {data_point[\"output\"]}\"\"\"\n", - "\n", - "\n", - "def tokenize(prompt, add_eos_token=True):\n", - " \"\"\"\n", - " Tokenize the given prompt.\n", - "\n", - " Parameters:\n", - " prompt (str): The prompt to be tokenized.\n", - " add_eos_token (bool): Whether to add an end-of-sequence token (default is True).\n", - "\n", - " Returns:\n", - " dict: A dictionary containing the tokenized input IDs and attention mask.\n", - " \"\"\"\n", - " result = tokenizer(\n", - " prompt,\n", - " truncation=True,\n", - " max_length=sequence_max_length,\n", - " padding=False,\n", - " return_tensors=None,\n", - " )\n", - " if (\n", - " result[\"input_ids\"][-1] != tokenizer.eos_token_id\n", - " and len(result[\"input_ids\"]) < sequence_max_length\n", - " and add_eos_token\n", - " ):\n", - " result[\"input_ids\"].append(tokenizer.eos_token_id)\n", - " result[\"attention_mask\"].append(1)\n", - "\n", - " result[\"labels\"] = result[\"input_ids\"].copy()\n", - "\n", - " return result\n", - "\n", - "\n", - "def generate_and_tokenize_prompt(data_point):\n", - " \"\"\"\n", - " Generate and tokenize a prompt based on the given data point.\n", - "\n", - " Parameters:\n", - " data_point (dict): A dictionary containing the instruction, input, and output.\n", - "\n", - " Returns:\n", - " dict: A dictionary containing the tokenized input IDs, attention mask, and labels.\n", - " \"\"\"\n", - " full_prompt = generate_prompt(data_point)\n", - " tokenized_full_prompt = tokenize(full_prompt)\n", - " user_prompt = generate_prompt({**data_point, \"output\": \"\"})\n", - " tokenized_user_prompt = tokenize(user_prompt, add_eos_token=False)\n", - " user_prompt_len = len(tokenized_user_prompt[\"input_ids\"])\n", - "\n", - " tokenized_full_prompt[\"labels\"] = [-100] * user_prompt_len + tokenized_full_prompt[\n", - " \"labels\"\n", - " ][user_prompt_len:]\n", - " return tokenized_full_prompt\n", - "\n", - "\n", - "train_val = raw_dataset[\"train\"].train_test_split(\n", - " test_size=val_set_size, shuffle=True, seed=42\n", - ")\n", - "\n", - "processed_train_dataset = train_val[\"train\"].shuffle().map(generate_and_tokenize_prompt).select(range(3))\n", - "processed_test_dataset = train_val[\"test\"].shuffle().map(generate_and_tokenize_prompt).select(range(3))" - ] - }, - { - "cell_type": "markdown", - "id": "812cfcc8-33ec-4a2b-8a74-27bfc2a41d7b", - "metadata": {}, - "source": [ - "## Define Federated Averaging Method\n", - "The FedAvg method is used to average the models from all the collaborators after training." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6dc85c57-68b2-4514-9373-43e3d7c05c10", - "metadata": {}, - "outputs": [], - "source": [ - "def FedAvg(peft_params, model, weights=None):\n", - " \"\"\"\n", - " Perform Federated Averaging (FedAvg) on the model parameters.\n", - "\n", - " Parameters:\n", - " peft_params (list): A list of state dictionaries containing the model parameters from different clients.\n", - " model (torch.nn.Module): The model to which the averaged parameters will be applied.\n", - " weights (list, optional): A list of weights for averaging the parameters. If None, equal weights are used.\n", - "\n", - " Returns:\n", - " torch.nn.Module: The model with the averaged parameters applied.\n", - " \"\"\"\n", - " state_dicts = peft_params\n", - " state_dict = get_peft_model_state_dict(model)\n", - " for key in peft_params[0]:\n", - " dtype = state_dicts[0][key].dtype\n", - " state_dict[key] = torch.from_numpy(\n", - " np.average(\n", - " [state[key].to(torch.float).numpy() for state in state_dicts], axis=0, weights=weights\n", - " )\n", - " ).to(dtype)\n", - " set_peft_model_state_dict(model, state_dict)\n", - " return model" - ] - }, - { - "cell_type": "markdown", - "id": "810eb75e", - "metadata": {}, - "source": [ - "Now we come to the flow definition. The OpenFL Workflow Interface adopts the conventions set by Metaflow, that every workflow begins with `start` and concludes with the `end` task. The aggregator begins with an optionally passed in model and optimizer. The aggregator begins the flow with the `start` task, where the list of collaborators is extracted from the runtime (`self.collaborators = self.runtime.collaborators`) and is then used as the list of participants to run the task listed in `self.next`, `aggregated_model_validation`. The model, optimizer, and anything that is not explicitly excluded from the next function will be passed from the `start` function on the aggregator to the `aggregated_model_validation` task on the collaborator. Where the tasks run is determined by the placement decorator that precedes each task definition (`@aggregator` or `@collaborator`). Once each of the collaborators (defined in the runtime) complete the `aggregated_model_validation` task, they pass their current state onto the `train` task, from `train` to `local_model_validation`, and then finally to `join` at the aggregator. It is in `join` that an average is taken of the model weights, and the next round can begin.\n", - "\n", - "![Workflow Interface](../../../../docs/images/workflow_interface.png)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "58298e8e-ab9e-4377-966e-143823441697", - "metadata": {}, - "outputs": [], - "source": [ - "class FederatedFlow(FLSpec):\n", - " def __init__(self, model=None, optimizer=None, rounds=3, **kwargs):\n", - " \"\"\"\n", - " Initialize the class with the given model, optimizer, and number of rounds.\n", - "\n", - " Parameters:\n", - " model (torch.nn.Module, optional): The model to be used. If None, a ValueError is raised.\n", - " optimizer (torch.optim.Optimizer, optional): The optimizer to be used.\n", - " rounds (int, optional): The number of rounds for training or processing (default is 3).\n", - " **kwargs: Additional keyword arguments to be passed to the superclass initializer.\n", - "\n", - " Raises:\n", - " ValueError: If no model is provided.\n", - " \"\"\"\n", - " super().__init__(**kwargs)\n", - " if model is not None:\n", - " self.model = model\n", - " self.peft_params = get_peft_model_state_dict(self.model)\n", - " self.optimizer = optimizer\n", - " else:\n", - " raise ValueError(\"No model inputted\")\n", - "\n", - " self.rounds = rounds\n", - " \n", - "\n", - " @aggregator\n", - " def start(self):\n", - " \"\"\"\n", - " Initialize the model and set up the collaborators for federated learning.\n", - "\n", - " This method performs the initial setup for the model, including setting the\n", - " collaborators, initializing private variables, and starting the first round\n", - " of the federated learning process.\n", - " \"\"\"\n", - " print(f\"Performing initialization for model\")\n", - " self.collaborators = self.runtime.collaborators\n", - " self.current_round = 0\n", - " self.next(\n", - " self.aggregated_model_validation,\n", - " foreach=\"collaborators\",\n", - " )\n", - "\n", - " \n", - " @collaborator\n", - " def aggregated_model_validation(self):\n", - " \"\"\"\n", - " Perform aggregated model validation for a collaborator.\n", - "\n", - " This method loads the model, applies the PEFT configuration, and evaluates\n", - " the model using the provided training and evaluation datasets. The validation\n", - " score is then stored and the next step in the process is triggered.\n", - " \"\"\"\n", - " print(f\"Performing aggregated model validation for collaborator {self.input}\")\n", - " self.model = AutoModelForCausalLM.from_pretrained(\n", - " checkpoint_path, return_dict=True, **model_kwargs\n", - " )\n", - " self.model = get_peft_model(self.model, peft_conf)\n", - " set_peft_model_state_dict(self.model, self.peft_params)\n", - " trainer = SFTTrainer(\n", - " model=self.model,\n", - " args=train_conf,\n", - " peft_config=peft_conf,\n", - " train_dataset=self.train_dataset,\n", - " eval_dataset=self.eval_dataset,\n", - " max_seq_length=sequence_max_length,\n", - " dataset_text_field=\"text\",\n", - " tokenizer=tokenizer,\n", - " packing=True,\n", - " data_collator=transformers.DataCollatorForSeq2Seq(\n", - " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", - " ),\n", - " )\n", - "\n", - " trainer.remove_callback(PrinterCallback)\n", - " out = trainer.evaluate()\n", - " self.agg_validation_score = out[\"eval_loss\"]\n", - " print(f\"{self.input} value of {self.agg_validation_score}\")\n", - " self.next(self.train)\n", - "\n", - " @collaborator\n", - " def train(self):\n", - " \"\"\"\n", - " Train the model for a collaborator.\n", - "\n", - " This method trains the model using the provided training and evaluation datasets.\n", - " The training loss is stored, the model is saved, and the next step in the process\n", - " is triggered.\n", - " \"\"\"\n", - " trainer = SFTTrainer(\n", - " model=self.model,\n", - " args=train_conf,\n", - " peft_config=peft_conf,\n", - " train_dataset=self.train_dataset,\n", - " eval_dataset=self.eval_dataset,\n", - " max_seq_length=sequence_max_length,\n", - " dataset_text_field=\"text\",\n", - " tokenizer=tokenizer,\n", - " packing=True,\n", - " data_collator=transformers.DataCollatorForSeq2Seq(\n", - " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", - " ),\n", - " )\n", - "\n", - " out = trainer.train()\n", - " self.loss = out.training_loss\n", - " trainer.save_model()\n", - " self.training_completed = True\n", - " self.next(self.local_model_validation)\n", - "\n", - " @collaborator\n", - " def local_model_validation(self):\n", - " \"\"\"\n", - " Perform local model validation for a collaborator.\n", - "\n", - " This method evaluates the model using the provided training and evaluation datasets.\n", - " The validation score is stored, the PEFT parameters are updated, and the next step\n", - " in the process is triggered.\n", - " \"\"\"\n", - " trainer = SFTTrainer(\n", - " model=self.model,\n", - " args=train_conf,\n", - " peft_config=peft_conf,\n", - " train_dataset=processed_train_dataset,\n", - " eval_dataset=processed_test_dataset,\n", - " max_seq_length=sequence_max_length,\n", - " dataset_text_field=\"text\",\n", - " tokenizer=tokenizer,\n", - " packing=True,\n", - " data_collator=transformers.DataCollatorForSeq2Seq(\n", - " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", - " ),\n", - " )\n", - " out = trainer.evaluate()\n", - " self.local_validation_score = out[\"eval_loss\"]\n", - " self.peft_params = get_peft_model_state_dict(self.model)\n", - " print(f\"Doing local model validation for collaborator {self.input}\")\n", - " self.next(self.join, exclude=[\"training_completed\", \"model\"])\n", - "\n", - " @aggregator\n", - " def join(self, inputs):\n", - " \"\"\"\n", - " Aggregate the results from all collaborators and update the model.\n", - "\n", - " This method calculates the average loss, aggregated model accuracy, and local model\n", - " accuracy from all collaborators. The model parameters are updated using Federated\n", - " Averaging (FedAvg), and the next round of the process is triggered if applicable.\n", - " \"\"\"\n", - " self.average_loss = sum(input.loss for input in inputs) / len(inputs)\n", - " self.aggregated_model_accuracy = sum(\n", - " input.agg_validation_score for input in inputs\n", - " ) / len(inputs)\n", - " self.local_model_accuracy = sum(\n", - " input.local_validation_score for input in inputs\n", - " ) / len(inputs)\n", - " print(\n", - " f\"Average aggregated model validation values = {self.aggregated_model_accuracy}\"\n", - " )\n", - " print(f\"Average training loss = {self.average_loss}\")\n", - " print(f\"Average local model validation values = {self.local_model_accuracy}\")\n", - "\n", - " self.model = FedAvg([input.peft_params for input in inputs], self.model)\n", - " self.peft_params = get_peft_model_state_dict(self.model)\n", - "\n", - " self.model.save_pretrained(\"./aggregated/model\")\n", - " tokenizer.save_pretrained(\"./aggregated/tokenizer\")\n", - " self.current_round += 1\n", - " if self.current_round < self.rounds:\n", - " self.next(\n", - " self.aggregated_model_validation,\n", - " foreach=\"collaborators\",\n", - " exclude=[\"model\"],\n", - " )\n", - " else:\n", - " self.next(self.end)\n", - "\n", - " @aggregator\n", - " def end(self):\n", - " \"\"\"\n", - " End the federated learning process.\n", - "\n", - " This method marks the end of the federated learning process and performs any\n", - " necessary cleanup or finalization steps.\n", - " \"\"\"\n", - " print(f\"This is the end of the flow\")\n" - ] - }, - { - "cell_type": "markdown", - "id": "e120a656-f4a5-47a5-a3d4-62c5f3672bba", - "metadata": {}, - "source": [ - "You'll notice in the `FederatedFlow` definition above that there were certain attributes that the flow was not initialized with, namely the `train_dataset` and `eval_dataset` for each of the collaborators. These are **private_attributes** that are exposed only through the runtime. Each participant has its own set of private attributes: a dictionary where the key is the attribute name, and the value is the object that will be made accessible through that participant's task.\n", - "\n", - "Below, we segment shards of the Math_10k dataset for **two collaborators**: Portland and Seattle. Each has their own slice of the dataset that's accessible via the `train_dataset` or `eval_dataset` attribute. Note that the private attributes are flexible, and you can choose to pass in a completely different type of object to any of the collaborators or aggregator (with an arbitrary name). These private attributes will always be filtered out of the current state when transferring from collaborator to aggregator, or vice versa." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e5e108c6-5150-4931-9c01-6b64a913fa04", - "metadata": {}, - "outputs": [], - "source": [ - "# Setup participants\n", - "_aggregator = Aggregator()\n", - "_aggregator.private_attributes = {}\n", - "\n", - "# Setup collaborators with private attributes\n", - "collaborator_names = [\n", - " \"Portland\",\n", - " \"Seattle\",\n", - "]\n", - "_collaborators = [Collaborator(name=name) for name in collaborator_names]\n", - "\n", - "for idx, current_collaborator in enumerate(_collaborators):\n", - " # Set the private attributes of the Collaborator to include their specific training and testing data loaders\n", - " current_collaborator.private_attributes = {\n", - " \"train_dataset\": processed_train_dataset.shard(\n", - " num_shards=len(_collaborators), index=idx\n", - " ),\n", - " \"eval_dataset\": processed_test_dataset.shard(\n", - " num_shards=len(_collaborators), index=idx\n", - " ),\n", - " }\n", - "\n", - "local_runtime = LocalRuntime(\n", - " aggregator=_aggregator, collaborators=_collaborators, backend=\"single_process\"\n", - ")\n", - "print(f\"Local runtime collaborators = {local_runtime.collaborators}\")" - ] - }, - { - "cell_type": "markdown", - "id": "9cb61fc0", - "metadata": {}, - "source": [ - "## Run Experiment" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "38894111-41d9-4dd4-b1c8-eb7ec3cdd3e1", - "metadata": {}, - "outputs": [], - "source": [ - "flflow = FederatedFlow(model, rounds=2)\n", - "flflow.runtime = local_runtime\n", - "flflow.run()\n", - "\n", - "# Determine the final model accuracy:\n", - "print(f'\\nFinal aggregated model accuracy for {flflow.rounds} rounds of training: {flflow.aggregated_model_accuracy}')" - ] - }, - { - "cell_type": "markdown", - "id": "7bc8fe27", - "metadata": {}, - "source": [ - "## 🎉 Congratulations! 🎉\n", - "\n", - "Now that you've completed this notebook, check out our [other tutorials](https://github.com/securefederatedai/openfl/tree/develop/openfl-tutorials/experimental/)\n", - "\n", - "- Using the LocalRuntime Ray Backend for dedicated GPU access\n", - "- Vertical Federated Learning\n", - "- Model Watermarking\n", - "- Differential Privacy\n", - "- And More!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.8" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 1a9c1f426e5575e54fda983b9bdc530d5408aafe Mon Sep 17 00:00:00 2001 From: Rajith Date: Fri, 16 May 2025 11:07:39 +0530 Subject: [PATCH 27/34] removing unwanted files --- .github/scripts/extract_emails.py | 45 -- .github/scripts/send_email.py | 97 ---- .../workflow/LLM/phi-4-quanti.ipynb | 300 ------------ .../experimental/workflow/LLM/phi-4-sol.ipynb | 438 ------------------ 4 files changed, 880 deletions(-) delete mode 100644 .github/scripts/extract_emails.py delete mode 100644 .github/scripts/send_email.py delete mode 100644 openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb delete mode 100644 openfl-tutorials/experimental/workflow/LLM/phi-4-sol.ipynb diff --git a/.github/scripts/extract_emails.py b/.github/scripts/extract_emails.py deleted file mode 100644 index 70f17b64a6..0000000000 --- a/.github/scripts/extract_emails.py +++ /dev/null @@ -1,45 +0,0 @@ -import re -import os -import sys -import json - -def extract_emails(filepath): - """ - Extract all unique email addresses from the given file. - """ - email_pattern = r'[\w.+-]+@[\w-]+\.[\w.-]+' - unique_emails = set() - - try: - with open(filepath, 'r') as file: - for line in file: - # Skip comment lines that don't contain emails - if line.strip().startswith('#') and '@' not in line: - continue - - # Find all email addresses in the line - emails = re.findall(email_pattern, line) - unique_emails.update(emails) - except Exception as e: - print(f"Error processing {filepath}: {str(e)}", file=sys.stderr) - - return sorted(unique_emails) - -if __name__ == "__main__": - # Check CODEOWNERS in standard locations - codeowners_path = None - for path in ['.github/CODEOWNERS', 'CODEOWNERS', 'docs/CODEOWNERS']: - if os.path.exists(path): - codeowners_path = path - break - - result = { - "emails": [], - "codeowners_path": codeowners_path - } - - if codeowners_path: - emails = extract_emails(codeowners_path) - result["emails"] = emails - - print(json.dumps(result)) diff --git a/.github/scripts/send_email.py b/.github/scripts/send_email.py deleted file mode 100644 index 4c151e30fc..0000000000 --- a/.github/scripts/send_email.py +++ /dev/null @@ -1,97 +0,0 @@ -import os -import smtplib -import logging -import argparse -from email.message import EmailMessage -from email.mime.base import MIMEBase -from email import encoders - -logger = logging.getLogger(__name__) - -def send_email(sender_email: str, to_email: str, subject: str, email_body: str, smtp_user: str, smtp_pwd: str, - smtp_email_server: str, cc_email: str = '', bcc_email: str = '', reply_email: str = '', is_html_body: bool = False, - attachments: str = '') -> None: - - message = EmailMessage() - message["Subject"] = subject - message["From"] = sender_email - if to_email: - to_list = to_email.split(",") - message["To"] = ", ".join(to_list) - if cc_email: - cc_list = cc_email.split(",") - message["Cc"] = ", ".join(cc_list) - if reply_email: - message["Reply-To"] = reply_email - sub_type = 'plain' - if is_html_body: - sub_type = 'html' - message.set_content(email_body, subtype=sub_type) - # Set up attachment if any - if attachments: - for attachment in attachments.split(','): - with open(attachment, 'rb') as attachment_file: - attachment_data = attachment_file.read() - message.add_attachment( - attachment_data, - maintype='application', - subtype='octet-stream', - filename=os.path.basename(attachment) - ) - logger.info(f'Setting smtp server {smtp_email_server}...') - smtp_server = smtplib.SMTP(smtp_email_server) - smtp_server.starttls() - smtp_server.login(smtp_user, smtp_pwd) - logger.info(f'smtp server authentication successful') - try: - logger.info(f'Sending email...') - if bcc_email: - # Send bcc list as an argument instead of adding it to the header to keep it hidden - bcc_list = bcc_email.split(",") - smtp_server.send_message(message, bcc=bcc_list) - else: - smtp_server.send_message(message) - logger.info(f'email sent.') - except Exception as ex: - raise ex - finally: - try: - smtp_server.quit() - except smtplib.SMTPServerDisconnected: - pass - finally: - logger.info("smtp connection is closed") - -def main(): - parser = argparse.ArgumentParser(description="Send an email with optional attachments") - parser.add_argument('--sender', required=True, help='Sender email address') - parser.add_argument('--to', required=True, help='Recipient email address(es) (comma-separated)') - parser.add_argument('--subject', required=True, help='Email subject') - parser.add_argument('--body', required=True, help='Email body') - parser.add_argument('--smtp-user', required=True, help='SMTP server username') - parser.add_argument('--smtp-pwd', required=True, help='SMTP server password') - parser.add_argument('--smtp-server', required=True, help='SMTP server address and port') - parser.add_argument('--cc', default='', help='CC email address(es) (comma-separated)') - parser.add_argument('--bcc', default='', help='BCC email address(es) (comma-separated)') - parser.add_argument('--reply-to', default='', help='Reply-To email address') - parser.add_argument('--html-body', action='store_true', help='Flag to indicate if email body is HTML') - parser.add_argument('--attachments', default='', help='Attachment file path(s) (space-separated)') - args = parser.parse_args() - - send_email( - sender_email=args.sender, - to_email=args.to, - subject=args.subject, - email_body=args.body, - smtp_user=args.smtp_user, - smtp_pwd=args.smtp_pwd, - smtp_email_server=args.smtp_server, - cc_email=args.cc, - bcc_email=args.bcc, - reply_email=args.reply_to, - is_html_body=args.html_body, - attachments=args.attachments - ) - -if __name__ == '__main__': - main() diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb deleted file mode 100644 index 59ae25d98a..0000000000 --- a/openfl-tutorials/experimental/workflow/LLM/phi-4-quanti.ipynb +++ /dev/null @@ -1,300 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "a59f475d-d843-46bc-b75e-10984b687ed3", - "metadata": {}, - "source": [ - "# Federated Fine-Tuning of Phi-4 with 8-bit Quantization" - ] - }, - { - "cell_type": "markdown", - "id": "20c74cb9-51a2-42e2-893f-d280e227e8bf", - "metadata": {}, - "source": [ - "This notebook demonstrates federated fine-tuning of Microsoft's Phi-4 model (4B parameters) with 8-bit quantization using OpenFL." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "05b2ad75-8c7b-499c-902e-dbd5b24361bc", - "metadata": {}, - "outputs": [], - "source": [ - "!pip install torch transformers peft datasets trl==0.12.2 bitsandbytes accelerate -q" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "be4690ae-0671-4d3a-8f21-620ab865a03e", - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import transformers\n", - "from transformers import (\n", - " AutoModelForCausalLM,\n", - " AutoTokenizer,\n", - " BitsAndBytesConfig,\n", - " TrainingArguments\n", - ")\n", - "from peft import LoraConfig, get_peft_model\n", - "from datasets import load_dataset\n", - "from trl import SFTTrainer\n", - "import numpy as np\n", - "from openfl.experimental.workflow.interface import Aggregator, Collaborator, FLSpec\n", - "from openfl.experimental.workflow.placement import aggregator, collaborator\n", - "from openfl.experimental.workflow.runtime import LocalRuntime" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d615d626-8727-4169-b2a6-3ba15c3cdb95", - "metadata": {}, - "outputs": [], - "source": [ - "# 8-bit quantization config for Phi-4\n", - "quant_config = BitsAndBytesConfig(\n", - " load_in_8bit=True,\n", - " llm_int8_threshold=6.0,\n", - " llm_int8_skip_modules=None,\n", - " llm_int8_enable_fp32_cpu_offload=False,\n", - " llm_int8_has_fp16_weight=False\n", - ")\n", - "\n", - "# Model config for Phi-4\n", - "model_kwargs = {\n", - " \"quantization_config\": quant_config,\n", - " \"device_map\": \"auto\",\n", - " \"trust_remote_code\": True,\n", - " \"torch_dtype\": torch.bfloat16\n", - "}\n", - "\n", - "# PEFT config optimized for Phi-4\n", - "peft_config = LoraConfig(\n", - " r=16, # Higher rank for larger model\n", - " lora_alpha=32,\n", - " target_modules=[\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\", \"gate_proj\", \"up_proj\", \"down_proj\"],\n", - " lora_dropout=0.05,\n", - " bias=\"none\",\n", - " task_type=\"CAUSAL_LM\"\n", - ")\n", - "\n", - "# Training config adjusted for Phi-4\n", - "training_config = TrainingArguments(\n", - " output_dir=\"./results\",\n", - " per_device_train_batch_size=1, # Reduced for 4B model\n", - " per_device_eval_batch_size=1,\n", - " gradient_accumulation_steps=8, # Increased for memory efficiency\n", - " learning_rate=1e-5, # Lower learning rate for larger model\n", - " logging_steps=10,\n", - " num_train_epochs=1,\n", - " max_grad_norm=0.3,\n", - " warmup_ratio=0.03,\n", - " lr_scheduler_type=\"cosine\",\n", - " save_steps=100,\n", - " bf16=True, # Using bfloat16 for Phi-4\n", - " optim=\"adamw_torch\",\n", - " report_to=\"none\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8ab371f1-64c3-4225-82e7-fb3c5b05578c", - "metadata": {}, - "outputs": [], - "source": [ - "# Load Phi-4 model and tokenizer\n", - "model = AutoModelForCausalLM.from_pretrained(\"microsoft/phi-4\", **model_kwargs)\n", - "model = get_peft_model(model, peft_config)\n", - "tokenizer = AutoTokenizer.from_pretrained(\"microsoft/phi-4\")\n", - "tokenizer.pad_token = tokenizer.eos_token\n", - "tokenizer.padding_side = \"left\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4392ddab-10b7-41f6-a8e0-65ba298ea457", - "metadata": {}, - "outputs": [], - "source": [ - "# Dataset preparation for Phi-4\n", - "def format_instruction(sample):\n", - " return f\"\"\"### Instruction:\n", - "{sample['instruction']}\n", - "\n", - "### Input:\n", - "{sample['input']}\n", - "\n", - "### Response:\n", - "{sample['output']}\"\"\"\n", - "\n", - "dataset = load_dataset(\"json\", data_files=\"math_10k.json\")[\"train\"].train_test_split(test_size=0.1)\n", - "train_data = dataset[\"train\"].shuffle().select(range(50)) # Smaller subset for Phi-4\n", - "val_data = dataset[\"test\"].shuffle().select(range(10))\n", - "\n", - "train_data = train_data.map(lambda x: {\"text\": format_instruction(x)})\n", - "val_data = val_data.map(lambda x: {\"text\": format_instruction(x)})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6dc85c57-68b2-4514-9373-43e3d7c05c10", - "metadata": {}, - "outputs": [], - "source": [ - "class FederatedFlow(FLSpec):\n", - " def __init__(self, model=None, rounds=3, **kwargs):\n", - " super().__init__(**kwargs)\n", - " self.model = model\n", - " self.rounds = rounds\n", - " self.training_metrics = []\n", - " \n", - " @aggregator\n", - " def start(self):\n", - " print(\"Starting federated training for Phi-4\")\n", - " self.collaborators = self.runtime.collaborators\n", - " self.current_round = 0\n", - " self.next(self.aggregated_model_validation, foreach=\"collaborators\")\n", - " \n", - " @collaborator\n", - " def aggregated_model_validation(self):\n", - " trainer = SFTTrainer(\n", - " model=self.model,\n", - " args=training_config,\n", - " train_dataset=self.train_data,\n", - " eval_dataset=self.val_data,\n", - " dataset_text_field=\"text\",\n", - " max_seq_length=512,\n", - " tokenizer=tokenizer\n", - " )\n", - " metrics = trainer.evaluate()\n", - " self.validation_loss = metrics[\"eval_loss\"]\n", - " self.next(self.train)\n", - " \n", - " @collaborator\n", - " def train(self):\n", - " trainer = SFTTrainer(\n", - " model=self.model,\n", - " args=training_config,\n", - " train_dataset=self.train_data,\n", - " eval_dataset=self.val_data,\n", - " dataset_text_field=\"text\",\n", - " max_seq_length=512,\n", - " tokenizer=tokenizer\n", - " )\n", - " train_result = trainer.train()\n", - " self.training_loss = train_result.training_loss\n", - " self.training_metrics.append({\n", - " \"round\": self.current_round,\n", - " \"loss\": self.training_loss,\n", - " \"collaborator\": self.input\n", - " })\n", - " self.next(self.local_model_validation)\n", - " \n", - " @collaborator\n", - " def local_model_validation(self):\n", - " trainer = SFTTrainer(\n", - " model=self.model,\n", - " args=training_config,\n", - " train_dataset=self.train_data,\n", - " eval_dataset=self.val_data,\n", - " dataset_text_field=\"text\",\n", - " max_seq_length=512,\n", - " tokenizer=tokenizer\n", - " )\n", - " metrics = trainer.evaluate()\n", - " self.local_validation_loss = metrics[\"eval_loss\"]\n", - " self.next(self.join, exclude=[\"model\"])\n", - " \n", - " @aggregator\n", - " def join(self, inputs):\n", - " avg_loss = sum(input.training_loss for input in inputs) / len(inputs)\n", - " avg_val_loss = sum(input.validation_loss for input in inputs) / len(inputs)\n", - " \n", - " print(f\"Round {self.current_round} - Avg Training Loss: {avg_loss:.4f}\")\n", - " print(f\"Round {self.current_round} - Avg Validation Loss: {avg_val_loss:.4f}\")\n", - " \n", - " # Aggregate model updates\n", - " self.current_round += 1\n", - " if self.current_round < self.rounds:\n", - " self.next(self.aggregated_model_validation, foreach=\"collaborators\")\n", - " else:\n", - " self.next(self.end)\n", - " \n", - " @aggregator\n", - " def end(self):\n", - " print(\"Phi-4 Training complete!\")\n", - " print(\"Final Training Metrics:\")\n", - " for metric in self.training_metrics:\n", - " print(f\"Round {metric['round']} - {metric['collaborator']} - Loss: {metric['loss']:.4f}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e5e108c6-5150-4931-9c01-6b64a913fa04", - "metadata": {}, - "outputs": [], - "source": [ - "# Setup runtime for Phi-4\n", - "aggregator = Aggregator()\n", - "collaborators = [\n", - " Collaborator(name=\"Portland\", private_attributes={\"train_data\": train_data.shard(2, 0), \"val_data\": val_data.shard(2, 0)}),\n", - " Collaborator(name=\"Seattle\", private_attributes={\"train_data\": train_data.shard(2, 1), \"val_data\": val_data.shard(2, 1)})\n", - "]\n", - "\n", - "runtime = LocalRuntime(aggregator=aggregator, collaborators=collaborators, backend=\"single_process\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "38894111-41d9-4dd4-b1c8-eb7ec3cdd3e1", - "metadata": {}, - "outputs": [], - "source": [ - "# Run training for Phi-4\n", - "flow = FederatedFlow(model, rounds=2)\n", - "flow.runtime = runtime\n", - "flow.run()" - ] - }, - { - "cell_type": "markdown", - "id": "7bc8fe27", - "metadata": {}, - "source": [ - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.8" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-sol.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-sol.ipynb deleted file mode 100644 index b1ca1bac6e..0000000000 --- a/openfl-tutorials/experimental/workflow/LLM/phi-4-sol.ipynb +++ /dev/null @@ -1,438 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "a59f475d-d843-46bc-b75e-10984b687ed3", - "metadata": {}, - "source": [ - "# Enhanced Federated Fine-Tuning of Phi-4 Using OpenFL with PEFT & Quantization" - ] - }, - { - "cell_type": "markdown", - "id": "20c74cb9-51a2-42e2-893f-d280e227e8bf", - "metadata": {}, - "source": [ - "In this tutorial, we demonstrate how to fine-tune Microsoft's Phi-4 model in a federated learning workflow with enhanced local training using:\n", - "- Parameter-Efficient Fine-Tuning (PEFT)\n", - "- 4-bit Quantization (QLoRA)\n", - "- Gradient Checkpointing\n", - "- Optimized Training Configuration" - ] - }, - { - "cell_type": "markdown", - "id": "d07c32d3-1a8d-4162-af45-bc3a10e0ae3f", - "metadata": {}, - "source": [ - "## Installation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "05b2ad75-8c7b-499c-902e-dbd5b24361bc", - "metadata": {}, - "outputs": [], - "source": [ - "!pip install torch transformers peft datasets trl==0.12.2 bitsandbytes accelerate -q" - ] - }, - { - "cell_type": "markdown", - "id": "440a9c39-ec42-45a5-80f6-9a9e0bc90d2f", - "metadata": {}, - "source": [ - "## Import Libraries" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "be4690ae-0671-4d3a-8f21-620ab865a03e", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import torch\n", - "from transformers import (\n", - " AutoModelForCausalLM,\n", - " AutoTokenizer,\n", - " BitsAndBytesConfig,\n", - " TrainingArguments\n", - ")\n", - "from peft import (\n", - " LoraConfig,\n", - " get_peft_model,\n", - " prepare_model_for_kbit_training,\n", - " PeftModel\n", - ")\n", - "from peft.utils import get_peft_model_state_dict, set_peft_model_state_dict # Added this import\n", - "from datasets import load_dataset\n", - "from trl import SFTTrainer\n", - "from openfl.experimental.workflow import FLSpec, Aggregator, Collaborator, LocalRuntime\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "id": "08576aa0-f628-4ae6-8fc3-dd167d164784", - "metadata": {}, - "source": [ - "## Configuration" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "eada9809-468a-47c6-9b03-55aa887c9487", - "metadata": {}, - "outputs": [], - "source": [ - "# Model and dataset\n", - "model_name = \"microsoft/phi-4\"\n", - "dataset_name = \"math_10k.json\"\n", - "\n", - "# QLoRA configuration\n", - "bnb_config = BitsAndBytesConfig(\n", - " load_in_4bit=True,\n", - " bnb_4bit_quant_type=\"nf4\",\n", - " bnb_4bit_compute_dtype=torch.bfloat16,\n", - " bnb_4bit_use_double_quant=True,\n", - ")\n", - "\n", - "# LoRA configuration\n", - "peft_config = LoraConfig(\n", - " r=16, # Increased from original for better adaptation\n", - " lora_alpha=32,\n", - " lora_dropout=0.05,\n", - " bias=\"none\",\n", - " task_type=\"CAUSAL_LM\",\n", - " target_modules=[\"q_proj\", \"k_proj\", \"v_proj\", \"dense\"],\n", - ")\n", - "\n", - "# Training configuration\n", - "training_args = TrainingArguments(\n", - " output_dir=\"./results\",\n", - " num_train_epochs=1,\n", - " per_device_train_batch_size=1, # Reduced for Phi-4\n", - " gradient_accumulation_steps=2,\n", - " optim=\"paged_adamw_32bit\",\n", - " save_steps=100,\n", - " logging_steps=10,\n", - " learning_rate=2e-4,\n", - " weight_decay=0.001,\n", - " fp16=False,\n", - " bf16=True,\n", - " max_grad_norm=0.3,\n", - " warmup_ratio=0.03,\n", - " lr_scheduler_type=\"cosine\",\n", - " gradient_checkpointing=True,\n", - " report_to=\"none\"\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "ffe93234-2a1a-4809-a431-efe2f35ce496", - "metadata": {}, - "source": [ - "## Load and Prepare Model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8ab371f1-64c3-4225-82e7-fb3c5b05578c", - "metadata": {}, - "outputs": [], - "source": [ - "# Load tokenizer\n", - "tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)\n", - "tokenizer.pad_token = tokenizer.eos_token\n", - "tokenizer.padding_side = \"right\"\n", - "\n", - "# Load model with quantization\n", - "model = AutoModelForCausalLM.from_pretrained(\n", - " model_name,\n", - " quantization_config=bnb_config,\n", - " device_map=\"auto\",\n", - " trust_remote_code=True\n", - ")\n", - "\n", - "# Prepare model for k-bit training\n", - "model = prepare_model_for_kbit_training(model)\n", - "\n", - "# Apply LoRA\n", - "model = get_peft_model(model, peft_config)\n", - "model.print_trainable_parameters()" - ] - }, - { - "cell_type": "markdown", - "id": "dd058fff-f6dd-4cc6-acaf-7e2fa2c1132d", - "metadata": {}, - "source": [ - "## Load and Prepare Dataset" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4392ddab-10b7-41f6-a8e0-65ba298ea457", - "metadata": {}, - "outputs": [], - "source": [ - "def format_prompt(example):\n", - " if example[\"input\"]:\n", - " return f\"\"\"Below is an instruction that describes a task. Write a response that appropriately completes the request.\n", - "\n", - "### Instruction:\n", - "{example['instruction']}\n", - "\n", - "### Input:\n", - "{example['input']}\n", - "\n", - "### Response:\n", - "{example['output']}\"\"\"\n", - " else:\n", - " return f\"\"\"Below is an instruction that describes a task. Write a response that appropriately completes the request.\n", - "\n", - "### Instruction:\n", - "{example['instruction']}\n", - "\n", - "### Response:\n", - "{example['output']}\"\"\"\n", - "\n", - "# Load dataset\n", - "dataset = load_dataset(\"json\", data_files=dataset_name, split=\"train\")\n", - "dataset = dataset.map(lambda x: {\"text\": format_prompt(x)})\n", - "\n", - "# Split dataset\n", - "dataset = dataset.train_test_split(test_size=0.1)\n", - "train_dataset = dataset[\"train\"]\n", - "eval_dataset = dataset[\"test\"]" - ] - }, - { - "cell_type": "markdown", - "id": "812cfcc8-33ec-4a2b-8a74-27bfc2a41d7b", - "metadata": {}, - "source": [ - "## Enhanced Training with SFTTrainer" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6dc85c57-68b2-4514-9373-43e3d7c05c10", - "metadata": {}, - "outputs": [], - "source": [ - "trainer = SFTTrainer(\n", - " model=model,\n", - " train_dataset=train_dataset,\n", - " eval_dataset=eval_dataset,\n", - " peft_config=peft_config,\n", - " dataset_text_field=\"text\",\n", - " max_seq_length=1024,\n", - " tokenizer=tokenizer,\n", - " args=training_args,\n", - " packing=True,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "810eb75e", - "metadata": {}, - "source": [ - "## Federated Averaging Function" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "58298e8e-ab9e-4377-966e-143823441697", - "metadata": {}, - "outputs": [], - "source": [ - "def FedAvg(peft_params, model, weights=None):\n", - " \"\"\"\n", - " Perform Federated Averaging (FedAvg) on the model parameters.\n", - " \"\"\"\n", - " state_dicts = peft_params\n", - " state_dict = get_peft_model_state_dict(model)\n", - " for key in peft_params[0]:\n", - " dtype = state_dicts[0][key].dtype\n", - " state_dict[key] = torch.from_numpy(\n", - " np.average(\n", - " [state[key].to(torch.float).numpy() for state in state_dicts], \n", - " axis=0, \n", - " weights=weights\n", - " )\n", - " ).to(dtype)\n", - " set_peft_model_state_dict(model, state_dict)\n", - " return model" - ] - }, - { - "cell_type": "markdown", - "id": "e120a656-f4a5-47a5-a3d4-62c5f3672bba", - "metadata": {}, - "source": [ - "## Federated Learning Workflow" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e5e108c6-5150-4931-9c01-6b64a913fa04", - "metadata": {}, - "outputs": [], - "source": [ - "class FederatedFlow(FLSpec):\n", - " def __init__(self, model=None, rounds=3, **kwargs):\n", - " super().__init__(**kwargs)\n", - " if model is not None:\n", - " self.model = model\n", - " self.peft_params = get_peft_model_state_dict(self.model)\n", - " else:\n", - " raise ValueError(\"No model provided\")\n", - " \n", - " self.rounds = rounds\n", - " \n", - " @aggregator\n", - " def start(self):\n", - " print(\"Initializing federated learning\")\n", - " self.collaborators = self.runtime.collaborators\n", - " self.current_round = 0\n", - " self.next(self.aggregated_model_validation, foreach=\"collaborators\")\n", - " \n", - " @collaborator\n", - " def aggregated_model_validation(self):\n", - " print(f\"Validating aggregated model for {self.input}\")\n", - " # Load model with quantization\n", - " self.model = AutoModelForCausalLM.from_pretrained(\n", - " model_name,\n", - " quantization_config=bnb_config,\n", - " device_map=\"auto\",\n", - " trust_remote_code=True\n", - " )\n", - " self.model = prepare_model_for_kbit_training(self.model)\n", - " self.model = get_peft_model(self.model, peft_config)\n", - " set_peft_model_state_dict(self.model, self.peft_params)\n", - " \n", - " # Evaluate\n", - " eval_results = trainer.evaluate()\n", - " self.agg_validation_score = eval_results[\"eval_loss\"]\n", - " print(f\"Validation loss: {self.agg_validation_score}\")\n", - " self.next(self.train)\n", - " \n", - " @collaborator\n", - " def train(self):\n", - " print(f\"Training on {self.input}\")\n", - " # Train with local data\n", - " trainer.train()\n", - " self.loss = trainer.state.log_history[-1][\"loss\"]\n", - " self.next(self.local_model_validation)\n", - " \n", - " @collaborator\n", - " def local_model_validation(self):\n", - " print(f\"Validating local model for {self.input}\")\n", - " eval_results = trainer.evaluate()\n", - " self.local_validation_score = eval_results[\"eval_loss\"]\n", - " self.peft_params = get_peft_model_state_dict(self.model)\n", - " self.next(self.join, exclude=[\"model\"])\n", - " \n", - " @aggregator\n", - " def join(self, inputs):\n", - " self.average_loss = sum(input.loss for input in inputs) / len(inputs)\n", - " self.aggregated_model_accuracy = sum(\n", - " input.agg_validation_score for input in inputs\n", - " ) / len(inputs)\n", - " self.local_model_accuracy = sum(\n", - " input.local_validation_score for input in inputs\n", - " ) / len(inputs)\n", - " \n", - " print(f\"Round {self.current_round + 1} results:\")\n", - " print(f\"Average training loss: {self.average_loss}\")\n", - " print(f\"Average validation loss (before training): {self.aggregated_model_accuracy}\")\n", - " print(f\"Average validation loss (after training): {self.local_model_accuracy}\")\n", - " \n", - " # Federated averaging\n", - " self.model = FedAvg([input.peft_params for input in inputs], self.model)\n", - " self.peft_params = get_peft_model_state_dict(self.model)\n", - " \n", - " self.current_round += 1\n", - " if self.current_round < self.rounds:\n", - " self.next(self.aggregated_model_validation, foreach=\"collaborators\")\n", - " else:\n", - " self.next(self.end)\n", - " \n", - " @aggregator\n", - " def end(self):\n", - " print(\"Federated training complete!\")\n", - " print(f\"Final model validation loss: {self.aggregated_model_accuracy}\")" - ] - }, - { - "cell_type": "markdown", - "id": "7bc8fe27", - "metadata": {}, - "source": [ - "## Run Federated Learning" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "38894111-41d9-4dd4-b1c8-eb7ec3cdd3e1", - "metadata": {}, - "outputs": [], - "source": [ - "# Setup participants\n", - "aggregator = Aggregator()\n", - "collaborators = [\n", - " Collaborator(name=\"Portland\"),\n", - " Collaborator(name=\"Seattle\"),\n", - " Collaborator(name=\"London\")\n", - "]\n", - "\n", - "# Assign data shards\n", - "for idx, colab in enumerate(collaborators):\n", - " colab.private_attributes = {\n", - " \"train_dataset\": train_dataset.shard(len(collaborators), idx),\n", - " \"eval_dataset\": eval_dataset.shard(len(collaborators), idx)\n", - " }\n", - "\n", - "# Create and run workflow\n", - "runtime = LocalRuntime(aggregator=aggregator, collaborators=collaborators)\n", - "flflow = FederatedFlow(model, rounds=3)\n", - "flflow.runtime = runtime\n", - "flflow.run()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 5321986b45a7ab381a8e9851725360203bc49dc0 Mon Sep 17 00:00:00 2001 From: Rajith Date: Fri, 16 May 2025 11:12:37 +0530 Subject: [PATCH 28/34] reverting local changes --- .github/workflows/trivy.yml | 243 +++++++++++++----------------------- CODEOWNERS | 2 +- 2 files changed, 85 insertions(+), 160 deletions(-) diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index 7c9b79761a..62b196f3d1 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -1,4 +1,4 @@ -name: Trivy Nightly Security Scan +name: Trivy Nightly Scan on: workflow_call: inputs: @@ -7,192 +7,117 @@ on: type: string workflow_dispatch: schedule: - - cron: '0 0 * * *' # Runs daily at midnight UTC + - cron: '0 0 * * *' # This runs the workflow every night at midnight UTC jobs: - security-scan: + build: if: github.event.pull_request.draft == false permissions: - contents: read - security-events: write - actions: read - packages: read - issues: write + contents: read # for actions/checkout to fetch code + security-events: write # for github/codeql-action/upload-sarif to upload SARIF results + actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status runs-on: ubuntu-22.04 - timeout-minutes: 45 + timeout-minutes: 15 + env: - TRIVY_VERSION: 0.50.1 + TRIVY_DB_REPOSITORY: 'ghcr.io/aquasecurity/trivy-db,public.ecr.aws/aquasecurity/trivy-db' COMMIT_ID: ${{ inputs.commit_id || github.sha }} steps: - # ============ SETUP PHASE ============ - - name: Checkout repository + - name: Checkout code uses: actions/checkout@v4 with: ref: ${{ env.COMMIT_ID }} - fetch-depth: 0 - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.10' + - name: Install Trivy + run: | + curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sudo sh -s -- -b /usr/local/bin - # ============ SCANNING PHASE ============ - - name: Run filesystem scan - uses: aquasecurity/trivy-action@0.30.0 + - name: Run Trivy code vulnerability scanner (JSON Output) + run: | + trivy --quiet fs \ + --format json \ + --output trivy-code-results.json \ + --ignore-unfixed \ + --vuln-type os,library \ + --severity CRITICAL,HIGH,MEDIUM \ + . + + - name: Display Trivy code Scan Results + if: failure() # Ensure this step runs regardless of the previous step's outcome + run: | + echo "Trivy Scan Results:" + cat trivy-code-results.json | jq '.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[] | {VulnerabilityID, PkgName, InstalledVersion, Severity, Description}' + + - name: Upload Code Vulnerability Scan Results + uses: actions/upload-artifact@v4 with: - scan-type: 'fs' - format: 'json' - output: 'trivy-fs-report.json' - severity: 'CRITICAL,HIGH' - ignore-unfixed: true - vuln-type: 'os,library' - security-checks: 'vuln' + name: trivy-code-report-json + path: trivy-code-results.json - - name: Build Docker image + - name: Build an image from Dockerfile run: | - docker buildx build \ - --pull \ - --tag local/scan-target:${{ github.run_id }} \ - --file openfl-docker/Dockerfile.base \ - --load \ - . + docker build --pull -t docker.io/securefederatedai/openfl:${{ github.sha }} -f openfl-docker/Dockerfile.base . - - name: Scan Docker image + - name: Run Trivy vulnerability scanner for Docker image (JSON Output) + id: trivy-scan uses: aquasecurity/trivy-action@0.30.0 with: - image-ref: 'local/scan-target:${{ github.run_id }}' + image-ref: 'docker.io/securefederatedai/openfl:${{ github.sha }}' format: 'json' - output: 'trivy-image-report.json' - severity: 'CRITICAL,HIGH' + output: 'trivy-docker-results.json' + exit-code: '1' ignore-unfixed: true vuln-type: 'os,library' - security-checks: 'vuln' - - # ============ REPORTING PHASE ============ - - name: Generate SBOM reports - run: | - trivy fs --format spdx-json --output trivy-fs-sbom.json . - trivy image --format spdx-json --output trivy-image-sbom.json local/scan-target:${{ github.run_id }} + severity: 'CRITICAL,HIGH,MEDIUM' + trivyignores: '.trivyignore' - - name: Create consolidated report - id: report + - name: Display Trivy Docker Scan Results + if: failure() # Ensure this step runs regardless of the previous step's outcome run: | - # Initialize markdown report - echo "# Security Scan Report - OpenFL" > report.md - echo "**Scan Date:** $(date -u '+%Y-%m-%d %H:%M:%S UTC')" >> report.md - echo "**Commit:** [${{ env.COMMIT_ID }}](https://github.com/rajithkrishnegowda/openfl/commit/${{ env.COMMIT_ID }})" >> report.md - echo -e "\n## Vulnerability Summary\n" >> report.md - - # Process filesystem results - if [ -f "trivy-fs-report.json" ]; then - FS_VULNS=$(jq '[.Results[]?.Vulnerabilities[]?] | length' trivy-fs-report.json || echo 0) - echo "### Filesystem Scans" >> report.md - echo "**Critical/High Vulnerabilities:** $FS_VULNS" >> report.md - - if [ "$FS_VULNS" -gt 0 ]; then - echo -e "\n| Severity | ID | Package | Version | Description |" >> report.md - echo "|----------|----|---------|---------|-------------|" >> report.md - jq -r '.Results[]?.Vulnerabilities[]? | "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-fs-report.json >> report.md - echo "has_vulnerabilities=true" >> $GITHUB_OUTPUT - fi - fi - - # Process image results - if [ -f "trivy-image-report.json" ]; then - IMG_VULNS=$(jq '[.Results[]?.Vulnerabilities[]?] | length' trivy-image-report.json || echo 0) - echo -e "\n### Container Image Scans" >> report.md - echo "**Critical/High Vulnerabilities:** $IMG_VULNS" >> report.md - - if [ "$IMG_VULNS" -gt 0 ]; then - echo -e "\n| Severity | ID | Package | Version | Description |" >> report.md - echo "|----------|----|---------|---------|-------------|" >> report.md - jq -r '.Results[]?.Vulnerabilities[]? | "| \(.Severity) | \(.VulnerabilityID) | \(.PkgName) | \(.InstalledVersion) | \(.Title) |"' trivy-image-report.json >> report.md - echo "has_vulnerabilities=true" >> $GITHUB_OUTPUT - fi - fi - - # Add artifact download links - echo -e "\n## Next Steps\n" >> report.md - echo "1. Review the full reports in the workflow artifacts" >> report.md - echo "2. Address critical vulnerabilities immediately" >> report.md - echo "3. Create GitHub issues for tracking remediation" >> report.md - - cat report.md - - # ============ NOTIFICATION PHASE ============ - - name: Set notification subject - id: set-subject - run: | - if [[ "${{ job.status }}" == "failure" ]]; then - echo "subject=🚨 OpenFL Security Scan Failed" >> $GITHUB_OUTPUT - elif [[ "${{ steps.report.outputs.has_vulnerabilities }}" == "true" ]]; then - echo "subject=⚠️ OpenFL Vulnerabilities Found" >> $GITHUB_OUTPUT + if [ -s trivy-docker-results.json ]; then + echo "Trivy Scan Results:" + cat trivy-docker-results.json | jq '.Results[] | select(.Vulnerabilities != null) | .Vulnerabilities[] | {VulnerabilityID, PkgName, InstalledVersion, Severity, Description}' else - echo "subject=✅ OpenFL Security Scan Passed" >> $GITHUB_OUTPUT + echo "Trivy scan results file is empty or not found." fi - - - name: Extract CODEOWNERS emails - id: codeowners - run: | - if ! command -v python &> /dev/null; then - sudo apt-get update && sudo apt-get install -y python3 - fi - - OUTPUT=$(python .github/scripts/extract_emails.py) - echo "Extracted emails: $OUTPUT" - - EMAILS=$(echo "$OUTPUT" | jq -r '.emails | join(",")') - echo "emails=${EMAILS:-${{ secrets.SECURITY_EMAIL_RECIPIENTS }}}" >> $GITHUB_OUTPUT - - env: - PYTHONIOENCODING: utf-8 - - - name: Prepare email content - id: prepare-email - run: | - # Convert markdown to HTML - python -m pip install markdown - HTML_CONTENT=$(python -c "import markdown; print(markdown.markdown(open('report.md').read()))") - echo "html_body<> $GITHUB_OUTPUT - echo "$HTML_CONTENT" >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT - - - name: Send email via Python script - if: always() && (steps.report.outputs.has_vulnerabilities == 'true' || failure()) - env: - SMTP_SERVER: ${{ secrets.SMTP_SERVER }} - SMTP_PORT: ${{ secrets.SMTP_PORT }} - SMTP_USER: ${{ secrets.SMTP_USER }} - SMTP_PASSWORD: ${{ secrets.SMTP_PASSWORD }} - RECIPIENTS: ${{ steps.codeowners.outputs.emails }} - run: | - python .github/scripts/send_email.py \ - --sender "security@openfl.github" \ - --to "$RECIPIENTS" \ - --subject "${{ steps.set-subject.outputs.subject }}" \ - --body "${{ steps.prepare-email.outputs.html_body }}" \ - --smtp-user "$SMTP_USER" \ - --smtp-pwd "$SMTP_PASSWORD" \ - --smtp-server "$SMTP_SERVER:$SMTP_PORT" \ - --html-body - - # ============ ARTIFACT UPLOADS ============ - - name: Upload scan artifacts + + - name: Upload final Trivy Docker Vulnerability Scan uses: actions/upload-artifact@v4 with: - name: security-reports-${{ github.run_id }} - path: | - trivy-fs-report.json - trivy-image-report.json - trivy-fs-sbom.json - trivy-image-sbom.json - report.md - retention-days: 30 + name: trivy-docker-report-json + path: trivy-docker-results.json - # ============ FAILURE HANDLING ============ - - name: Fail workflow if vulnerabilities found - if: steps.report.outputs.has_vulnerabilities == 'true' && github.event_name != 'schedule' + - name: Run Trivy code vulnerability scanner (SPDX-JSON Output) run: | - echo "::error::Critical/High vulnerabilities detected!" - exit 1 + trivy --quiet fs \ + --format spdx-json \ + --output trivy-code-spdx-results.json \ + --ignore-unfixed \ + --vuln-type os,library \ + --severity CRITICAL,HIGH,MEDIUM \ + . + + - name: Upload SPDX Code Vulnerability Scan Results + uses: actions/upload-artifact@v4 + with: + name: trivy-code-spdx-report-json + path: trivy-code-spdx-results.json + + - name: Run Trivy vulnerability scanner for Docker image (SPDX-JSON Output) + uses: aquasecurity/trivy-action@0.30.0 + with: + image-ref: 'docker.io/securefederatedai/openfl:${{ github.sha }}' + format: 'spdx-json' + output: 'trivy-docker-spdx-results.json' + exit-code: '1' + ignore-unfixed: true + vuln-type: 'os,library' + severity: 'CRITICAL,HIGH,MEDIUM' + trivyignores: '.trivyignore' + + - name: Upload SPDX Docker Vulnerability Scan + uses: actions/upload-artifact@v4 + with: + name: trivy-docker-spdx-report-json + path: trivy-docker-spdx-results.json diff --git a/CODEOWNERS b/CODEOWNERS index b36cb38d58..cb0b89fc6b 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -30,6 +30,6 @@ /scripts/ aayush.garg@intel.com giribabu.bikki@intel.com karan.shah@intel.com patrick.foley@intel.com srikanth.enugula@intel.com teodor.parvanov@intel.com # File level ownership -CODEOWNERS akshay.pant@intel.com karan.shah@intel.com kevin.ta@intel.com noopur@intel.com patrick.foley@intel.com payal.chaurasiya@intel.com rahul.garg@intel.com rajith.krishnegowda@intel.com shailesh.pant@intel.com shailesh.tanwar@intel.com teodor.parvanov@intel.com +CODEOWNERS aayush.garg@intel.com giribabu.bikki@intel.com patrick.foley@intel.com preethi.asokan@intel.com rahul.garg@intel.com srikanth.enugula@intel.com teodor.parvanov@intel.com test-requirements.txt akshay.pant@intel.com karan.shah@intel.com kevin.ta@intel.com noopur@intel.com patrick.foley@intel.com payal.chaurasiya@intel.com rahul.garg@intel.com rajith.krishnegowda@intel.com shailesh.pant@intel.com shailesh.tanwar@intel.com teodor.parvanov@intel.com From ce8dbb916fa8c63e4b1385007d0d3bc599a36b74 Mon Sep 17 00:00:00 2001 From: Rajith Date: Fri, 16 May 2025 15:44:15 +0530 Subject: [PATCH 29/34] added 4bit and 8bit --- .../workflow/LLM/phi-4-withquantization.ipynb | 4167 +++++++++++++++++ 1 file changed, 4167 insertions(+) create mode 100644 openfl-tutorials/experimental/workflow/LLM/phi-4-withquantization.ipynb diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-withquantization.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-withquantization.ipynb new file mode 100644 index 0000000000..8a33373f91 --- /dev/null +++ b/openfl-tutorials/experimental/workflow/LLM/phi-4-withquantization.ipynb @@ -0,0 +1,4167 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a59f475d-d843-46bc-b75e-10984b687ed3", + "metadata": {}, + "source": [ + "# Enhanced Federated Fine-Tuning of Phi-4 Using OpenFL with PEFT & Quantization" + ] + }, + { + "cell_type": "markdown", + "id": "20c74cb9-51a2-42e2-893f-d280e227e8bf", + "metadata": {}, + "source": [ + "In this tutorial, we demonstrate how to fine-tune Microsoft's Phi-4 model in a federated learning workflow with enhanced local training using:\n", + "- Parameter-Efficient Fine-Tuning (PEFT)\n", + "- 4-bit Quantization (QLoRA)\n", + "- Gradient Checkpointing\n", + "- Optimized Training Configuration" + ] + }, + { + "cell_type": "markdown", + "id": "d07c32d3-1a8d-4162-af45-bc3a10e0ae3f", + "metadata": {}, + "source": [ + "## Installation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "05b2ad75-8c7b-499c-902e-dbd5b24361bc", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install torch transformers peft datasets trl==0.12.2 bitsandbytes accelerate -q" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a7ae1a7e-8c16-4c5a-be57-33d84723aed7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fri May 16 07:23:10 2025 \n", + "+-----------------------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 550.144.03 Driver Version: 550.144.03 CUDA Version: 12.4 |\n", + "|-----------------------------------------+------------------------+----------------------+\n", + "| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|=========================================+========================+======================|\n", + "| 0 NVIDIA H100 NVL Off | 00000001:00:00.0 Off | 0 |\n", + "| N/A 41C P0 66W / 400W | 1MiB / 95830MiB | 0% Default |\n", + "| | | Disabled |\n", + "+-----------------------------------------+------------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=========================================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "id": "440a9c39-ec42-45a5-80f6-9a9e0bc90d2f", + "metadata": {}, + "source": [ + "## Import Libraries" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "be4690ae-0671-4d3a-8f21-620ab865a03e", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/azureuser/env_name/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "2025-05-16 07:23:13,756\tINFO util.py:154 -- Missing packages: ['ipywidgets']. Run `pip install -U ipywidgets`, then restart the notebook server for rich notebook output.\n" + ] + } + ], + "source": [ + "import os\n", + "import torch\n", + "from transformers import (\n", + " AutoModelForCausalLM,\n", + " AutoTokenizer,\n", + " BitsAndBytesConfig,\n", + " TrainingArguments\n", + ")\n", + "from peft import (\n", + " LoraConfig,\n", + " get_peft_model,\n", + " prepare_model_for_kbit_training,\n", + " PeftModel\n", + ")\n", + "from peft.utils import get_peft_model_state_dict, set_peft_model_state_dict # Added this import\n", + "from datasets import load_dataset\n", + "from trl import SFTTrainer\n", + "from openfl.experimental.workflow.interface import Aggregator, Collaborator, FLSpec\n", + "from openfl.experimental.workflow.placement import aggregator, collaborator\n", + "from openfl.experimental.workflow.runtime import LocalRuntime\n", + "import numpy as np\n", + "from transformers.trainer_callback import PrinterCallback\n", + "import transformers\n", + "import gc\n", + "import psutil" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "74fed8f2", + "metadata": {}, + "outputs": [], + "source": [ + "# Memory optimization setup\n", + "os.environ[\"PYTORCH_CUDA_ALLOC_CONF\"] = \"expandable_segments:True\" # Enable dynamic memory allocation\n", + "os.environ[\"TRANSFORMERS_ATTN_IMPLEMENTATION\"] = \"flash_attention_2\" # Use optimized attention\n", + "\n", + "def clear_gpu():\n", + " torch.cuda.empty_cache()\n", + " gc.collect()\n", + "\n", + "clear_gpu()" + ] + }, + { + "cell_type": "markdown", + "id": "813b4917", + "metadata": {}, + "source": [ + "## Acquiring and preprocessing dataset\n", + "\n", + "We can download the dataset directly from the [LLM-Adapters repository](https://github.com/AGI-Edgerunners/LLM-Adapters)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6df7bfb4", + "metadata": {}, + "outputs": [], + "source": [ + "# Import libraries needed for downloading and verifying the dataset\n", + "import hashlib\n", + "import requests\n", + "\n", + "def file_checksum(file_path, algorithm=\"sha256\"):\n", + " \"\"\"\n", + " Calculate the checksum of a file using the specified hashing algorithm.\n", + " \n", + " Args:\n", + " file_path (str): The path to the file for which the checksum is to be calculated.\n", + " algorithm (str): The hashing algorithm to use (default is 'sha256').\n", + " \n", + " Returns:\n", + " str: The calculated checksum of the file.\n", + " \"\"\"\n", + " hash_func = hashlib.new(algorithm)\n", + " with open(file_path, \"rb\") as f:\n", + " for chunk in iter(lambda: f.read(4096), b\"\"):\n", + " hash_func.update(chunk)\n", + " return hash_func.hexdigest()\n", + "\n", + "\n", + "# Download the dataset if it doesn't exist locally\n", + "if not os.path.exists(\"math_10k.json\"):\n", + " print(\"Downloading math_10k.json dataset...\")\n", + " r = requests.get(\n", + " \"https://raw.githubusercontent.com/AGI-Edgerunners/LLM-Adapters/main/ft-training_set/math_10k.json\",\n", + " )\n", + " with open(\n", + " \"math_10k.json\",\n", + " \"wb\",\n", + " ) as f:\n", + " f.write(r.content)\n", + " print(\"Download complete.\")\n", + "\n", + " # Verify the integrity of the downloaded file\n", + " actual_checksum = file_checksum(\"math_10k.json\")\n", + " expected_checksum = \"0342d0d860ad8592b579329337c90e42eefd3d9f2898043140cbd120630418b8\"\n", + " if actual_checksum != expected_checksum:\n", + " raise ValueError(\n", + " \"Checksum verification failed. The file may have been altered.\"\n", + " )\n", + " print(\"Checksum verification successful.\")\n", + "else:\n", + " print(\"Dataset already exists locally.\")\n", + "\n", + "# Set the dataset path to be used later\n", + "dataset_name = \"math_10k.json\"" + ] + }, + { + "cell_type": "markdown", + "id": "08576aa0-f628-4ae6-8fc3-dd167d164784", + "metadata": {}, + "source": [ + "## Configuration" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eada9809-468a-47c6-9b03-55aa887c9487", + "metadata": {}, + "outputs": [], + "source": [ + "# Model and dataset\n", + "model_name = \"microsoft/phi-4\"\n", + "#dataset_name = \"math_10k.json\"\n", + "\n", + "# 4-bit QLoRA configuration\n", + "bnb_config_4bit = BitsAndBytesConfig(\n", + " load_in_4bit=True,\n", + " bnb_4bit_quant_type=\"nf4\",\n", + " bnb_4bit_compute_dtype=torch.bfloat16,\n", + " bnb_4bit_use_double_quant=False,\n", + ")\n", + "\n", + "# 8-bit QLoRA configuration\n", + "bnb_config_8bit = BitsAndBytesConfig(\n", + " load_in_8bit=True,\n", + " llm_int8_enable_fp32_cpu_offload=True,\n", + " llm_int8_skip_modules=['lm_head'],\n", + " llm_int8_threshold=6.0,\n", + " llm_int8_has_fp16_weight=False,\n", + ")\n", + "\n", + "# Active quantization config (will be set to either 4-bit or 8-bit)\n", + "bnb_config = bnb_config_4bit # Default to 4-bit\n", + "\n", + "# LoRA configuration\n", + "peft_config = LoraConfig(\n", + " r=8, # Increased from original for better adaptation\n", + " lora_alpha=16,\n", + " lora_dropout=0.01,\n", + " bias=\"none\",\n", + " task_type=\"CAUSAL_LM\",\n", + " target_modules=\"all-linear\",\n", + ")\n", + "\n", + "# Training configuration\n", + "training_args = TrainingArguments(\n", + " output_dir=\"./results\",\n", + " num_train_epochs=1,\n", + " per_device_train_batch_size=2, # Reduced for Phi-4\n", + " gradient_accumulation_steps=2,\n", + " optim=\"adamw_torch_fused\",\n", + " save_steps=100,\n", + " logging_steps=10,\n", + " learning_rate=3e-4,\n", + " weight_decay=0.001,\n", + " fp16=False,\n", + " bf16=True,\n", + " max_grad_norm=0.5,\n", + " warmup_ratio=0.02,\n", + " lr_scheduler_type=\"cosine\",\n", + " gradient_checkpointing=True,\n", + " report_to=\"none\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ffe93234-2a1a-4809-a431-efe2f35ce496", + "metadata": {}, + "source": [ + "## Load and Prepare Model" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "8ab371f1-64c3-4225-82e7-fb3c5b05578c", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|██████████| 6/6 [00:04<00:00, 1.33it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "trainable params: 27,852,800 || all params: 14,687,360,000 || trainable%: 0.1896\n" + ] + } + ], + "source": [ + "# Load tokenizer\n", + "tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)\n", + "tokenizer.pad_token = tokenizer.eos_token\n", + "tokenizer.padding_side = \"right\"\n", + "\n", + "# Load model with quantization\n", + "model = AutoModelForCausalLM.from_pretrained(\n", + " model_name,\n", + " quantization_config=bnb_config,\n", + " device_map=\"auto\",\n", + " trust_remote_code=True\n", + ")\n", + "\n", + "# Prepare model for k-bit training\n", + "model = prepare_model_for_kbit_training(model, use_gradient_checkpointing=True)\n", + "\n", + "# Apply LoRA\n", + "model = get_peft_model(model, peft_config)\n", + "model.print_trainable_parameters()" + ] + }, + { + "cell_type": "markdown", + "id": "dd058fff-f6dd-4cc6-acaf-7e2fa2c1132d", + "metadata": {}, + "source": [ + "## Load and Prepare Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4392ddab-10b7-41f6-a8e0-65ba298ea457", + "metadata": {}, + "outputs": [], + "source": [ + "def format_prompt(example):\n", + " \"\"\"\n", + " Format the input example into a standardized prompt structure for training.\n", + " \n", + " This function creates a consistent instruction-response format for the LLM training:\n", + " - Includes instruction, optional input, and expected output\n", + " - Using a standardized template inspired by instruction-tuning datasets\n", + " \n", + " Parameters:\n", + " example (dict): Dictionary containing 'instruction', 'input' (optional), and 'output' fields\n", + " \n", + " Returns:\n", + " str: Formatted prompt with consistent structure for model training and evaluation\n", + " \"\"\"\n", + " # Handle case where input is provided\n", + " if example[\"input\"]:\n", + " # Format with both instruction and input fields\n", + " return f\"\"\"Below is an instruction that describes a task. Write a response that appropriately completes the request.\n", + "\n", + "### Instruction:\n", + "{example['instruction']}\n", + "\n", + "### Input:\n", + "{example['input']}\n", + "\n", + "### Response:\n", + "{example['output']}\"\"\"\n", + " else:\n", + " # Format with only instruction (no input field)\n", + " return f\"\"\"Below is an instruction that describes a task. Write a response that appropriately completes the request.\n", + "\n", + "### Instruction:\n", + "{example['instruction']}\n", + "\n", + "### Response:\n", + "{example['output']}\"\"\"\n", + "\n", + "# Load dataset\n", + "dataset = load_dataset(\"json\", data_files=dataset_name, split=\"train\", num_proc=4)\n", + "# Apply formatting to each example in the dataset\n", + "dataset = dataset.map(lambda x: {\"text\": format_prompt(x)}, num_proc=4)\n", + "\n", + "# Split dataset into training and evaluation subsets\n", + "dataset = dataset.train_test_split(test_size=0.1)\n", + "train_dataset = dataset[\"train\"]\n", + "eval_dataset = dataset[\"test\"]" + ] + }, + { + "cell_type": "markdown", + "id": "812cfcc8-33ec-4a2b-8a74-27bfc2a41d7b", + "metadata": {}, + "source": [ + "## Enhanced Training with SFTTrainer" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "6dc85c57-68b2-4514-9373-43e3d7c05c10", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': dataset_text_field, max_seq_length, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "Generating train split: 1832 examples [00:02, 615.45 examples/s]\n", + "Generating train split: 197 examples [00:00, 575.95 examples/s]\n" + ] + } + ], + "source": [ + "trainer = SFTTrainer(\n", + " model=model,\n", + " train_dataset=train_dataset,\n", + " eval_dataset=eval_dataset,\n", + " peft_config=peft_config,\n", + " dataset_text_field=\"text\",\n", + " max_seq_length=1024,\n", + " tokenizer=tokenizer,\n", + " args=training_args,\n", + " packing=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "810eb75e", + "metadata": {}, + "source": [ + "## Federated Averaging Function" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "58298e8e-ab9e-4377-966e-143823441697", + "metadata": {}, + "outputs": [], + "source": [ + "def FedAvg(peft_params, model, weights=None):\n", + " \"\"\"\n", + " Perform Federated Averaging (FedAvg) on the model parameters.\n", + "\n", + " Parameters:\n", + " peft_params (list): A list of state dictionaries containing the model parameters from different clients.\n", + " model (torch.nn.Module): The model to which the averaged parameters will be applied.\n", + " weights (list, optional): A list of weights for averaging the parameters. If None, equal weights are used.\n", + "\n", + " Returns:\n", + " torch.nn.Module: The model with the averaged parameters applied.\n", + " \"\"\"\n", + " state_dicts = peft_params\n", + " state_dict = get_peft_model_state_dict(model)\n", + " for key in peft_params[0]:\n", + " dtype = state_dicts[0][key].dtype\n", + " state_dict[key] = torch.from_numpy(\n", + " np.average(\n", + " [state[key].cpu().to(torch.float).numpy() for state in state_dicts], axis=0, weights=weights\n", + " )\n", + " ).to(dtype)\n", + " set_peft_model_state_dict(model, state_dict)\n", + " return model" + ] + }, + { + "cell_type": "markdown", + "id": "e120a656-f4a5-47a5-a3d4-62c5f3672bba", + "metadata": {}, + "source": [ + "## Federated Learning Workflow" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5e108c6-5150-4931-9c01-6b64a913fa04", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Aggregator step \"start\" registered\n", + "Collaborator step \"aggregated_model_validation\" registered\n", + "Collaborator step \"train\" registered\n", + "Collaborator step \"local_model_validation\" registered\n", + "Aggregator step \"join\" registered\n", + "Aggregator step \"end\" registered\n" + ] + } + ], + "source": [ + "# Import the required PrinterCallback for proper initialization/removal\n", + "from transformers.trainer_callback import PrinterCallback\n", + "import transformers\n", + "import gc\n", + "import psutil\n", + "\n", + "def get_gpu_memory_info():\n", + " \"\"\"Get detailed GPU memory usage information in megabytes.\n", + " \n", + " This function checks for CUDA availability and returns a dictionary with memory allocation\n", + " information including allocated, reserved, and maximum allocated GPU memory.\n", + " \n", + " Returns:\n", + " dict: Dictionary with memory usage information in MB:\n", + " - allocated: Currently allocated memory by PyTorch tensors\n", + " - reserved: Total memory reserved by PyTorch\n", + " - max_allocated: Maximum allocated memory since last reset\n", + " \n", + " Note:\n", + " Returns zeros for all metrics if CUDA is not available or if an error occurs.\n", + " \"\"\"\n", + " try:\n", + " if torch.cuda.is_available():\n", + " allocated = torch.cuda.memory_allocated() / (1024 * 1024)\n", + " reserved = torch.cuda.memory_reserved() / (1024 * 1024)\n", + " max_allocated = torch.cuda.max_memory_allocated() / (1024 * 1024)\n", + " return {\n", + " \"allocated\": allocated,\n", + " \"reserved\": reserved,\n", + " \"max_allocated\": max_allocated\n", + " }\n", + " else:\n", + " return {\"allocated\": 0, \"reserved\": 0, \"max_allocated\": 0}\n", + " except:\n", + " return {\"allocated\": 0, \"reserved\": 0, \"max_allocated\": 0}\n", + "\n", + "class MemoryTracker:\n", + " \"\"\"Track GPU memory usage during training\"\"\"\n", + " def __init__(self, collaborator_name, quant_type):\n", + " self.collaborator_name = collaborator_name\n", + " self.quant_type = quant_type\n", + " self.timestamps = {}\n", + " self.peak = {\"allocated\": 0, \"reserved\": 0, \"max_allocated\": 0}\n", + " self.training_loss = None\n", + " self.eval_loss = None\n", + " \n", + " def log(self, timestamp):\n", + " \"\"\"Log current memory usage at a specific timestamp\"\"\"\n", + " self.timestamps[timestamp] = get_gpu_memory_info()\n", + " \n", + " def log_loss(self, training_loss=None, eval_loss=None):\n", + " \"\"\"Log training or evaluation loss\"\"\"\n", + " if training_loss is not None:\n", + " self.training_loss = training_loss\n", + " if eval_loss is not None:\n", + " self.eval_loss = eval_loss\n", + " \n", + " def update_peak(self):\n", + " \"\"\"Update peak memory usage values\"\"\"\n", + " current = get_gpu_memory_info()\n", + " self.peak[\"allocated\"] = max(self.peak[\"allocated\"], current[\"allocated\"])\n", + " self.peak[\"reserved\"] = max(self.peak[\"reserved\"], current[\"reserved\"])\n", + " self.peak[\"max_allocated\"] = max(self.peak[\"max_allocated\"], current[\"max_allocated\"])\n", + " \n", + " def reset_peak(self):\n", + " \"\"\"Reset peak memory usage values\"\"\"\n", + " self.peak = {\"allocated\": 0, \"reserved\": 0, \"max_allocated\": 0}\n", + " \n", + " def report(self):\n", + " \"\"\"Print memory usage report\"\"\"\n", + " print(f\"\\n==== Memory Usage Report for {self.collaborator_name} ({self.quant_type}) ====\")\n", + " print(f\"Peak Memory Usage:\")\n", + " print(f\" Allocated: {self.peak['allocated']:.2f} MB\")\n", + " print(f\" Reserved: {self.peak['reserved']:.2f} MB\")\n", + " print(f\" Max Allocated: {self.peak['max_allocated']:.2f} MB\")\n", + " \n", + " print(\"\\nMemory Usage by Stage:\")\n", + " for timestamp, mem in self.timestamps.items():\n", + " print(f\" {timestamp}:\")\n", + " print(f\" Allocated: {mem['allocated']:.2f} MB\")\n", + " print(f\" Reserved: {mem['reserved']:.2f} MB\")\n", + " print(f\" Max Allocated: {mem['max_allocated']:.2f} MB\")\n", + " \n", + " print(\"\\nPerformance Metrics:\")\n", + " if self.training_loss is not None:\n", + " print(f\" Training Loss: {self.training_loss:.4f}\")\n", + " if self.eval_loss is not None:\n", + " print(f\" Evaluation Loss: {self.eval_loss:.4f}\")\n", + " print(\"-\" * 50)\n", + " \n", + " def get_stats(self):\n", + " \"\"\"Get all statistics as a dictionary\"\"\"\n", + " stats = {\n", + " \"peak_allocated\": self.peak[\"allocated\"],\n", + " \"peak_reserved\": self.peak[\"reserved\"],\n", + " \"peak_max_allocated\": self.peak[\"max_allocated\"],\n", + " \"quant_type\": self.quant_type,\n", + " \"training_loss\": self.training_loss,\n", + " \"eval_loss\": self.eval_loss\n", + " }\n", + " for timestamp, mem in self.timestamps.items():\n", + " stats[f\"{timestamp}_allocated\"] = mem[\"allocated\"]\n", + " stats[f\"{timestamp}_reserved\"] = mem[\"reserved\"]\n", + " stats[f\"{timestamp}_max_allocated\"] = mem[\"max_allocated\"]\n", + " return stats\n", + "\n", + "def plot_memory_metrics(flow_4bit, flow_8bit):\n", + " \"\"\"Plot and compare memory metrics between 4-bit and 8-bit quantization.\"\"\"\n", + " try:\n", + " import matplotlib.pyplot as plt\n", + " import pandas as pd\n", + " from matplotlib.ticker import EngFormatter\n", + "\n", + " # Create figure with multiple subplots\n", + " fig, axs = plt.subplots(2, 2, figsize=(16, 12))\n", + " fig.suptitle('4-bit vs 8-bit Quantization Comparison', fontsize=16)\n", + " \n", + " # Colors for consistent plotting\n", + " colors_4bit = {'Portland': 'blue', 'Seattle': 'green'}\n", + " colors_8bit = {'Portland': 'darkblue', 'Seattle': 'darkgreen'}\n", + " markers_4bit = {'Portland': 'o', 'Seattle': 's'}\n", + " markers_8bit = {'Portland': '^', 'Seattle': 'D'}\n", + " \n", + " # Flatten the metric data for plotting\n", + " memory_data = []\n", + " for quant, flow in [(\"4-bit\", flow_4bit), (\"8-bit\", flow_8bit)]:\n", + " stats = flow.all_memory_stats\n", + " for collab, rounds_data in stats.items():\n", + " for round_name, metrics in rounds_data.items():\n", + " round_num = int(round_name.split('_')[1])\n", + " row = {\n", + " 'Collaborator': collab,\n", + " 'Round': round_num,\n", + " 'Quantization': quant,\n", + " 'Peak Memory (MB)': metrics.get('peak_max_allocated', 0),\n", + " 'Training Loss': metrics.get('training_loss', 0),\n", + " 'Eval Loss': metrics.get('eval_loss', 0)\n", + " }\n", + " memory_data.append(row)\n", + " \n", + " df = pd.DataFrame(memory_data)\n", + " \n", + " # Plot 1: Peak Memory Usage by Round\n", + " axs[0, 0].set_title('Peak Memory Usage by Round')\n", + " for quant_type in ['4-bit', '8-bit']:\n", + " for collab in df['Collaborator'].unique():\n", + " subset = df[(df['Quantization'] == quant_type) & (df['Collaborator'] == collab)]\n", + " color = colors_4bit[collab] if quant_type == '4-bit' else colors_8bit[collab]\n", + " marker = markers_4bit[collab] if quant_type == '4-bit' else markers_8bit[collab]\n", + " axs[0, 0].plot(subset['Round'], subset['Peak Memory (MB)'], \n", + " marker=marker, linestyle='-', label=f\"{collab} ({quant_type})\",\n", + " color=color)\n", + " \n", + " axs[0, 0].set_xlabel('Round')\n", + " axs[0, 0].set_ylabel('Memory (MB)')\n", + " axs[0, 0].legend()\n", + " axs[0, 0].grid(True, alpha=0.3)\n", + " axs[0, 0].yaxis.set_major_formatter(EngFormatter(unit='B'))\n", + " \n", + " # Plot 2: Training Loss by Round\n", + " axs[0, 1].set_title('Training Loss by Round')\n", + " for quant_type in ['4-bit', '8-bit']:\n", + " for collab in df['Collaborator'].unique():\n", + " subset = df[(df['Quantization'] == quant_type) & (df['Collaborator'] == collab)]\n", + " color = colors_4bit[collab] if quant_type == '4-bit' else colors_8bit[collab]\n", + " marker = markers_4bit[collab] if quant_type == '4-bit' else markers_8bit[collab]\n", + " axs[0, 1].plot(subset['Round'], subset['Training Loss'], \n", + " marker=marker, linestyle='-', label=f\"{collab} ({quant_type})\",\n", + " color=color)\n", + " \n", + " axs[0, 1].set_xlabel('Round')\n", + " axs[0, 1].set_ylabel('Loss')\n", + " axs[0, 1].legend()\n", + " axs[0, 1].grid(True, alpha=0.3)\n", + " \n", + " # Plot 3: Eval Loss by Round\n", + " axs[1, 0].set_title('Evaluation Loss by Round')\n", + " for quant_type in ['4-bit', '8-bit']:\n", + " for collab in df['Collaborator'].unique():\n", + " subset = df[(df['Quantization'] == quant_type) & (df['Collaborator'] == collab)]\n", + " color = colors_4bit[collab] if quant_type == '4-bit' else colors_8bit[collab]\n", + " marker = markers_4bit[collab] if quant_type == '4-bit' else markers_8bit[collab]\n", + " axs[1, 0].plot(subset['Round'], subset['Eval Loss'], \n", + " marker=marker, linestyle='-', label=f\"{collab} ({quant_type})\",\n", + " color=color)\n", + " \n", + " axs[1, 0].set_xlabel('Round')\n", + " axs[1, 0].set_ylabel('Loss')\n", + " axs[1, 0].legend()\n", + " axs[1, 0].grid(True, alpha=0.3)\n", + " \n", + " # Plot 4: Memory vs Loss (bubble chart)\n", + " axs[1, 1].set_title('Memory Usage vs. Evaluation Loss')\n", + " for quant_type in ['4-bit', '8-bit']:\n", + " for collab in df['Collaborator'].unique():\n", + " subset = df[(df['Quantization'] == quant_type) & (df['Collaborator'] == collab)]\n", + " color = colors_4bit[collab] if quant_type == '4-bit' else colors_8bit[collab]\n", + " marker = markers_4bit[collab] if quant_type == '4-bit' else markers_8bit[collab]\n", + " \n", + " # Size proportional to round number for visual differentiation\n", + " sizes = [100 * (r+1) for r in subset['Round']]\n", + " \n", + " axs[1, 1].scatter(subset['Peak Memory (MB)'], subset['Eval Loss'],\n", + " s=sizes, alpha=0.7, \n", + " label=f\"{collab} ({quant_type})\",\n", + " color=color, marker=marker)\n", + " \n", + " # Add round number annotations\n", + " for _, row in subset.iterrows():\n", + " axs[1, 1].annotate(f\"R{int(row['Round'])}\", \n", + " (row['Peak Memory (MB)'], row['Eval Loss']),\n", + " xytext=(5, 5), textcoords='offset points')\n", + " \n", + " axs[1, 1].set_xlabel('Peak Memory (MB)')\n", + " axs[1, 1].set_ylabel('Evaluation Loss')\n", + " axs[1, 1].legend()\n", + " axs[1, 1].grid(True, alpha=0.3)\n", + " axs[1, 1].xaxis.set_major_formatter(EngFormatter(unit='B'))\n", + " \n", + " plt.tight_layout()\n", + " plt.subplots_adjust(top=0.92)\n", + " plt.show()\n", + " \n", + " # Print summary comparison\n", + " print(\"\\n==== Performance Summary ====\\n\")\n", + " # Group by quantization and compute means\n", + " summary = df.groupby('Quantization').agg({\n", + " 'Peak Memory (MB)': 'mean',\n", + " 'Training Loss': 'mean', \n", + " 'Eval Loss': 'mean'\n", + " }).reset_index()\n", + " \n", + " # Calculate percentage difference\n", + " mem_diff_pct = ((summary.loc[1, 'Peak Memory (MB)'] - summary.loc[0, 'Peak Memory (MB)']) / \n", + " summary.loc[0, 'Peak Memory (MB)'] * 100)\n", + " \n", + " eval_diff_pct = ((summary.loc[1, 'Eval Loss'] - summary.loc[0, 'Eval Loss']) / \n", + " summary.loc[0, 'Eval Loss'] * 100)\n", + " \n", + " print(f\"Memory Usage Comparison:\")\n", + " print(f\" 4-bit Avg: {summary.loc[0, 'Peak Memory (MB)']:.2f} MB\")\n", + " print(f\" 8-bit Avg: {summary.loc[1, 'Peak Memory (MB)']:.2f} MB\")\n", + " print(f\" Difference: {abs(mem_diff_pct):.1f}% {'more' if mem_diff_pct > 0 else 'less'} memory with 8-bit\")\n", + " \n", + " print(f\"\\nEvaluation Loss Comparison:\")\n", + " print(f\" 4-bit Avg: {summary.loc[0, 'Eval Loss']:.4f}\")\n", + " print(f\" 8-bit Avg: {summary.loc[1, 'Eval Loss']:.4f}\")\n", + " print(f\" Difference: {abs(eval_diff_pct):.1f}% {'higher' if eval_diff_pct > 0 else 'lower'} loss with 8-bit\")\n", + " \n", + " loss_efficiency = ((summary.loc[0, 'Eval Loss'] - summary.loc[1, 'Eval Loss']) / \n", + " (summary.loc[0, 'Peak Memory (MB)'] - summary.loc[1, 'Peak Memory (MB)']))\n", + " \n", + " if loss_efficiency > 0:\n", + " efficiency_msg = \"8-bit provides better memory efficiency with lower loss\"\n", + " else:\n", + " efficiency_msg = \"4-bit provides better memory efficiency with lower loss\"\n", + " \n", + " print(f\"\\nEfficiency Analysis: {efficiency_msg}\")\n", + " except ImportError:\n", + " print(\"Plotting requires matplotlib and pandas. Install with: pip install matplotlib pandas\")\n", + " except Exception as e:\n", + " print(f\"Error plotting metrics: {str(e)}\")\n", + "\n", + "class FederatedFlow(FLSpec):\n", + " def __init__(self, model=None, optimizer=None, rounds=3, quant_type=\"4bit\", **kwargs):\n", + " \"\"\"\n", + " Initialize the class with the given model, optimizer, and number of rounds.\n", + "\n", + " Parameters:\n", + " model (torch.nn.Module, optional): The model to be used. If None, a ValueError is raised.\n", + " optimizer (torch.optim.Optimizer, optional): The optimizer to be used.\n", + " rounds (int, optional): The number of rounds for training or processing (default is 3).\n", + " quant_type (str, optional): Quantization type, either \"4bit\" or \"8bit\".\n", + " **kwargs: Additional keyword arguments to be passed to the superclass initializer.\n", + "\n", + " Raises:\n", + " ValueError: If no model is provided.\n", + " \"\"\"\n", + " super().__init__(**kwargs)\n", + " if model is not None:\n", + " self.model = model\n", + " self.peft_params = get_peft_model_state_dict(self.model)\n", + " self.optimizer = optimizer\n", + " else:\n", + " raise ValueError(\"No model inputted\")\n", + "\n", + " self.rounds = rounds\n", + " self.quant_type = quant_type\n", + " # Initialize histories for tracking metrics over rounds\n", + " self.average_loss_history = []\n", + " self.agg_model_loss_history = []\n", + " self.local_model_loss_history = []\n", + " \n", + "\n", + " @aggregator\n", + " def start(self):\n", + " \"\"\"\n", + " Initialize the model and set up the collaborators for federated learning.\n", + "\n", + " This method performs the initial setup for the model, including setting the\n", + " collaborators, initializing private variables, and starting the first round\n", + " of the federated learning process.\n", + " \"\"\"\n", + " print(f\"Performing initialization for model with {self.quant_type} quantization\")\n", + " self.collaborators = self.runtime.collaborators\n", + " self.current_round = 0\n", + " # Initialize dictionary to collect memory stats\n", + " # Check if collaborators are objects with name attribute or strings\n", + " if hasattr(self.collaborators[0], 'name'):\n", + " collab_names = [c.name for c in self.collaborators]\n", + " else:\n", + " # If collaborators are already strings, use them directly\n", + " collab_names = self.collaborators\n", + " self.all_memory_stats = {collab: {} for collab in collab_names}\n", + " self.next(\n", + " self.aggregated_model_validation,\n", + " foreach=\"collaborators\",\n", + " )\n", + "\n", + " \n", + " @collaborator\n", + " def aggregated_model_validation(self):\n", + " \"\"\"\n", + " Perform aggregated model validation for a collaborator.\n", + "\n", + " This method loads the model, applies the PEFT configuration, and evaluates\n", + " the model using the provided training and evaluation datasets. The validation\n", + " score is then stored and the next step in the process is triggered.\n", + " \"\"\"\n", + " print(f\"Performing aggregated model validation for collaborator {self.input} with {self.quant_type}\")\n", + " # Initialize memory tracker for this collaborator\n", + " self.memory_tracker = MemoryTracker(self.input, self.quant_type)\n", + " self.memory_tracker.reset_peak()\n", + " \n", + " # Choose quantization config based on quant_type\n", + " if self.quant_type == \"4bit\":\n", + " quant_config = bnb_config_4bit\n", + " else: # 8bit\n", + " quant_config = bnb_config_8bit\n", + " \n", + " # Define device_map variable\n", + " #device_map = \"auto\"\n", + " device_map = {\"\": torch.cuda.current_device()} if torch.cuda.is_available() else \"cpu\"\n", + " try:\n", + " self.model = AutoModelForCausalLM.from_pretrained(\n", + " model_name,\n", + " quantization_config=quant_config,\n", + " device_map=device_map,\n", + " trust_remote_code=True\n", + " )\n", + " self.memory_tracker.log(\"model_load\")\n", + " except ValueError:\n", + " # Fallback to CPU if GPU memory is insufficient\n", + " print(f\"Falling back to CPU mode for {self.input}\")\n", + " self.model = AutoModelForCausalLM.from_pretrained(\n", + " model_name,\n", + " device_map=\"cpu\",\n", + " trust_remote_code=True\n", + " )\n", + " self.memory_tracker.log(\"model_load\")\n", + " \n", + " self.model = prepare_model_for_kbit_training(self.model)\n", + " self.model = get_peft_model(self.model, peft_config)\n", + " set_peft_model_state_dict(self.model, self.peft_params)\n", + " \n", + " trainer = SFTTrainer(\n", + " model=self.model,\n", + " args=training_args,\n", + " peft_config=peft_config,\n", + " train_dataset=self.train_dataset,\n", + " eval_dataset=self.eval_dataset,\n", + " max_seq_length=1024,\n", + " dataset_text_field=\"text\",\n", + " tokenizer=tokenizer,\n", + " packing=True,\n", + " data_collator=transformers.DataCollatorForSeq2Seq(\n", + " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", + " ),\n", + " )\n", + "\n", + " trainer.remove_callback(PrinterCallback)\n", + " out = trainer.evaluate()\n", + " self.agg_validation_score = out[\"eval_loss\"]\n", + " print(f\"{self.input} value of {self.agg_validation_score}\")\n", + " self.memory_tracker.log_loss(eval_loss=self.agg_validation_score) # Log eval loss\n", + " self.memory_tracker.update_peak()\n", + " self.next(self.train)\n", + "\n", + " @collaborator\n", + " def train(self):\n", + " \"\"\"\n", + " Train the model for a collaborator.\n", + "\n", + " This method trains the model using the provided training and evaluation datasets.\n", + " The training loss is stored, the model is saved, and the next step in the process\n", + " is triggered.\n", + " \"\"\"\n", + " self.memory_tracker.log(\"before_training\")\n", + " trainer = SFTTrainer(\n", + " model=self.model,\n", + " args=training_args,\n", + " peft_config=peft_config,\n", + " train_dataset=self.train_dataset,\n", + " eval_dataset=self.eval_dataset,\n", + " max_seq_length=1024,\n", + " dataset_text_field=\"text\",\n", + " tokenizer=tokenizer,\n", + " packing=True,\n", + " data_collator=transformers.DataCollatorForSeq2Seq(\n", + " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", + " ),\n", + " )\n", + "\n", + " out = trainer.train()\n", + " self.loss = out.training_loss\n", + " self.memory_tracker.log(\"after_training\")\n", + " self.memory_tracker.log_loss(training_loss=self.loss) # Log training loss\n", + " self.memory_tracker.update_peak()\n", + " trainer.save_model()\n", + " self.training_completed = True\n", + " self.next(self.local_model_validation)\n", + "\n", + " @collaborator\n", + " def local_model_validation(self):\n", + " \"\"\"\n", + " Perform local model validation for a collaborator.\n", + "\n", + " This method evaluates the model using the provided training and evaluation datasets.\n", + " The validation score is stored, the PEFT parameters are updated, and the next step\n", + " in the process is triggered.\n", + " \"\"\"\n", + " trainer = SFTTrainer(\n", + " model=self.model,\n", + " args=training_args,\n", + " peft_config=peft_config,\n", + " train_dataset=self.train_dataset,\n", + " eval_dataset=self.eval_dataset,\n", + " max_seq_length=1024,\n", + " dataset_text_field=\"text\",\n", + " tokenizer=tokenizer,\n", + " packing=True,\n", + " data_collator=transformers.DataCollatorForSeq2Seq(\n", + " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", + " ),\n", + " )\n", + " out = trainer.evaluate()\n", + " self.local_validation_score = out[\"eval_loss\"]\n", + " self.memory_tracker.log_loss(eval_loss=self.local_validation_score) # Log eval loss\n", + " self.peft_params = get_peft_model_state_dict(self.model)\n", + " print(f\"Doing local model validation for collaborator {self.input}\")\n", + " \n", + " # Display memory report for this collaborator\n", + " self.memory_tracker.report()\n", + " self.memory_stats = self.memory_tracker.get_stats()\n", + " self.next(self.join, exclude=[\"training_completed\", \"model\", \"memory_tracker\"])\n", + "\n", + " @aggregator\n", + " def join(self, inputs):\n", + " \"\"\"\n", + " Aggregate the results from all collaborators and update the model.\n", + "\n", + " This method calculates the average loss, aggregated model accuracy, and local model\n", + " accuracy from all collaborators. The model parameters are updated using Federated\n", + " Averaging (FedAvg), and the next round of the process is triggered if applicable.\n", + " \"\"\"\n", + " self.average_loss = sum(input.loss for input in inputs) / len(inputs)\n", + " self.aggregated_model_accuracy = sum(\n", + " input.agg_validation_score for input in inputs\n", + " ) / len(inputs)\n", + " self.local_model_accuracy = sum(\n", + " input.local_validation_score for input in inputs\n", + " ) / len(inputs)\n", + " print(\n", + " f\"Average aggregated model validation values = {self.aggregated_model_accuracy}\"\n", + " )\n", + " print(f\"Average training loss = {self.average_loss}\")\n", + " print(f\"Average local model validation values = {self.local_model_accuracy}\")\n", + "\n", + " # Store metrics in history for plotting trends\n", + " self.average_loss_history.append(self.average_loss)\n", + " self.agg_model_loss_history.append(self.aggregated_model_accuracy)\n", + " self.local_model_loss_history.append(self.local_model_accuracy)\n", + " \n", + " # Collect memory stats from all collaborators for this round\n", + " for input_data in inputs:\n", + " self.all_memory_stats[input_data.input][f\"round_{self.current_round}\"] = input_data.memory_stats\n", + "\n", + " self.model = FedAvg([input.peft_params for input in inputs], self.model)\n", + " self.peft_params = get_peft_model_state_dict(self.model)\n", + "\n", + " self.model.save_pretrained(\"./aggregated/model\")\n", + " tokenizer.save_pretrained(\"./aggregated/tokenizer\")\n", + " self.current_round += 1\n", + " if self.current_round < self.rounds:\n", + " self.next(\n", + " self.aggregated_model_validation,\n", + " foreach=\"collaborators\",\n", + " exclude=[\"model\"],\n", + " )\n", + " else:\n", + " self.next(self.end)\n", + "\n", + " @aggregator\n", + " def end(self):\n", + " \"\"\"\n", + " End the federated learning process.\n", + "\n", + " This method marks the end of the federated learning process and performs any\n", + " necessary cleanup or finalization steps.\n", + " \"\"\"\n", + " print(f\"This is the end of the flow for {self.quant_type} quantization\")\n", + " print(\"\\n===== Final Metrics =====\\n\")\n", + " print(f\"Average Training Loss: {self.average_loss_history[-1]:.4f}\")\n", + " print(f\"Final Aggregated Model Loss: {self.agg_model_loss_history[-1]:.4f}\")\n", + " print(f\"Final Local Model Loss: {self.local_model_loss_history[-1]:.4f}\")\n", + " \n", + " print(\"\\n===== Memory Usage Summary Across All Rounds =====\\n\")\n", + " \n", + " # Print aggregated memory statistics\n", + " for collab, rounds_data in self.all_memory_stats.items():\n", + " print(f\"\\n==== {collab} Memory Usage Across Rounds ({self.quant_type}) ====\\n\")\n", + " for round_name, stats in rounds_data.items():\n", + " print(f\" {round_name}:\")\n", + " for metric, value in stats.items():\n", + " if value is not None:\n", + " if metric in ['training_loss', 'eval_loss', 'quant_type']:\n", + " if metric != 'quant_type':\n", + " print(f\" {metric}: {value:.4f}\")\n", + " else:\n", + " print(f\" {metric}: {value:.2f} MB\")\n", + " else:\n", + " print(f\" {metric}: Not recorded\")\n", + " print(\"-\" * 50)" + ] + }, + { + "cell_type": "markdown", + "id": "7bc8fe27", + "metadata": {}, + "source": [ + "## Run Federated Learning with 4-bit and 8-bit Quantization" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "38894111-41d9-4dd4-b1c8-eb7ec3cdd3e1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=============== Running with 4-bit Quantization ===============\n", + "\n", + "\n", + "Calling start\n", + "\u001b[94mPerforming initialization for model with 4bit quantization\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94mPerforming aggregated model validation for collaborator Portland with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.27it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "Generating train split: 915 examples [00:01, 626.55 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "Generating train split: 96 examples [00:00, 570.74 examples/s]\u001b[0m\u001b[94m0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [12/12 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland value of 0.5819987058639526\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "Generating train split: 915 examples [00:01, 619.44 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "Generating train split: 96 examples [00:00, 628.10 examples/s]\u001b[0m\u001b[94m0m\u001b[94m\n", + "\u001b[0m`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`...\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [229/229 09:05, Epoch 1/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
100.501600
200.373200
300.337300
400.348300
500.334300
600.331800
700.322600
800.325800
900.320700
1000.328900
1100.303000
1200.313100
1300.312800
1400.320100
1500.308100
1600.312800
1700.325200
1800.307200
1900.320100
2000.310600
2100.308200
2200.310700

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [12/12 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 35323.02 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60420.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57461.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 32979.33 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 45302.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 48011.95 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 35078.37 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60420.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57461.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 35323.02 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 41244.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57461.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.3295\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.3029\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94mPerforming aggregated model validation for collaborator Seattle with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "Generating train split: 917 examples [00:01, 622.35 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "Generating train split: 100 examples [00:00, 631.84 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle value of 0.5914124846458435\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [229/229 09:07, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
100.487200
200.371700
300.346800
400.334800
500.324900
600.319300
700.331200
800.336300
900.310900
1000.308100
1100.313600
1200.312600
1300.318200
1400.323600
1500.304700
1600.323100
1700.305100
1800.314500
1900.303500
2000.314900
2100.327900
2200.314100

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 23170.02 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 48256.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 20890.32 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 33280.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 22957.36 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 48256.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 23170.02 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 29538.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.3287\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.3178\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94mAverage aggregated model validation values = 0.5867055952548981\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mAverage training loss = 0.3290792714039832\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mAverage local model validation values = 0.310357466340065\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94mPerforming aggregated model validation for collaborator Portland with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.28it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [12/12 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland value of 0.30139902234077454\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [229/229 09:06, Epoch 1/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
100.298900
200.293900
300.279100
400.293300
500.290500
600.291100
700.280500
800.289900
900.289200
1000.298400
1100.275500
1200.290700
1300.290200
1400.301600
1500.290300
1600.299000
1700.313100
1800.297100
1900.313400
2000.303800
2100.302100
2200.306200

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [12/12 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 35535.52 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 59824.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33255.83 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 33440.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 35322.87 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 59824.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 35535.52 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 41948.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.2949\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.2986\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94mPerforming aggregated model validation for collaborator Seattle with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.27it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle value of 0.3157660961151123\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [229/229 09:07, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
100.297100
200.287600
300.288400
400.284300
500.282800
600.281400
700.292800
800.296100
900.276100
1000.277400
1100.283700
1200.288200
1300.296800
1400.301800
1500.285500
1600.308200
1700.292100
1800.305600
1900.296300
2000.306900
2100.321900
2200.309400

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 35535.52 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 59804.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57918.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33255.83 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 33424.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57918.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 35322.87 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 59804.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57918.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 35535.52 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 41528.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57918.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.2942\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.3126\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94mAverage aggregated model validation values = 0.3085825592279434\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mAverage training loss = 0.29453011579388616\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mAverage local model validation values = 0.30557093024253845\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling end\n", + "\u001b[94mThis is the end of the flow for 4bit quantization\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "===== Final Metrics =====\n", + "\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mAverage Training Loss: 0.2945\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mFinal Aggregated Model Loss: 0.3086\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mFinal Local Model Loss: 0.3056\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "===== Memory Usage Summary Across All Rounds =====\n", + "\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Portland Memory Usage Across Rounds (4bit) ====\n", + "\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 35323.02 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 60420.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57461.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.3295\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.3029\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 32979.33 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 45302.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 48011.95 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 35078.37 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 60420.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57461.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 35323.02 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 41244.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57461.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 35535.52 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 59824.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.2949\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.2986\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 33255.83 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 33440.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 35322.87 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 59824.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 35535.52 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 41948.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Seattle Memory Usage Across Rounds (4bit) ====\n", + "\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 23170.02 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 48256.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.3287\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.3178\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 20890.32 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 33280.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 22957.36 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 48256.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 23170.02 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 29538.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 35535.52 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 59804.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57918.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.2942\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.3126\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 33255.83 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 33424.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57918.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 35322.87 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 59804.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57918.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 35535.52 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 41528.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57918.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mCleared CUDA cache between runs\n", + "\n", + "=============== Running with 8-bit Quantization ===============\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|██████████| 6/6 [00:04<00:00, 1.36it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling start\n", + "\u001b[94mPerforming initialization for model with 8bit quantization\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94mPerforming aggregated model validation for collaborator Portland with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.30it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [12/12 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland value of 0.5662918090820312\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [229/229 13:26, Epoch 1/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
100.494400
200.367000
300.331100
400.342600
500.329000
600.326600
700.315600
800.320400
900.316400
1000.323500
1100.297700
1200.309000
1300.308100
1400.315500
1500.303500
1600.307800
1700.320400
1800.304000
1900.314900
2000.305600
2100.303100
2200.306500

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [12/12 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 75278.13 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 93310.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 92214.55 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 72811.06 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 91120.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 91914.16 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 75278.13 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 93310.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 92214.55 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 75250.57 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 83158.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 92214.55 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.3243\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.2989\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94mPerforming aggregated model validation for collaborator Seattle with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.28it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle value of 0.5757399201393127\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [229/229 13:29, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
100.481300
200.365600
300.344500
400.331200
500.320000
600.314700
700.326100
800.331600
900.306900
1000.304800
1100.309200
1200.308300
1300.313500
1400.318300
1500.299200
1600.318800
1700.300500
1800.310100
1900.299400
2000.310000
2100.323100
2200.310700

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 58276.76 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 83620.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 92551.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 55775.01 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 74152.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 92551.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 58145.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 83620.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 92551.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 58276.76 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 65726.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 92551.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.3242\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.3134\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94mAverage aggregated model validation values = 0.571015864610672\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mAverage training loss = 0.3242545044578319\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mAverage local model validation values = 0.30610978603363037\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94mPerforming aggregated model validation for collaborator Portland with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.28it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [12/12 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland value of 0.296934574842453\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [229/229 13:24, Epoch 1/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
100.295100
200.290700
300.277600
400.291800
500.286200
600.288300
700.277600
800.286000
900.285200
1000.295400
1100.272500
1200.288300
1300.288100
1400.298300
1500.287800
1600.295400
1700.309200
1800.293700
1900.308100
2000.299100
2100.296900
2200.301700

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [12/12 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 75488.79 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 93552.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 92552.04 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 73023.56 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 74272.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 92551.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 75488.79 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 93552.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 92552.04 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 75466.38 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 82944.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 92552.04 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.2914\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.2939\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94mPerforming aggregated model validation for collaborator Seattle with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.28it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle value of 0.31116044521331787\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [229/229 13:28, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
100.294400
200.284700
300.289000
400.282800
500.279500
600.277900
700.289600
800.294600
900.275700
1000.276200
1100.280600
1200.284700
1300.292600
1400.297800
1500.281700
1600.305000
1700.288500
1800.301900
1900.292400
2000.303000
2100.317300
2200.305900

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 75529.57 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 93476.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 92767.32 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 73023.56 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 74242.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 92767.32 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 75388.56 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 93476.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 92767.32 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 75529.57 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 83044.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 92767.32 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.2912\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.3080\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94mAverage aggregated model validation values = 0.30404751002788544\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mAverage training loss = 0.29131152119699005\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mAverage local model validation values = 0.3009362369775772\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling end\n", + "\u001b[94mThis is the end of the flow for 8bit quantization\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "===== Final Metrics =====\n", + "\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mAverage Training Loss: 0.2913\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mFinal Aggregated Model Loss: 0.3040\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mFinal Local Model Loss: 0.3009\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "===== Memory Usage Summary Across All Rounds =====\n", + "\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Portland Memory Usage Across Rounds (8bit) ====\n", + "\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 75278.13 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 93310.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 92214.55 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.3243\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.2989\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 72811.06 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 91120.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 91914.16 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 75278.13 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 93310.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 92214.55 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 75250.57 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 83158.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 92214.55 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 75488.79 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 93552.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 92552.04 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.2914\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.2939\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 73023.56 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 74272.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 92551.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 75488.79 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 93552.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 92552.04 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 75466.38 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 82944.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 92552.04 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Seattle Memory Usage Across Rounds (8bit) ====\n", + "\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 58276.76 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 83620.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 92551.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.3242\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.3134\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 55775.01 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 74152.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 92551.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 58145.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 83620.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 92551.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 58276.76 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 65726.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 92551.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 75529.57 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 93476.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 92767.32 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.2912\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.3080\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 73023.56 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 74242.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 92767.32 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 75388.56 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 93476.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 92767.32 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 75529.57 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 83044.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 92767.32 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + } + ], + "source": [ + "# Setup participants\n", + "aggregator = Aggregator()\n", + "collaborators = [\n", + " Collaborator(name=\"Portland\"),\n", + " Collaborator(name=\"Seattle\")\n", + "]\n", + "\n", + "# Assign data shards\n", + "for idx, colab in enumerate(collaborators):\n", + " colab.private_attributes = {\n", + " \"train_dataset\": train_dataset.shard(len(collaborators), idx),\n", + " \"eval_dataset\": eval_dataset.shard(len(collaborators), idx)\n", + " }\n", + "\n", + "# First run with 4-bit quantization\n", + "print(\"\\n=============== Running with 4-bit Quantization ===============\\n\")\n", + "bnb_config = bnb_config_4bit # Set active config to 4-bit\n", + "runtime = LocalRuntime(aggregator=aggregator, collaborators=collaborators)\n", + "flflow_4bit = FederatedFlow(model, rounds=2, quant_type=\"4bit\")\n", + "flflow_4bit.runtime = runtime\n", + "flflow_4bit.run()\n", + "\n", + "# Clean up CUDA cache between runs\n", + "if torch.cuda.is_available():\n", + " torch.cuda.empty_cache()\n", + " print(\"Cleared CUDA cache between runs\")\n", + "\n", + "# Then run with 8-bit quantization\n", + "print(\"\\n=============== Running with 8-bit Quantization ===============\\n\")\n", + "bnb_config = bnb_config_8bit # Set active config to 8-bit\n", + "# Reload the model with 8-bit quantization\n", + "model_8bit = AutoModelForCausalLM.from_pretrained(\n", + " model_name,\n", + " quantization_config=bnb_config_8bit,\n", + " device_map=\"auto\",\n", + " trust_remote_code=True\n", + ")\n", + "model_8bit = prepare_model_for_kbit_training(model_8bit)\n", + "model_8bit = get_peft_model(model_8bit, peft_config)\n", + "\n", + "runtime = LocalRuntime(aggregator=aggregator, collaborators=collaborators)\n", + "flflow_8bit = FederatedFlow(model_8bit, rounds=2, quant_type=\"8bit\")\n", + "flflow_8bit.runtime = runtime\n", + "flflow_8bit.run()" + ] + }, + { + "cell_type": "markdown", + "id": "6e1268ae", + "metadata": {}, + "source": [ + "## Compare VRAM Usage and Training Loss Between 4-bit and 8-bit" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "6f5caae6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "==== Memory Usage Comparison: 4-bit vs 8-bit ====\n", + "\n" + ] + }, + { + "data": { + "image/png": "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3nuP77//noMHD3Lu3DkaNWrE5cuX6datmyVeYo5zSrUZERERkVeVOjVERETktXfr1q1YH5obhmGZ13348OEYhmF50JZUP//8c6zh0Q8nK1SoYLXAblyiH3JHREQ8VT0garHoli1bYjabmTlzJr///jvXr1+nfPny5MmTJ1F5eHt7M3r0aADOnTsX59oMj3v8AXFcIxiiO43im7olPvv372f//v0xwg8ePMju3buxsbGhUqVKicrrWY511apVLYsRd+3aNd43yAcNGsTVq1dJmzat1cNR+P+HnocPH46R7sGDB7Gu43D79m0iIyPx8PCItXPg559/TvaRDM9yrJYuXUqPHj1wd3fnjz/+iHP6Hfj/zq7s2bPH2BYaGspvv/2WrPWzs7OjQoUKgPXIpsf99NNPQNQ5f9769euHvb09+/btY+zYsQnG37hxo+XfVapUAWDevHmxTgW1aNEibt68ibu7u2WkUUpIym9j9PnPlClTrL+XceX1PGTNmtWyePfjo8aij/PKlStjnX5uz5497N27N0m/RSIiIiJiTZ0aIiIiIilg165dlk6AaJs2beLbb78FoHfv3onKJ3qUwfHjxwkPD3/q+jw+BVX0Q9nYRmmcPXuWH3/8MdY56n///XcA0qZNG+fIi8c5ODjQsGFDIOpB/pOdD2vXrrU8qI2ehiqpDMOgc+fOVp0st2/fpnPnzhiGQdOmTcmaNWui8oo+1vHN3R+fn3/+GU9PT7Zt20b9+vVjLH7+8OFDPv74Y7766ivs7OyYP3++1boJANWrVwfg22+/tZp///79+3To0CHWBdUzZsxI2rRpuXXrlmW6r2hbt25lwIABT7U/8XnaY7V9+3befvttbGxsWLBgQayLvD8uerHkGTNmWI1eCQ0NpUuXLnG+9f8sfzcffvghAJMnT44x1dr06dNZunQp9vb29OzZM0n5Po18+fJZ1qLp06cPAwcOjHUUz7Fjx3j77bfp0aOHJax58+Zky5aNCxcu0KdPH6sOntOnT1v2s3v37rEu+P28JOW3MU+ePNja2nLgwAHLgtzRfv/9d7755ptkr9+ePXuYN28eDx8+jLEt+jfw8U62ChUqULp0aR4+fEjHjh158OCBZdu1a9fo2LEjELVge2J/i0RERETEmhYKFxEREUkBPXr0YMCAAcycOZPChQtz4cIFNm7ciNlspmfPntSt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rFesWMHhw4epV69eovOqU6cO6dOnZ9SoUfz111+Jnh82em7diRMnxtj27bffWsUBLOcwmpubG7ly5bLUP7ZzCzB27Fir77a2tlSvXp3Fixdz4cIFS/iJEydYsWKFVdzEtquERO9PtAkTJsTYP4D33nuPmzdv0rFjR+7du5foYxmXjz/+mPDwcMvIn7p16wIxj0n09sfPu7+/Pxs2bLCK9/3338f5JldCqlevjr29PRMmTLA6lk/WRURERERiiu1aNywsjEmTJqVWlawk5Rr7aSX2HubBgweEhoZapfX398fd3d2S7ubNmzGu74sWLQqQqCmoLly4wKJFiyzf79y5w8yZMylatCg+Pj6WcDs7O95++21+/fVXpk+fTqFChShcuHDSdvwxnp6edOzYkVWrVrF3714g6hp/+/bt/P3335Z49+/f5/vvv8fPz4/8+fMDWNZEefwaPzIyku+///6p61O3bl0uXLjAggULLGEPHjx4pjxF5PWmkRoi8lrx9/dnxIgRDBgwgDNnztC4cWPc3d05ffo0ixYtokOHDvTt25eAgAD8/f3p27cv//33Hx4eHvz2228Jvinu7OzMsmXLePPNN6lTpw5//fUXBQsWTFIde/bsmWCc9957j19//ZVOnToREhJC+fLliYyM5MiRI/z666+sWrUqycOMY2Nvb8+oUaMICgqicuXKvP3221y+fJlx48bh5+dH7969k5RXq1atmDhxIra2trz99tuJSle0aFHatWvHuHHjOH78ODVq1ACiRs0sX76cdu3aUaRIEUv8/PnzU6VKFUqUKEG6dOnYuXMnCxYsoFu3bkDU4nzR8+WGh4eTOXNm/vzzz1jfXgsODubPP/+kfPnydO7cmcjISCZOnEjBggUtNweQ+HaVkNOnT9OwYUNq167N33//zc8//0zr1q2t9g+i1l8pWLCgZcH44sWLJ+pYxiV//vzUrVuXH3/8kUGDBlGkSBHatm3L999/b5nCYPv27cyYMYPGjRtTtWpVS9p27drRqVMnmjZtSo0aNdi3bx+rVq0iffr0T1UXb29v+vbty8iRI6lfvz5169Zlz549rFix4qnzFBEREXldlCtXjrRp09K2bVt69OiByWRi1qxZL9RUQIm9xo5PeHg4I0aMiBGeLl06unTpkqh7mGPHjlGtWjVatGhB/vz5sbOzY9GiRVy+fJlWrVoBMGPGDCZNmsRbb72Fv78/d+/e5YcffsDDw8PyIlB88uTJwwcffMCOHTvImDEjP/30E5cvX2batGkx4rZp04bx48cTEhLCqFGjEnUc4tOzZ0/Gjh3LF198wdy5c+nfvz+//PILderUoUePHqRLl44ZM2Zw+vRpfvvtN8tUVwUKFKBMmTIMGDCAGzdukC5dOubOnUtERMRT16V9+/ZMnDiRNm3asGvXLnx9fZk1axYuLi7PvJ8i8poyREReEdOmTTMAY8eOHQnG/e2334wKFSoYrq6uhqurqxEQEGB07drVOHr0qCXOoUOHjOrVqxtubm5G+vTpjfbt2xv79u0zAGPatGmWeG3btjVcXV2t8r927ZqRP39+w8fHxzh+/Hic9RgyZIgBGFevXo23voDRtWtXq7CwsDBj1KhRRoECBQxHR0cjbdq0RokSJYyhQ4cat2/fjjft6dOnDcD48ssvrcJDQkIMwJg/f75V+Lx584xixYoZjo6ORrp06Yx33nnHOH/+vFWc2I7Dk7Zv324ARs2aNeON96TIyEhj3LhxRpEiRQwnJyfDycnJKFKkiDF+/HgjMjLSKu6IESOMUqVKGZ6enoazs7MREBBgfPbZZ0ZYWJglzvnz54233nrL8PT0NNKkSWM0b97cuHDhggEYQ4YMscpv7dq1RrFixQwHBwfD39/f+PHHH40PP/zQcHJyilHPxLSr2ES3g0OHDhnNmjUz3N3djbRp0xrdunUzHj58GGua0aNHG4Dx+eefJ/IoGkblypWNAgUKxLpt/fr1VvsfHh5uDB061MiRI4dhb29vZM2a1RgwYIARGhpqlS4yMtLo16+fkT59esPFxcWoVauWceLECSN79uxG27ZtLfHi+vuMbnMhISFWeQ4dOtTw9fU1nJ2djSpVqhj//PNPjDxFREREXgddu3Y1nnx8E9913ebNm40yZcoYzs7ORqZMmYyPP/7YWLVqVYxrrrZt2xrZs2e3fI/rHsEwjBjXydHXr0/GefK+wzCMWK/hknKN/aS2bdsaQKwff39/S7yE7mGuXbtmdO3a1QgICDBcXV2NNGnSGKVLlzZ+/fVXS5zdu3cbb7/9tpEtWzbD0dHRyJAhg1G/fn1j586dCdYze/bsRr169YxVq1YZhQsXNhwdHY2AgIAY91qPK1CggGFjYxPjXisu8Z0zwzCMwMBAw9bW1jhx4oRhGIZx8uRJo1mzZoanp6fh5ORklCpVyli2bFmMdCdPnjSqV69uODo6GhkzZjQGDhxorF69OkYbiqsdPtm2DMMwzp49azRs2NBwcXEx0qdPb/Ts2dNYuXJljDxFRBLDZBgvUHe9iIi80vbt20fRokWZOXPmM80Rm9oaN27MwYMHY6zDkZLGjRtH7969OXPmDNmyZUu1eoiIiIiIJIcX4Ro7tRUrVox06dKxdu3a1K6KiMgLTWtqiIhIivnhhx9wc3OjSZMmqV2VRHv48KHV9+PHj7N8+fKnWgg+uRiGwdSpU6lcubI6NERERETkpfMiXmOntp07d7J3717atGmT2lUREXnhaU0NERF57n7//XcOHTrE999/T7du3XB1dU3tKiVazpw5CQwMJGfOnJw9e5bJkyfj4ODAxx9/nOJ1uX//PkuXLiUkJIQDBw6wZMmSFK+DiIiIiMizepGusVPbP//8w65duxgzZgy+vr60bNkytaskIvLCU6eGiIg8d927d+fy5cvUrVuXoUOHpnZ1kqR27dr88ssvXLp0CUdHR8qWLcvnn39O7ty5U7wuV69epXXr1nh6ejJw4EAaNmyY4nUQEREREXlWL9I1dmpbsGABw4YNI2/evPzyyy84OTmldpVERF54WlNDREREREREREREREReClpTQ0REREREREREREREXgqafuopmc1mLly4gLu7OyaTKbWrIyIiIiKS4gzD4O7du2TKlAkbG70v9Sx0fyEiIiIir7vE3l+oU+MpXbhwgaxZs6Z2NUREREREUt2///5LlixZUrsaLzXdX4iIiIiIREno/kKdGk/J3d0diDrAHh4eKV6+2Wzm6tWreHt7662415TagKgNiNqAqA283l6E83/nzh2yZs1quTaWp5fa9xfwYrQpST06/6I2IGoDojYgqd0GEnt/oU6NpxQ9JNzDwyPVOjVCQ0Px8PDQj8xrSm1A1AZEbUDUBl5vL9L513RJzy617y/gxWpTkvJ0/kVtQNQGRG1AXpQ2kND9hVqniIiIiIiIiIiIiIi8FNSpISIiIiIiIiIiIiIiLwV1aoiIiIiIiIiIiIiIyEtBa2qIiIiIiIiIiIiICACRkZGEhYWldjUkFZjNZsLDwwkNDX0ua2rY29tja2v7zPmoU0NERERERERERETkNWcYBnfv3uXGjRsJLtQsrybDMDCbzdy9e/e5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bW1x//59/PPPP+jcuTOAnKSHnp6e0n6Dg4Px5MmTt+6XiIiIiIgKjiM1iIiIiIjogzFmzBgMGDAAPj4+qFevHhYtWoRXr15h0KBBAID+/fujXLlymDNnDgBg3rx5mDJlCjZt2gQ3NzfFOzBMTExgYmICANi+fTtsbW3h4uKCmzdv4ptvvkGXLl3Qpk0bADnJjsGDB2PMmDGwsrKCmZkZRo4ciYYNG6p9STgRERERERUekxpERERERPTB6NWrF6KjozFlyhRERESgVq1aOHz4sOLl4U+ePFGaqzcgIAAZGRno3r270namTp2KadOmAQBevHiBMWPGIDIyEo6Ojujfvz8mT56sVP+XX36BVCpFt27dkJ6eDj8/Pyxfvrx4D5aIiIiIqAySiPd5u10ZlpCQAAsLCzx9+hRmZmYa379cLkd0dLTW3kRP2sc2QGwDxDZAbANlW0m4/omJiXB2dkZ8fDzMzc21EsOHQtv9C6BktCnSHl5/YhsgtgFiGyBtt4H89i84UqOQkpKSAADOzs5ajoSIiIiISLuSkpKY1HhP7F8QEREREeV4V/+CIzUKSS6XIzw8HKamppBIJBrff27WSpvf5CLtYhsgtgFiGyC2gbKtJFx/IQSSkpLg5OTEb/O9J233L4CS0aZIe3j9iW2A2AaIbYC03Qby27/gSI1CkkqlKF++vLbDgJmZGX/JlHFsA8Q2QGwDxDZQtmn7+nOERtEoKf0LQPttirSL15/YBohtgNgGSJttID/9C36dioiIiIiIiIiIiIiISgUmNYiIiIiIiIiIiIiIqFRgUqOUkslkmDp1KmQymbZDIS1hGyC2AWIbILaBso3Xn4oa21TZxutPbAPENkBsA1Ra2gBfFE5ERERERERERERERKUCR2oQEREREREREREREVGpwKQGERERERERERERERGVCkxqEBERERERERERERFRqcCkBhERERERERERERERlQpMahARERERERERERERUanApEYJtmzZMri5ucHAwAD169fHpUuX3lp/+/bt8PLygoGBAapXr46DBw9qKFIqLgVpA7///juaNGkCS0tLWFpawtfX951thkq+gv4eyLVlyxZIJBJ06dKleAOkYlfQNhAfH4/hw4fD0dERMpkMlStX5v8HpVhBr/+iRYvg6ekJQ0NDODs749tvv0VaWpqGoqWi9tdff6FTp05w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7GOUXR9S/0IiBMcKERERERERERERERFRycd3ahARERERERERERERUanApAYREREREREREREREZUKTGoQEREREREREREREVGpwKQGERERERERERERERGVCkxqEBERERERERERERFRqcCkBhERERERERERERERlQpMahARERERERERERERUanApAYREREREREREREREZUKTGoQEREBaN68OUaPHq3tMIiIiIiI6APA/gURUfFhUoOIiDRm4MCBkEgkkEgk0NPTg7u7O8aNG4e0tDRth0ZERERERKUM+xdERGWTrrYDICKisqVt27ZYu3YtMjMzceXKFQwYMAASiQTz5s3TdmhERERERFTKsH9BRFT2cKQGERFplEwmg4ODA5ydndGlSxf4+vri2LFjAID09HSMGjUKdnZ2MDAwQOPGjXH58mXFuuvWrYOFhYXS9nbv3g2JRKL4PG3aNNSqVQsbNmyAm5sbzM3N0bt3byQlJSnqvHr1Cv3794eJiQkcHR3x888/F+9BExERERFRsWD/goio7GFSg4iItObWrVv4+++/oa+vDwAYN24c/vzzT6xfvx5Xr15FxYoV4efnh7i4uAJtNzQ0FLt378b+/fuxf/9+nD59GnPnzlUs/+6773D69Gns2bMHR48exalTp3D16tUiPTYiIiIiItIs9i+IiMoGJjWIiEij9u/fDxMTExgYGKB69eqIiorCd999h1evXiEgIAA//fQT2rVrB29vb/z+++8wNDTE6tWrC7QPuVyOdevWoVq1amjSpAn69euHEydOAACSk5OxevVqLFiwAK1atUL16tWxfv16ZGVlFcfhEhERERFRMWL/goio7OE7NYiISKNatGiBgIAAvHr1Cr/88gt0dXXRrVs33LhxA5mZmWjUqJGirp6eHurVq4e7d+8WaB9ubm4wNTVVfHZ0dERUVBSAnG9ZZWRkoH79+orlVlZW8PT0fM8jIyIiIiIiTWP/goio7GFSg4iINMrY2BgVK1YEAKxZswY1a9bE6tWrUbdu3XeuK5VKIYRQKsvMzFSpp6enp/RZIpFALpe/R9RERERERFQSsX9BRFT2cPopIiLSGqlUikmTJuGHH36Ah4cH9PX1ce7cOcXyzMxMXL58Gd7e3gAAW1tbJCUl4dWrV4o6169fL9A+PTw8oKenh4sXLyrKXr58iZCQkPc7GCIiIiIi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ouKUlZUFJycndOrUCatXr9Z2OERERET0AYmJiYGjoyOmTJmCyZMnazucQhs9ejRWrlyJ5OTkPF8aTUREBPCdGkRERMVu9+7diI6ORv/+/bUdChERERF9YNatW4fs7Gz069dP26HkW2pqqtLn2NhYbNiwAY0bN2ZCg4iI3onv1CAiIiomFy9exI0bNzBz5kx89NFHaNasmbZDIiIiIqIPxMmTJ3Hnzh38+OOP6NKlC9zc3LQdUr41bNgQzZs3R5UqVRAZGYnVq1cjMTGxVI80ISIizeH0U0RERMVk4MCB2LhxI2rVqoV169ahWrVq2g6JiIiIiD4QzZs3x99//41GjRph48aNKFeunLZDyrdJkyZhx44dePbsGSQSCWrXro2pU6fC19dX26EREVEpwKQGERERERERERERERGVCnynBhERERERERERERERlQp8p0YhyeVyhIeHw9TUFBKJRNvhEBERERFpnBACSUlJcHJyglTK70u9D/YviIiIiKisy2//gkmNQgoPD4ezs7O2wyAiIiIi0rqnT5+ifPny2g6jVGP/goiIiIgox7v6F0xqFJKpqSmAnBNsZmam8f3L5XJER0fD1taW34oro9gGiG2A2AaIbaBsKwnXPzExEc7Ozop7Yyo8bfcvSrOS8G+hrOC51hyea83i+dYcnmvN4bnWHJ7ropPf/gWTGoWUOyTczMxMa0mNtLQ0mJmZ8R9LGcU2QGwDxDZAbANlW0m6/pwu6f1pu39RmpWkfwsfOp5rzeG51iyeb83hudYcnmvN4bkueu/qX/AsExERERERERERERFRqcCkBhERERERERERERERlQpMahARERERERERERERUanAd2oQERERlWJCCKSlpXHu1jJILpcjMzOzWK+/np4edHR0imXb9GEYOHAg1q9fDwDQ1dVF+fLl0aNHD8yYMQMGBgYAgLi4OIwcORL79u2DVCpFt27dsHjxYpiYmGgzdCIiIiIqpZjUICIiIiqlMjIyEBsbi5cvX/JFzWWQEAJyuRxJSUnFev0tLCzg4ODANkZ5atu2LdauXYvMzExcuXIFAwYMgEQiwbx58wAAn332GV68eIFjx44hMzMTgwYNwpAhQ7Bp0yYtR05EREREpRGTGkRERESlkBACERER0NfXR7ly5fht+jJICIGsrCzo6uoWS8JBCIGUlBRERUUBABwdHYt8H/RhkMlkcHBwAAA4OzvD19cXx44dw7x583D37l0cPnwYly9fho+PDwBgyZIlaN++PRYsWAAnJydthk5EREREpRCTGkRERESlUFZWFlJSUuDg4AAjIyN+i74MKu6kBgAYGhoCAKKiomBnZ8fkGb3TrVu38Pfff8PV1RUAcP78eVhYWCgSGgDg6+sLqVSKixcvomvXrtoKlYiIiIhKKSY1iIiIiEqh7OxsADnvPCAqTkZGRgCAzMxMJjVIrf3798PExARZWVlIT0+HVCrF0qVLAQARERGws7NTqq+rqwsrKytERERoI1wiIiIiKuWY1CAiIiIiojxxFBC9S4sWLRAQEIBXr17hl19+ga6uLrp166btsIiIiIjoAyXVdgBERERERERUehkbG6NixYqoWbMm1qxZg4sXL2L16tUAAAcHB8V7WXJlZWUhLi5O8R4OIiIiIqKCYFKDiIiIiIiIioRUKsWkSZPwww8/IDU1FQ0bNkR8fDyuXLmiqHPy5EnI5XLUr19fi5ESERERUWnFpAYRERFRGZadDZw6BWzenPPn/7+q44Pw6NEjSCQSXL9+vdj35ebmhkWLFr21TkZGBipWrIi///77vfY1bdo01KpV6611Bg4ciC5dury1zp07d1C+fHm8evXqveKh0i88KRyhcaEF/glPCle7vR49ekBHRwfLli1DlSpV0LZtW/j7++PSpUs4d+4cRowYgd69e8PJyUnDR0pEREREHwK+U4OIiIiojNq5E/jmG+DZs//KypcHFi8GPv20ePY5cOBArF+/HkDOS85dXFzQv39/TJo0Cbq6hb81HThwIOLj47F79+4iirTorVixAu7u7vj4449VlqWnp6N+/fr4999/ce3atXcmLd5l8eLFEEIoPjdv3hy1atVSSrx4e3ujQYMGWLhwISZPnvxe+6PSKzwpHH3+7IOk9KQCr2sqM4V9pr1Kua6uLkaMGIH58+fj66+/RmBgIEaMGIFWrVpBKpWiW7du+PXXX4sifCIiIiIqg5jUICIiIiqDdu4EuncHXnvuDQB4/jynfMeO4ktstG3bFmvXrkV6ejoOHjyI4cOHQ09PDxMnTizwtrKzs0vFi6yFEFi6dClmzJihdvm4cePg5OSEf//9t0j2Z25unq96gwYNgr+/PyZOnPheSSUqvVIzU5GUngSZrgyGuob5Xy8rZ701S9bAw8pD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K6OSVSWYykw1cVhURs3c/3/s/XmYVOWd//+/TnX1vm/Ve9M7iCKgyOKKEcW4KxL96oziOJqYIYkSzbiBWwzRzCXGaHTmF43G5RMzGWOMaxBXFEFRVBR6oel9qd73ver3x7EbiqpuGuiu6uX5uK5zNZz1PjentU6/+n3f92nd39dJ0tDX6RZsZGRk6MYbb9SNN954ROd58skn9eKLL+qf//znuLfHMAy99NJLOu+884bd59Zbb1VHR4d+97vfHVF7JhPeLwAAAICpz+fDT61Zs0ZXX321FixYoIULF+rhhx9WR0eHrrnmGknSVVddpZSUFK1fv16SOfbsggULlJ2drZ6eHr3++ut69tln9fjjjw+ds7GxUWVlZaqqqpIk5efnS5ISExOVmJioPXv26IUXXtA555yj2NhYffXVV7rpppt06qmn6thjj/VyDwAAppKY4BgtTl2sxamLXdY7nA5VtFZ4DDxKmkvU2tOqz6o+02dVn7mdMzk82WN1x4yIGd66LUxR+wcag8Y72Kirq9O6dev02muvqba2VtHR0Zo7d67WrVunk046acyu4ykYePrpp3XjjTequbl5zK4zqLu7W2vXrtX//u//uqx/+OGH9fjjj6usrExxcXG69NJLtX79+iMetqm6ulpRUVGSpJKSEmVlZemLL77QvHnzhva5+eablZWVpZtuuklZWVlHdL3JhPcLAAAAYGrzeahx2WWXDb3c1tTUaN68eXrzzTeHJvcrKytzKTvp6OjQj3/8Y1VUVCg4OFizZs3Sc889p8suu2xon1deeWXopUWSLr/8cknSXXfdpbvvvlsBAQF6++23h15w0tLStGLFCt15551eumsAwHRjMSxKj0xXemS6lmUtc9nW09+jPU179oUd9fkqaDT/bO+wq6qtSlVtVXqv5D2X46wWq2aEz9As2yzNipvlUumRGJbIxNEYkacTUyf/AADeD0lEQVRAY9B4BhsrVqxQb2+vnnnmGWVlZam2tlabNm1SQ0PDmF/Lm/76178qIiLCJZh54YUXdOutt+qpp57SiSeeqIKCAq1atUqGYeihhx46ouslJibK6XSqv79/2H3i4uK0fPlyPf744/rNb35zRNebTHi/AAAAAKY2w+l0On3diMmotbVVkZGRamlp8dlE4Xa7XTabjbHapimeAfAMTA9NXU37JirfL+woaChQZ1/nsMeFBYR5HM4qLzZPEYFMQDsVdHd3q7i4WGlpaQoLC5MkdfYO/0zs79dv/Fq/fO2XB93vznPv1K3fv/Wg+4UEhIwqRGtublZ0dLTee+89nXbaaSPud/PNN+vvf/+7enp6tGDBAm3YsEFz586VJO3Zs0dr1qzRJ598oo6ODh111FFav369li0zA8OlS5fq/fffdznnu+++q9NPP91l3eAPpA+s6jjY9T0577zzdNRRR7mEB6tXr9auXbu0adOmoXU///nPtXXrVm3evHnYc2VkZOjaa6/Vt99+q1deeUVRUVG6/fbb9R//8R9D++w//FRAQIDL8aeddpree+89SdKf/vQn3XHHHSovLx/2egfT3d2tvXv3KjMz063CxNefiacS+vLw8ZnIe+hr76GvvYv+9h762nvoa++hr8fOaD8T+7xSAwAADC86OFoLUxZqYcpCl/VOp1PlLeXatmeb7A67ChsKhwKPvU171d7brs+rP9fn1Z+7nTMxLNEt7JgZO1OZ0ZkK8Atw2x+TQ2dvp8JWh43pOX/52i9HFX60P9qu0MDQg+4XFhamsLAwvfzyy1q8eLHHSZIlaeXKlQoODtYbb7yhyMhI/fd//7fOOOMMFRQUKCYmRu3t7TrnnHN0//33KzAwUH/60590/vnnKz8/X+np6XrppZc0d+5cXX/99bruuuskSTExMXr44Ye1bt26oaGDBsOgQ72+J5s3b9a//uu/uqw78cQT9dxzz2nbtm1auHChiouL9frrr7vt58lvfvMb3X777brnnnv01ltv6Wc/+5ny8vJ05plnuu27detWLVq0SG+//baOPvpol5Bj4cKFqqioUElJiTIyMg56XQAAAACY6Ag1AACYhAzDUGpEqgJSAtx+G6R3oFfFTcX7qjsaClTQaP65tqNWNe01qmmv0QelH7ic08/wU2Z0pltlx8zYmUoOT2Y4Kxwxq9Wqp59+Wtddd52eeOIJHXfccTrttNN0+eWXD807sHnzZm3btk12u30o9Piv//ovvfzyy/rrX/+q66+/XnPnznWpmrjvvvv0t7/9Ta+88opWr16tmJgY+fn5KTw8XImJiUP7RUZGyjAMl3UHGs31D9Tc3KyWlhYlJye7rL/iiitUX1+vk08+eWioqB/96Ee6/fbbD9pXJ510km691aySycvL00cffaQNGzZ4DDXi4+MlSbGxsW73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Zg0EAAAAMLWlpaVp06ZNbuvffvttpaWl+aBFAAAAACaqw67UuPDCC3XJJZfoRz/6kZqbm7Vo0SL5+/urvr5eDz30kG644YaxbCcAAACAKernP/+5fvrTn2rHjh068cQTJUkfffSRnn76af32t7/1cesAAAAATCSHXanx+eef65RTTpEk/fWvf1VCQoJKS0v1pz/9SY888siYNRAAAADA1HbDDTfoz3/+s77++mvdeOONuvHGG7Vz5069+OKL+uEPf+jr5gEAAACYQA67UqOzs1Ph4eGSpH/+85+65JJLZLFYtHjxYpWWlo5ZAwEAAABMfRdffLEuvvhiXzcDAAAAwAR32JUaOTk5evnll1VeXq633npLZ511liTJbrcrIiJizBoIAAAAAAAAAAAgHUGlxrp163TFFVfopptu0ve+9z0tWbJEklm1MX/+/DFrIAAAAICpJyYmRgUFBYqLi1N0dLQMwxh238bGRi+2DAAAAMBEdtihxqWXXqqTTz5Z1dXVmjt37tD6M844g7JxAAAAACPasGHD0HC2GzZsGDHUAAAAAIBBhx1qSFJiYqISExNVUVEhSUpNTdXChQvHpGEAAAAApq6rr7566M+rVq3yXUMAAAAATCqHPaeGw+HQvffeq8jISM2YMUMzZsxQVFSU7rvvPjkcjrFsIwAAAIApzM/PT3a73W19Q0OD/Pz8fNAiAAAAABPVYVdq3HHHHXryySf161//WieddJIkafPmzbr77rvV3d2t+++/f8waCQAAAGDqcjqdHtf39PQoICDAy60BAAAAMJEddqjxzDPP6A9/+IMuuOCCoXXHHnusUlJS9OMf/5hQAwAAAMCIHnnkEUmSYRj6wx/+oLCwsKFtAwMD+uCDDzRr1ixfNQ8AAADABHTYoUZjY6PHF4xZs2apsbHxiBoFAAAAYOrbsGGDJLNS44knnnAZaiogIEAZGRl64oknfNU8AAAAABPQYYcac+fO1aOPPjr021WDHn30UR177LFH3DAAAAAAU9vevXslSaeffrpeeuklRUdH+7hFAAAAACa6ww41HnzwQZ177rl6++23tWTJEknSli1bVF5ertdff33MGggAAABganv33Xd93QQAAAAAk8RhhxqnnXaaCgoK9Nhjj2n37t2SpEsuuUTXX3+9fvnLX+qUU04Zs0YCAAAAmNoqKir0yiuvqKysTL29vS7bHnroIR+1CgAAAMBEc9ihhiQlJye7TQj+5Zdf6sknn9T//M//HFHDAAAAAEwPmzZt0gUXXKCsrCzt3r1bxxxzjEpKSuR0OnXcccf5unkAAAAAJhCLrxsgSY899pgyMjIUFBSkRYsWadu2bcPu+9JLL2nBggWKiopSaGio5s2bp2effdZlH6fTqXXr1ikpKUnBwcFatmyZCgsLXfbJyMiQYRguy69//etxuT8AAAAAw7vtttt088036+uvv1ZQUJD+7//+T+Xl5TrttNO0cuXKQz4f7xcAAADA1OXzUOPFF1/UmjVrdNddd+nzzz/X3LlztXz5ctntdo/7x8TE6I477tCWLVv01Vdf6ZprrtE111yjt956a2ifBx98UI888oieeOIJbd26VaGhoVq+fLm6u7tdznXvvfequrp6aPnJT34yrvcKAAAAwN2uXbt01VVXSZKsVqu6uroUFhame++9Vw888MAhnYv3CwAAAGBqO6Lhp8bCQw89pOuuu07XXHONJOmJJ57Qa6+9pqeeekq33nqr2/5Lly51+fvPfvYzPfPMM9q8ebOWL18up9Ophx9+WHfeeacuvPBCSdKf/vQnJSQk6OWXX9bll18+dGx4eLgSExNH1c6enh719PQM/b21tVWS5HA45HA4Dumex4LD4ZDT6fTJtTEx8AyAZwA8A+AZmN4mwr//WF07NDR0aB6NpKQk7dmzR0cffbQkqb6+/pDOxfvF9DMRvhemC/rae+hr76K/vYe+9h762nvo67Ez2j485FDjkksuGXF7c3PzqM/V29ur7du367bbbhtaZ7FYtGzZMm3ZsuWgxzudTr3zzjvKz88f+g2uvXv3qqamRsuWLRvaLzIyUosWLdKWLVtcXjp+/etf67777lN6erquuOIK3XTTTbJaPXfJ+vXrdc8997itr6urc/sNLW9wOBxqaWmR0+mUxeLzghv4AM8AeAbAMwCegeltIvz7t7W1jcl5Fi9erM2bN+uoo47SOeeco5///Of6+uuv9dJLL2nx4sWjPg/vF9PTRPhemC7oa++hr72L/vYe+tp76Gvvoa/HzmjfLw451IiMjDzo9sHS8YOpr6/XwMCAEhISXNYnJCRo9+7dwx7X0tKilJQU9fT0yM/PT7///e915plnSpJqamqGznHgOQe3SdJPf/pTHXfccYqJidHHH3+s2267TdXV1XrooYc8XvO2227TmjVrhv7e2tqqtLQ0xcfHKyIiYlT3O5YcDocMw1B8fDzfLNMUzwB4BsAzAJ6B6W0i/PsHBQWNyXkeeughtbe3S5Luuecetbe368UXX1Rubu6wn8894f1iepoI3wvTBX3tPfS1d9Hf3kNfew997T309dgZ7fvFIYcaf/zjHw+5MWMtPDxcO3bsUHt7uzZt2qQ1a9YoKyvLrXR8JPu/QBx77LEKCAjQD3/4Q61fv16BgYFu+wcGBnpcb7FYfPawGobh0+vD93gGwDMAngHwDExvvv73H6vrZmVlDf05NDRUTzzxxJicd7R4v5j8fP29MJ3Q195DX3sX/e099LX30NfeQ1+PjdH2n0/n1IiLi5Ofn59qa2td1tfW1o44Fq3FYlFOTo4kad68edq1a5fWr1+vpUuXDh1XW1urpKQkl3POmzdv2HMuWrRI/f39Kikp0cyZM4/grgAAAAD4Au8XAAAAwNTn0+goICBAxx9/vDZt2jS0zuFwaNOmTVqyZMmoz+NwOIYm2cvMzFRiYqLLOVtbW7V169YRz7ljxw5ZLBbZbLbDuBMAAAAAh8tiscjPz2/YZbR4vwAAAACmPp9WakhmmfbVV1+tBQsWaOHChXr44YfV0dGha665RpJ01VVXKSUlRevXr5dkTqi3YMECZWdnq6enR6+//rqeffZZPf7445LMUp8bb7xRv/zlL5Wbm6vMzEytXbtWycnJuuiiiyRJW7Zs0datW3X66acrPDxcW7Zs0U033aR/+Zd/UXR0tE/6AQAAAJiu/va3v7n8va+vT1988YWeeeYZj5Npj4T3CwAAAGBq83mocdlll6murk7r1q1TTU2N5s2bpzfffHNoIr6ysjKXsbQ6Ojr04x//WBUVFQoODtasWbP03HPP6bLLLhva5xe/+IU6Ojp0/fXXq7m5WSeffLLefPPNoYlGAgMD9ec//1l33323enp6lJmZqZtuusllHFwAAAAA3nHhhRe6rbv00kt19NFH68UXX9S111476nPxfgEAAABMbYbT6XT6uhGTUWtrqyIjI9XS0qKIiAivX9/hcMhut8tmszEBzTTFMwCeAfAMgGdgepsI//7j/Zm4uLhYxx57rNrb28f83BONr98vJrOJ8L0wXdDX3kNfexf97T30tffQ195DX4+d0X4mppcBAAAATDhdXV165JFHlJKS4uumAAAAAJhAfD78FAAAAIDpLTo6WoZhDP3d6XSqra1NISEheu6553zYMgAAAAATDaEGAAAAAJ/asGGDS6hhsVgUHx+vRYsWMdE2AAAAABeEGgAAAAB8atWqVb5uAgAAAIBJglADAAAAgNd99dVXo9732GOPHceWAAAAAJhMCDUAAAAAeN28efNkGIacTueI+xmGoYGBAS+1CgAAAMBER6gBAAAAwOv27t3r6yYAAAAAmIQINQAAAAB43YwZM3zdBAAAAACTEKEGAAAAgAnh22+/VVlZmXp7e13WX3DBBT5qEQAAAICJhlADAAAAgE8VFxfr4osv1tdff+0yz4ZhGJLEnBoAAAAAhlh83QAAAAAA09vPfvYzZWZmym63KyQkRN98840++OADLViwQO+9956vmwcAAABgAqFSAwAAAIBPbdmyRe+8847i4uJksVhksVh08skna/369frpT3+qL774wtdNBAAAADBBUKkBAAAAwKcGBgYUHh4uSYqLi1NVVZUkczLx/Px8XzYNAAAAwARDpQYAAAAAnzrmmGP05ZdfKjMzU4sWLdKDDz6ogIAA/c///I+ysrJ83TwAAAAAEwihBgAAAACfuvPOO9XR0SFJuvfee3XeeefplFNOUWxsrF588UUftw4AAADARMLwUwAAAAB8avny5brkkkskSTk5Odq9e7fq6+tlt9v1ve99z8etw/5WrVolwzBkGIb8/f2VmZmpX/ziF+ru7h7ap7GxUVdeeaUiIiIUFRWla6+9Vu3t7T5sNQAAAKYSQg0AAAAAPvXcc88NVWoMiomJkWEYPmoRRnL22WerurpaxcXF2rBhg/77v/9bd91119D2K6+8Ut988402btyoV199VR988IGuv/56H7YYAAAAUwmhBgAAAACfuummm5SQkKArrrhCr7/+ugYGBnzdJIwgMDBQiYmJSktL00UXXaRly5Zp48aNkqRdu3bpzTff1B/+8ActWrRIJ598sn73u9/pz3/+89AE8AAAAMCRINQAAAAA4FPV1dX685//LMMw9IMf/EBJSUn6j//4D3388ce+bhoOYufOnfr4448VEBAgSdqyZYuioqK0YMGCoX2WLVsmi8WirVu3+qqZAAAAmEKYKBwAAACAT1mtVp133nk677zz1NnZqb/97W964YUXdPrppys1NVV79uzxdROxn1dffVVhYWHq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ba3L+traWiUmJg57nMViUU5OjiRp3rx52rVrl9avX6+lS5cOHVdbW6ukpCSXc86bN0+SlJiYKLvd7nLO/v5+NTY2jnhdAADgHSEh0qxZ5uJJT49UXj586FFRIfX2SkVF5uKJn585fNZwoUdqqhmMAJg8eL8AAAAApj6fhhoBAQE6/vjjtWnTJl100UWSzHKdTZs2afXq1aM+j8PhGJpkLzMzU4mJidq0adPQS0Zra6u2bt2qG264QZK0ZMkSNTc3a/v27Tr++OMlSe+8844cDocWLVo0djcIAADGRWCglJNjLp709UmVlcOHHuXl5j4lJeby/vvu5zAMKSVl+NAjPV2aYCPvANMe7xcAAADA1OfzQRfWrFmjq6++WgsWLNDChQv18MMPq6OjQ9dcc40k6aqrrlJKSorWr18vyZxQb8GCBcrOzlZPT49ef/11Pfvss3r88cclmaU+N954o375y18qNzdXmZmZWrt2rZKTk4debI466iidffbZuu666/TEE0+or69Pq1ev1uWXX67k5GSf9AMAABg7/v5m8JCRIZ12mvv2gQFzCKvhQo/SUrMapKLCXD76yPN1EhOHDz1mzJBCQ8fn/gAMj/cLAAAA4NCtWrVKzzzzjCRzfrjU1FStXLlS995779BcF42NjfrJT36if/zjH7JYLFqxYoV++9vfKiwszKtt9Xmocdlll6murk7r1q1TTU2N5s2bpzfffHNoIr6ysjKXsbQ6Ojr04x//WBUVFQoODtasWbP03HPP6bLLLhva5xe/+IU6Ojp0/fXXq7m5WSeffLLefPNNl4lGnn/+ea1evVpnnHHG0D/AI4884r0bBwAAPuPnZw4vlZoqnXSS+3aHQ7LbRw49Ojqkmhpz2brV83Xi4kYOPSIjx+sOgemL9wsAAADg8Jx99tn64x//qL6+Pm3fvl1XX321DMPQAw88IEm68sorVV1drY0bN6qvr0/XXHONrr/+er3wwgtebafhdDqdXr3iFNHa2qrIyEi1tLQoIiLC69d3OByy2+2y2WxMQDNN8QyAZwA8A77jdEoNDcOHHiUlUmvrwc8TFTVy6BETYw6DNRyegeltIvz7+/oz8VRCXx6+ifC9MF3Q195DX3sX/e099LX30NfeM1X6etWqVWpubtbLL788tG7FihXau3evPv/8c+3atUuzZ8/Wp59+qgULFkiS3nzz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NMaERn1asmQJfv/99/puhlJWVhbWr19f7YQGERERPTtOnrwPuVxAfr4ciYlZNapLKhUjISELf/+djA4dyh7Jqk18t0NERERERPSMqWpigwmNqnN1dcXUqVPruxlKr7/+en03gYiIiBqIoUNboFOn2ktA6OrqoGVLy1qrr6aY1CAiIiIiInoGVTaxwYQGERER0bNFJtNFu3Y29d2MOtMwJvkiIiIiIiKiclVnOcSKFg9nQoNK4pKbRERE1BgwqUFERERERNSA6erqAgCys7OrdXxZiQ0mNKi0/Px8AIBYXLeLgBIRERHVBKefIiIiIiIiasDEYjHMzMyQlJQEADAwMKhWAmJIuyEoKCjAyoiViEqMgkxXhpC+IRjSbgjy8vJqu9laIwgCCgsLIZFImJipAblcjsePH8PAwICLjRMREVGDxncqREREREREDZydnR0AKBMb1eVn6YdhPsOw49oOBPkEwc/SD3FxcbXQwvojCALkcjl0dHSY1KghHR0dODs7M45ERETUoDGpQURERERE1MCJRCLY29vDxsYGBQUFNarrPbf3MLTnUFgbWT8TH17L5XI8efIElpaW0NHhDMs1IZVKGUMiIiJq8JjUICIiIiIiaiTEYnGtrHfgLHOuhdY0DHK5HLq6utDX1+cH8kRERERNAN/xERERERERERERERFRo8CkBhERERERERERERERNQpMahARERERERERERERUaPANTWqSRAEAEB6enq9nF8ulyMjI4PzxjZh7APEPkDsA8Q+0LQ1hOdf8V5Y8d6Yqq++7y8as4bwb6GpYKy1h7HWLsZbexhr7WGstYexrj2Vvb9gUqOaMjIyAABOTk713BIiIiIiovqVkZEBU1PT+m5Go8b7CyIiIiKiYhXdX4gEfq2qWuRyOR4+fAhjY2OIRCKtnz89PR1OTk64d+8eTExMtH5+qn/sA8Q+QOwDxD7QtDWE518QBGRkZMDBwYHfSquh+r6/aMwawr+FpoKx1h7GWrsYb+1hrLWHsdYexrr2VPb+giM1qklHRwfNmjWr72bAxMSE/1iaOPYBYh8g9gFiH2ja6vv55wiN2tFQ7i8as/r+t9CUMNbaw1hrF+OtPYy19jDW2sNY147K3F/w61RERERERERERERERNQoMKlBRERERERERERERESNApMajZSenh7mz58PPT29+m4K1RP2AWIfIPYBYh9o2vj8ExXjvwXtYay1h7HWLsZbexhr7WGstYex1j4uFE5ERERERERERERERI0CR2oQEREREREREREREVGjwKQGERERERERERERERE1CkxqEBERERERERERERFRo8CkBhERERERET0zevfujZCQkPpuRpPAWGuXq6srVq5cWd/NaBIYa+3h64j2MNbaw1jXPSY1GrDVq1fD1dUV+vr68PPzw7lz58otv2PHDrRo0QL6+vrw8fHB/v37tdRSqitV6QNr1qxBjx49YG5uDnNzc/j7+1fYZ6jhq+rrgMLWrVshEokwePDgum0g1bmq9oHU1FRMnjwZ9vb20NPTQ/Pmzfn/QSNW1ed/5cqV8Pb2hkwmg5OTE95//33k5uZqqbVU2/7v//4PgYGBcHBwgEgkwq5duyo8JjIyEh07doSenh48PT2xYcOGOm8nUU08ePAAb7/9NiwtLSGTyeDj44MLFy4o9wuCgHnz5sHe3h4ymQz+/v6Ijo6u0TkXLFgAkUik/DE1NUWPHj1w4sSJml5Og1ZRrEePHq0SF5FIhAEDBtTonE011q6urmqxFIlEmDx5srJMbm4uJk+eDEtLSxgZGWHIkCF49OhRjc5b+jm0tLTEgAEDcPXq1ZpeUoNVmVj37t1bbf/EiRNrdN6mGOuioiKEhobCzc0NMpkMHh4e+OyzzyAIgrIMX7NrR2Vizdfs2pGRkYGQkBC4uLhAJpOhW7duOH/+vEoZ9uuGiUmNBmrbtm2YPn065s+fj7/++gvt2rVDQEAAkpKSNJY/c+YMhg4dinHjxuHSpUsYPHgwBg8ejOvXr2u55VRbqtoHIiMjMXToUBw/fhxnz56Fk5MT+vfvjwcPHmi55VRbqtoHFOLi4jBjxgz06NFDSy2lulLVPpCfn49+/fohLi4OO3fuRFRUFNasWQNHR0ctt5xqQ1Wf/82bN2PWrFmYP38+bt68ibVr12Lbtm2YM2eOlltOtSUrKwvt2rXD6tWrK1U+NjYWAwcORJ8+fXD58mWEhIRg/PjxOHToUB23lKh6UlJS0L17d+jq6uLAgQO4ceMGli1bBnNzc2WZxYsX43//+x++++47/PnnnzA0NERAQECNE7atW7dGQkICEhIScPbsWXh5eeHll19GWlpaTS+rQapMrAFgwIAByrgkJCRgy5YtNT53U4s1AJw/f14ljkeOHAEABAUFKcu8//77+P3337Fjxw6cOHECDx8+xGuvvVbjc5d8DiMiIiCRSPDyyy/XuN6GqjKxBoDg4GCVcosXL67xuZtarBctWoSwsDCsWrUKN2/exKJFi7B48WJ88803yjJ8za4dlYk1wNfs2jB+/HgcOXIEP/30E65du4b+/fvD399f5bM09usGSqAGqUuXLsLkyZOVj4uKigQHBwfhyy+/1Fj+jTfeEAYOHKiyzc/PT3jnnXfqtJ1Ud6raB0orLCwUjI2NhY0bN9ZVE6mOVacPFBYWCt26dRN+/PFHYdSoUcKgQYO00FKqK1XtA2FhYYK7u7uQn5+vrSZSHarq8z958mThhRdeUNk2ffp0oXv37nXaTtIOAMJvv/1WbpmPPvpIaN26tcq2N998UwgICKjDlhFV38yZM4Xnn3++zP1yuVyws7MTlixZotyWmpoq6OnpCVu2bCnzuF69egnTpk1TPt67d69gYmIi/Pzzz4IgCML8+fOFdu3aqRxz7949AYBw7ty56l1MA1dRrAVBqNZ7R8a6cqZNmyZ4eHgIcrlcEITifqyrqyvs2LFDWebmzZsCAOHs2bNl1uPi4iKsWLFC+XjNmjWCqampcPToUUEQND+HJ0+eFAAISUlJtXdBDVjpWAuCej+tDMZa3cCBA4WxY8eqbHvttdeE4cOHC4LA1+zaVFGsBYGv2bUhOztbEIvFwt69e1W2d+zYUZg7d64gCOzXDRlHajRA+fn5uHjxIvz9/ZXbdHR04O/vj7Nnz2o85uzZsyrlASAgIKDM8tSwVacPlJadnY2CggJYWFjUVTOpDlW3D3z66aewsbHBuHHjtNFMqkPV6QN79uxB165dMXnyZNja2qJNmzZYuHAhioqKtNVsqiXVef67deuGixcvKqeounPnDvbv34+XXnpJK22m+sf3g9TY7NmzB76+vggKCoKNjQ06dOiANWvWKPfHxsYiMTFRpV+bmprCz8+v0v168+bNGDp0KMLDwzF8+HCNZfLy8rB+/XqYmZnB29u7ZhfVQFUUa4XIyEjY2NjA29sb7777Lp48eVLpczDWmuXn5+Pnn3/G2LFjIRKJAAAXL15EQUGBSt9u0aIFnJ2dK923Fy9ejFmzZuHw4cPo27evxjKZmZn4+eef4enpCUtLy5pfTAOnKdYK4eHhsLKyQps2bTB79mxkZ2dXul7Guli3bt0QERGBW7duAQCuXLmCU6dO4cUXXwTA1+zaVFGsFfiaXTOFhYUoKiqCvr6+ynaZTIZTp04BYL9uyCT13QBSl5ycjKKiItja2qpst7W1xT///KPxmMTERI3lExMT66ydVHeq0wdKmzlzJhwcHNQ+3KDGoTp94NSpU1i7di0uX76shRZSXatOH7hz5w6OHTuG4cOHY//+/bh9+zYmTZqEgoICzJ8/XxvNplpSned/2LBhSE5OxvPPPw9BEFBYWIiJEydy+qkmpKz3g+np6cjJyYFMJqunlhFpdufOHYSFhWH69OmYM2cOzp8/j/feew9SqRSjRo1S3stU9z5n9erVmDt3Ln7//Xf06tVLZd+1a9dgZGQEoPjLQMbGxti2bRtMTExq6eoalopiDRRPY/Laa6/Bzc0NMTExmDNnDl588UWcPXsWYrG43PoZ67Lt2rULqampGD16tHJbYmIipFIpzMzMVMpWtm/PnDkTP/30E06cOIHWrVur7Nu7d68y3llZWbC3t8fevXuho/Psf6dVU6yB4vdILi4ucHBwwNWrVzFz5kxERUXh119/rbBOxvo/s2bNQnp6Olq0aAGxWIyioiJ88cUXyg9p+ZpdeyqKNcDX7NpgbGyMrl274rPPPkPLli1ha2uLLVu24OzZs/D09ATAft2QMalB9Az66quvsHXrVkRGRqplnOnZlJGRgREjRmDNmjWwsrKq7+ZQPZHL5bCxscEPP/wAsViMTp064cGDB1iyZAmTGk1AZGQkFi5ciG+//RZ+fn64ffs2pk2bhs8++wyhoaH13TwiIjVyuRy+vr5YuHAhAKBDhw64fv06vvvuO+UH7dW1c+dOJCUl4fTp0+jcubPafm9vb+zZswdA8fuobdu2ISgoCMePH4evr2+Nzt0QVSbWb731lrK8j48P2rZtCw8PD0RGRpb57XSAsa7I2rVr8eKLL8LBwaFW6lu2bBmysrJw4cIFuLu7q+3v06cPwsLCABSvpfLtt9/ixRdfxLlz5+Di4lIrbWioyor1hAkTlH/7+PjA3t4effv2RUxMDDw8PMqsj7FWtX37doSHh2Pz5s1o3bq1cv0uBwcHvmbXssrEmq/ZteOnn37C2LFj4ejoCLFYjI4dO2Lo0KG4ePFijetmrOvWs5k+buSsrKwgFovx6NEjle2PHj2CnZ2dxmPs7OyqVJ4atur0AYWlS5fiq6++wuHDh9G2bdu6bCbVoar2gZiYGMTFxSEwMBASiQQSiQSbNm3Cnj17IJFIEBMTo62mUy2pzuuAvb09mjdvrvLNnJYtWyIxMRH5+fl12l6qXdV5/kNDQzFixAiMHz8ePj4+ePXVV7Fw4UJ8+eWXkMvl2mg21bOy3g+amJhwlAY1SPb29mjVqpXKtpYtWyI+Ph4AlK931XlP3KFDB1hbW2PdunUQBEFtv1QqhaenJzw9PdGhQwd89dVXcHR0xMqVK2twRQ1XRbHWxN3dHVZWVrh9+3a5dTPWZbt79y6OHj2K8ePHq2y3s7NDfn4+UlNTVbZXpm/36NEDRUVF2L59u8b9hoaGynh37twZP/74I7KysjRON/YsKSvWmvj5+QFAhX2bsVb14YcfYtasWXjrrbfg4+ODESNG4P3338eXX34JgK/ZtamiWGvC1+zq8fDwwIkTJ5CZmYl79+7h3LlzKCgoUCYy2a8bLiY1GiCpVIpOnTohIiJCuU0ulyMiIgJdu3bVeEzXrl1VygPAkSNHyixPDVt1+gBQPNfnZ599hoMHDzKr28hVtQ+0aNEC165dw+XLl5U/r7zyCvr06YPLly/DyclJm82nWlCd14Hu3bvj9u3bKh9g37p1C/b29pBKpXXeZqo91Xn+s7Oz1aY7UCS4NL2JpmcP3w9SY9O9e3dERUWpbLt165byG85ubm6ws7NT6dfp6en4888/K+zXHh4eOH78OHbv3o2pU6dWqj1isRg5OTlVvIrGoaJYa3L//n08efIE9vb25dbNWJdt/fr1sLGxwcCBA1W2d+rUCbq6uip9OyoqCvHx8RX27S5duuDAgQNYuHAhli5dWmEbRCIRdHR0nvl4lxVrTRTT9VbUtxlrVWW911Tce/A1u/ZUFGtN+JpdM4aGhrC3t0dKSgoOHTqEQYMGAWC/bsg4/VQDNX36dIwaNQq+vr7o0qULVq5ciaysLIwZMwYAMHLkSDg6OiqztNOmTUOvXr2wbNkyDBw4EFu3bsWFCxfwww8/1OdlUA1UtQ8sWrQI8+bNw+bNm+Hq6qqc28/IyEg5Rx81LlXpA/r6+mjTpo3K8Yo5ektvp8ajqq8D7777LlatWoVp06Zh6tSpiI6OxsKFC/Hee+/V52VQNVX1+Q8MDMTy5cvRoUMH5fRToaGhCAwMrHBeXWqYMjMzVb5tFxsbi8uXL8PCwgLOzs6YPXs2Hjx4gE2bNgEAJk6ciFWrVuGjjz7C2LFjcezYMWzfvh379u2rr0sgKtf777+Pbt26YeHChXjjjTdw7tw5/PDDD8p7GJFIhJCQEHz++efw8vKCm5sbQkND4eDggMGDB1dYf/PmzXH8+HH07t0bEolE5ZuPhYWFyvfLiikfbty4gZkzZ9bFpda7imKdmZmJTz75BEOGDIGdnR1iYmLw0UcfwdPTEwEBARXWz1irk8vlWL9+PUaNGgWJRPWjF1NTU4wbNw7Tp0+HhYUFTExMMHXqVHTt2hXPPfdchXV369YN+/fvx4svvgiJRIKQkBDlvry8PGW8U1JSsGrVKmRmZiIwMLBWr68hKS/WMTEx2Lx5M1566SVYWlri6tWreP/999GzZ89KzWzAWP8nMDAQX3zxBZydndG6dWtcunQJy5cvx9ixYwHwNbs2VRRrvmbXnkOHDkEQBHh7e+P27dv48MMP0aJFC+U9F/t1AyZQg/XNN98Izs7OglQqFbp06SL88ccfyn29evUSRo0apVJ++/btQvPmzQWpVCq0bt1a2Ldvn5ZbTLWtKn3AxcVFAKD2M3/+fO03nGpNVV8HSho1apQwaNCgum8k1amq9oEzZ84Ifn5+gp6enuDu7i588cUXQmFhoZZbTbWlKs9/QUGBsGDBAsHDw0PQ19cXnJychEmTJgkpKSnabzjViuPHj2v8v13xvI8aNUro1auX2jHt27cXpFKp4O7uLqxfv17r7Saqit9//11o06aNoKenJ7Ro0UL44YcfVPbL5XIhNDRUsLW1FfT09IS+ffsKUVFR5dbZq1cvYdq0acrHN27cEGxsbITp06cLgiAI8+fPV/k3ZWBgIPj4+AhhYWG1fn0NSXmxzs7OFvr37y9YW1sLurq6gouLixAcHCwkJiaWWydjXbZDhw4JAMrsrzk5OcKkSZMEc3NzwcDAQHj11VeFhISEcut0cXERVqxYoXx84sQJwdDQUPjf//4nCELx/wsl421sbCx07txZ2LlzZ61dV0NUXqzj4+OFnj17ChYWFoKenp7g6ekpfPjhh0JaWlq5dTLW6tLT04Vp06YJzs7Ogr6+vuDu7i7MnTtXyMvLU5bha3btqCjWfM2uPdu2bRPc3d0FqVQq2NnZCZMnTxZSU1NVyrBfN0wiQeB8BERERERERERERERE1PBxTQ0iIiIiIiIiIiIiImoUmNQgIiIiIiIiIiIiIqJGgUkNIiIiIiIiIiIiIiJqFJjUICIiIiIiIiIiIiKiRoFJDSIiIiIiIiIiIiIiahSY1CAiIiIiIiIiIiIiokaBSQ0iIiIiIiIiIiIiImoUmNQgIiIiIiIiIiIiIqJGgUkNIiIiAL1790ZISEh9N4OIiIiI6JnG992VN2LECCxcuLBOz3Hjxg00a9YMWVlZdXoeIqLaxKQGERFpzejRoyESiSASiaCrqws3Nzd89NFHyM3Nre+mERERERE1eSXfr0ulUnh6euLTTz9FYWFhvbUpLi4OIpEIYrEYDx48UNmXkJAAiUQCkUiEuLi4+mlgHbly5Qr279+P9957T7mtd+/eEIlE+Oqrr9TKDxw4ECKRCAsWLFArr/ixtbVFUFAQ7t69qyzTqlUrPPfcc1i+fHmdXg8RUW1iUoOIiLRqwIABSEhIwJ07d7BixQp8//33mD9/fn03i4iIiIiI8N/79ejoaHzwwQdYsGABlixZUt/NgqOjIzZt2qSybePGjXB0dKynFlUsPz+/2sd+8803CAoKgpGRkcp2JycnbNiwQWXbgwcPEBERAXt7e7V6goODkZCQgIcPH2L37t24d+8e3n77bZUyY8aMQVhYWL0mr4iIqoJJDSIi0io9PT3Y2dnByckJgwcPhr+/P44cOQIAyMvLw3vvvQcbGxvo6+vj+eefx/nz55XHbtiwAWZmZir17dq1CyKRSPl4wYIFaN++PX766Se4urrC1NQUb731FjIyMpRlsrKyMHLkSBgZGcHe3h7Lli2r24smIiIiImokFO/XXVxc8O6778Lf3x979uwBUPx+fcaMGXB0dIShoSH8/PwQGRmpPPbJkycYOnQoHB0dYWBgAB8fH2zZsqXc8+3btw+mpqYIDw8vt9yoUaOwfv16lW3r16/HqFGj1Mpev34dL774IoyMjGBra4sRI0YgOTlZub93796YOnUqQkJCYG5uDltbW6xZswZZWVkYM2YMjI2N4enpiQMHDqjUe+LECXTp0gV6enqwt7fHrFmzVBIBvXv3xpQpUxASEgIrKysEBARg7NixePnll1XqKSgogI2NDdauXavxWouKirBz504EBgaq7Xv55ZeRnJyM06dPK7dt3LgR/fv3h42NjVp5AwMD2NnZwd7eHs899xymTJmCv/76S6VMv3798PTpU5w4cUJje4iIGhomNYiIqN5cv34dZ86cgVQqBQB89NFH+OWXX7Bx40b89ddf8PT0REBAAJ4+fVqlemNiYrBr1y7s3bsXe/fuxYkTJ1SGaH/44Yc4ceIEdu/ejcOHDyMyMlLtjT0REREREQEymUw54mDKlCk4e/Ystm7diqtXryIoKAgDBgxAdHQ0ACA3NxedOnXCvn37cP36dUyYMAEjRozAuXPnNNa9efNmDB06FOHh4Rg+fHi57XjllVeQkpKCU6dOAQBOnTqFlJQUtQ/+U1NT8cILL6BDhw64cOECDh48iEePHuGNN95QKbdx40ZYWVnh3LlzmDp1Kt59910EBQWhW7du+Ouvv9C/f3+MGDEC2dnZAIpHQ7z00kvo3Lkzrly5grCwMKxduxaff/65Wr1SqRSnT5/Gd999h/Hjx+PgwYNISEhQltm7dy+ys7Px5ptvarzWq1evIi0tDb6+vmr7pFIphg8frpLg2bBhA8aOHVtu/ADg6dOn2L59O/z8/NTqbN++PU6ePFlhHUREDQGTGkREpFV79+6FkZER9PX14ePjg6SkJHz44YfIyspCWFgYlixZghdffBGtWrXCmjVrIJPJyvwGU1nkcjk2bNiANm3aoEePHhgxYgQiIiIAAJmZmVi7di2WLl2Kvn37wsfHBxs3buRQayIiIiKiEgRBwNGjR3Ho0CG88MILiI+Px/r167Fjxw706NEDHh4emDFjBp5//nnlB+yOjo6YMWMG2rdvD3d3d0ydOhUDBgzA9u3b1epfvXo1Jk2ahN9//11tJIMmurq6ePvtt7Fu3ToAwLp16/D2229DV1dXpdyqVavQoUMHLFy4EC1atECHDh2wbt06HD9+HLdu3VKWa9euHT7++GN4eXlh9uzZ0NfXh5WVFYKDg+Hl5YV58+bhyZMnuHr1KgDg22+/hZOTE1atWoUWLVpg8ODB+OSTT7Bs2TLI5XJlvV5eXli8eDG8vb3h7e2Nbt26wdvbGz/99JOyzPr16zVOLaVw9+5diMVijSMvAGDs2LHYvn07srKy8H//939IS0srM4bffvstjIyMYGhoCEtLS0RFRSljWJKDg4PKWhtERA2ZpL4bQERETUufPn0QFhaGrKwsrFixAhKJBEOGDMHVq1dRUFCA7t27K8vq6uqiS5cuuHnzZpXO4erqCmNjY+Vje3t7JCUlASgexZGfn6/y7SQLCwt4e3vX8MqIiIiIiBo/xZeQCgoKIJfLMWzYMCxYsACRkZEoKipC8+bNVcrn5eXB0tISQPG0SQsXLsT27dvx4MED5OfnIy8vDwYGBirH7Ny5E0lJSTh9+jQ6d+5c6baNHTsW3bp1w8KFC7Fjxw6cPXtW7ctJV65cwfHjxzUmDGJiYpTtb9u2rXK7WCyGpaUlfHx8lNtsbW0BQHkfcfPmTXTt2lVl6tvu3bsjMzMT9+/fh7OzMwCgU6dOaucdP348fvjhB3z00Ud49OgRDhw4gGPHjpV5nTk5OdDT01M5V0nt2rWDl5cXdu7ciePHj2PEiBGQSDR/xDd8+HDMnTsXAPDo0SMsXLgQ/fv3x8WLF1XumWQymXJUChFRQ8ekBhERaZWhoSE8PT0BFH+7ql27dli7dm2lbmZ0dHQgCILKtoKCArVypb+tJRKJVL49RUREREREmim+hCSVSuHg4KD8sDwzMxNisRgXL16EWCxWOUaRQFiyZAm+/vprrFy5Ej4+PjA0NERISIjagtkdOnTAX3/9hXXr1sHX17fMD+9L8/HxQYsWLTB06FC0bNkSbdq0weXLl1XKZGZmIjAwEIsWLVI7vuRC2pruGUpuU7SpqvcRhoaGattGjhyJWbNm4ezZszhz5gzc3NzQo0ePMuuwsrJCdnY28vPzlVP1ljZ27FisXr0aN27cKHN6LwAwNTVV3n95enpi7dq1sLe3x7Zt2zB+/HhluadPn8LDw6Oyl0lEVK84/RQREdUbHR0dzJkzBx9//DE8PDyUc88qFBQU4Pz582jVqhUAwNraGhkZGcjKylKWKX0TUxEPDw/o6urizz//VG5LSUlRGYpORERERNRUKb6E5OzsrPLt/w4dOqCoqAhJSUnw9PRU+bGzswMAnD59GoMGDcLbb7+Ndu3awd3dXeP7bA8PDxw/fhy7d+/G1KlTq9S+sWPHIjIyssw1JDp27Ii///4brq6uau3UlHCorJYtW+Ls2bMqX7I6ffo0jI2N0axZs3KPtbS0xODBg7F+/Xps2LABY8aMKbd8+/btAQA3btwos8ywYcNw7do1tGnTRnm/VBmKhFROTo7K9uvXr6NDhw6VroeIqD4xqUFERPUqKCgIYrEYYWFhePfdd/Hhhx/i4MGDuHHjBoKDg5GdnY1x48YBAPz8/GBgYIA5c+YgJiYGmzdvxoYNG6p0PiMjI4wbNw4ffvghjh07huvXr2P06NHQ0eF/iUREREREZWnevDmGDx+OkSNH4tdff0VsbCzOnTuHL7/8Evv27QNQvJ7EkSNHcObMGdy8eRPvvPMOHj16VGZ9x48fxy+//IKQkJBKtyM4OBiPHz9WGWVQ0uTJk/H06VMMHToU58+fR0xMDA4dOoQxY8agqKioytetMGnSJNy7dw9Tp07FP//8g927d2P+/PmYPn16pe4lxo8fj40bN+LmzZsYNWpUuWWtra3RsWNH5aLompibmyMhIUG5dmBZsrOzkZiYiMTERFy5cgXvvvsu9PX10b9/f2WZuLg4PHjwAP7+/hVeBxFRQ8BPcIiIqF5JJBJMmTIFixcvxhdffIEhQ4ZgxIgR6NixI27fvo1Dhw7B3NwcQPHaFz///DP2798PHx8fbNmyBQsWLKjyOZcsWYIePXogMDAQ/v7+eP755zXOfUtERERERP9Zv349Ro4ciQ8++ADe3t4YPHgwzp8/r1xP4uOPP0bHjh0REBCA3r17w87ODoMHDy6zPm9vbxw7dgxbtmzBBx98UKk2SCQSWFlZlbmGhIODA06fPo2ioiL0798fPj4+CAkJgZmZWY2+yOTo6Ij9+/fj3LlzaNeuHSZOnIhx48bh448/rtTx/v7+sLe3R0BAABwcHCosP378eISHh5dbxszMrMLRJ2vWrIG9vT3s7e3Rp08fJCcnY//+/SprCm7ZsgX9+/eHi4tLpa6FiKi+iYTSk5MTERERERERERFRrcnMzISjoyPWr1+P1157rcLyOTk58Pb2xrZt29C1a9c6a1d+fj68vLywefNmdO/evc7OQ0RUm7hQOBERERERERERUR2Qy+VITk7GsmXLYGZmhldeeaVSx8lkMmzatAnJycl12r74+HjMmTOHCQ0ialQ4UoOIiIiIiIiIiKgOxMXFwc3NDc2aNcOGDRvQt2/f+m4SEVGjx6QGERERERERERERERE1ClwonIiIiIiIiIiIiIiIGgUmNYiIiIiIiIiIiIiIqFFgUoOIiIiIiIiIiIiIiBoFJjWIiIiIiIiIiIiIiKhRYFKDiIiIiIiIiIiIiIgaBSY1iIiIiIiIiIiIiIioUWBSg4iIiIiIiIiIiIiIGgUmNYiIiIiIiIiIiIiIqFH4f44fDEq7f26MAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "==== Performance Summary ====\n", + "\n", + "Memory Usage Comparison:\n", + " 4-bit Avg: 57698.24 MB\n", + " 8-bit Avg: 92521.30 MB\n", + " Difference: 60.4% more memory with 8-bit\n", + "\n", + "Evaluation Loss Comparison:\n", + " 4-bit Avg: 0.3080\n", + " 8-bit Avg: 0.3035\n", + " Difference: 1.4% lower loss with 8-bit\n", + "\n", + "Efficiency Analysis: 4-bit provides better memory efficiency with lower loss\n" + ] + } + ], + "source": [ + "# Plot memory metrics comparison between 4-bit and 8-bit\n", + "print(\"\\n==== Memory Usage Comparison: 4-bit vs 8-bit ====\\n\")\n", + "plot_memory_metrics(flflow_4bit, flflow_8bit)" + ] + }, + { + "cell_type": "markdown", + "id": "19dfbe72", + "metadata": {}, + "source": [ + "## Analysis and Conclusions" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "5da1c53e", + "metadata": {}, + "outputs": [], + "source": [ + "# Utility functions to monitor GPU memory usage\n", + "def get_gpu_memory_info():\n", + " \"\"\"Get current GPU memory usage in MB\"\"\"\n", + " if torch.cuda.is_available():\n", + " # Get the current device\n", + " device = torch.cuda.current_device()\n", + " # Get memory information\n", + " total_memory = torch.cuda.get_device_properties(device).total_memory / 1024**2 # MB\n", + " allocated_memory = torch.cuda.memory_allocated(device) / 1024**2 # MB\n", + " reserved_memory = torch.cuda.memory_reserved(device) / 1024**2 # MB\n", + " free_memory = total_memory - allocated_memory\n", + " \n", + " return {\n", + " \"device\": device,\n", + " \"total_memory_mb\": total_memory,\n", + " \"allocated_memory_mb\": allocated_memory,\n", + " \"reserved_memory_mb\": reserved_memory,\n", + " \"free_memory_mb\": free_memory\n", + " }\n", + " else:\n", + " return {\"device\": \"cpu\", \"error\": \"CUDA not available\"}\n", + "\n", + "class MemoryTracker:\n", + " \"\"\"Track memory usage across training phases\"\"\"\n", + " def __init__(self, collaborator_name, quant_type=\"4bit\"):\n", + " self.collaborator_name = collaborator_name\n", + " self.quant_type = quant_type # Track whether this is 4bit or 8bit\n", + " self.memory_log = {\n", + " \"model_load\": None,\n", + " \"after_trainer_init\": None,\n", + " \"before_training\": None,\n", + " \"after_training\": None,\n", + " \"peak_memory\": None\n", + " }\n", + " self.peak_memory = 0\n", + " self.reset_peak()\n", + " \n", + " def update_peak(self):\n", + " \"\"\"Update peak memory usage\"\"\"\n", + " if torch.cuda.is_available():\n", + " self.peak_memory = torch.cuda.max_memory_allocated() / 1024**2 # MB\n", + " self.memory_log[\"peak_memory\"] = self.peak_memory\n", + " \n", + " def log_memory(self, phase):\n", + " \"\"\"Log memory usage at a specific phase\"\"\"\n", + " if phase in self.memory_log:\n", + " self.memory_log[phase] = get_gpu_memory_info()[\"allocated_memory_mb\"] if torch.cuda.is_available() else 0\n", + " self.update_peak()\n", + " \n", + " def reset_peak(self):\n", + " \"\"\"Reset peak memory stats\"\"\"\n", + " if torch.cuda.is_available():\n", + " torch.cuda.reset_peak_memory_stats()\n", + " \n", + " def report(self):\n", + " \"\"\"Print memory usage report\"\"\"\n", + " print(f\"\\n==== Memory Usage Report for {self.collaborator_name} ====\")\n", + " for phase, memory in self.memory_log.items():\n", + " if memory is not None:\n", + " print(f\"{phase}: {memory:.2f} MB\")\n", + " else:\n", + " print(f\"{phase}: Not measured\")\n", + " print(f\"Quantization type: {self.quant_type}\")\n", + " print(\"=\"*50)\n", + " \n", + " def get_stats(self):\n", + " \"\"\"Get all stats in a dictionary format for aggregation\"\"\"\n", + " stats = {k: v for k, v in self.memory_log.items()}\n", + " stats[\"training_loss\"] = self.training_loss\n", + " stats[\"eval_loss\"] = self.eval_loss\n", + " stats[\"quant_type\"] = self.quant_type\n", + " return stats" + ] + }, + { + "cell_type": "markdown", + "id": "78f47784", + "metadata": {}, + "source": [ + "## Memory and Loss Monitoring Utilities" + ] + }, + { + "cell_type": "markdown", + "id": "805feb3c", + "metadata": {}, + "source": [ + "## Visualization Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "cf20ad92", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_loss_metrics(flow_4bit, flow_8bit):\n", + " \"\"\"Plot and compare loss metrics between 4-bit and 8-bit quantization.\"\"\"\n", + " try:\n", + " import matplotlib.pyplot as plt\n", + " import pandas as pd\n", + " \n", + " # Create figure with two subplots\n", + " fig, axs = plt.subplots(1, 2, figsize=(16, 6))\n", + " fig.suptitle('Training and Evaluation Loss: 4-bit vs 8-bit Quantization', fontsize=16)\n", + " \n", + " # Prepare data\n", + " rounds = list(range(1, len(flow_4bit.average_loss_history) + 1))\n", + " \n", + " # Plot training loss\n", + " axs[0].set_title('Training Loss by Round')\n", + " axs[0].plot(rounds, flow_4bit.average_loss_history, 'o-', label='4-bit', color='blue')\n", + " axs[0].plot(rounds, flow_8bit.average_loss_history, 's-', label='8-bit', color='red')\n", + " axs[0].set_xlabel('Round')\n", + " axs[0].set_ylabel('Average Training Loss')\n", + " axs[0].legend()\n", + " axs[0].grid(True, alpha=0.3)\n", + " \n", + " # Plot evaluation loss\n", + " axs[1].set_title('Evaluation Loss by Round')\n", + " axs[1].plot(rounds, flow_4bit.local_model_loss_history, 'o-', label='4-bit (Local)', color='blue')\n", + " axs[1].plot(rounds, flow_8bit.local_model_loss_history, 's-', label='8-bit (Local)', color='red')\n", + " axs[1].plot(rounds, flow_4bit.agg_model_loss_history, 'o--', label='4-bit (Agg)', color='lightblue')\n", + " axs[1].plot(rounds, flow_8bit.agg_model_loss_history, 's--', label='8-bit (Agg)', color='salmon')\n", + " axs[1].set_xlabel('Round')\n", + " axs[1].set_ylabel('Evaluation Loss')\n", + " axs[1].legend()\n", + " axs[1].grid(True, alpha=0.3)\n", + " \n", + " plt.tight_layout()\n", + " plt.subplots_adjust(top=0.88)\n", + " plt.show()\n", + " \n", + " # Print textual summary\n", + " print(\"\\nLoss Metrics Summary:\")\n", + " print(f\"Final Training Loss: 4-bit = {flow_4bit.average_loss_history[-1]:.4f}, 8-bit = {flow_8bit.average_loss_history[-1]:.4f}\")\n", + " print(f\"Training Loss Difference: {abs(flow_4bit.average_loss_history[-1] - flow_8bit.average_loss_history[-1]):.4f}\")\n", + " \n", + " print(f\"\\nFinal Local Eval Loss: 4-bit = {flow_4bit.local_model_loss_history[-1]:.4f}, 8-bit = {flow_8bit.local_model_loss_history[-1]:.4f}\")\n", + " print(f\"Local Eval Loss Difference: {abs(flow_4bit.local_model_loss_history[-1] - flow_8bit.local_model_loss_history[-1]):.4f}\")\n", + " \n", + " print(f\"\\nFinal Aggregated Eval Loss: 4-bit = {flow_4bit.agg_model_loss_history[-1]:.4f}, 8-bit = {flow_8bit.agg_model_loss_history[-1]:.4f}\")\n", + " print(f\"Aggregated Eval Loss Difference: {abs(flow_4bit.agg_model_loss_history[-1] - flow_8bit.agg_model_loss_history[-1]):.4f}\")\n", + " \n", + " better_training = \"4-bit\" if flow_4bit.average_loss_history[-1] < flow_8bit.average_loss_history[-1] else \"8-bit\"\n", + " better_local = \"4-bit\" if flow_4bit.local_model_loss_history[-1] < flow_8bit.local_model_loss_history[-1] else \"8-bit\"\n", + " better_agg = \"4-bit\" if flow_4bit.agg_model_loss_history[-1] < flow_8bit.agg_model_loss_history[-1] else \"8-bit\"\n", + " \n", + " print(f\"\\nBest Training Performance: {better_training}\")\n", + " print(f\"Best Local Evaluation Performance: {better_local}\")\n", + " print(f\"Best Aggregated Evaluation Performance: {better_agg}\")\n", + " \n", + " except ImportError:\n", + " print(\"Plotting requires matplotlib and pandas. Install with: pip install matplotlib pandas\")\n", + " except Exception as e:\n", + " print(f\"Error plotting metrics: {str(e)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "2668f39a-537e-4b4e-abfa-6b297e3aaa36", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Visualization libraries installed and imported successfully.\n" + ] + } + ], + "source": [ + "!pip install seaborn matplotlib pandas -q\n", + "\n", + "# Import the libraries\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "import seaborn as sns\n", + "\n", + "print(\"Visualization libraries installed and imported successfully.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "35cb4b3a", + "metadata": {}, + "outputs": [], + "source": [ + "# Visualization functions for memory usage and training loss\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "import seaborn as sns\n", + "\n", + "def plot_memory_metrics(flow_4bit, flow_8bit=None):\n", + " \"\"\"Plot memory usage metrics comparing 4-bit and 8-bit quantization\"\"\"\n", + " # Extract and organize memory data for 4-bit\n", + " memory_data = []\n", + " \n", + " for collab, rounds_data in flow_4bit.all_memory_stats.items():\n", + " for round_name, stats in rounds_data.items():\n", + " # Extract round number from round_name (e.g., 'round_0' -> 0)\n", + " round_num = int(round_name.split('_')[1]) if '_' in round_name else 0\n", + " quant_type = stats.get(\"quant_type\", \"4bit\")\n", + " \n", + " # Extract memory data\n", + " for phase, memory in stats.items():\n", + " if memory is not None and phase not in ['training_loss', 'eval_loss', 'quant_type']:\n", + " memory_data.append({\n", + " \"Collaborator\": collab,\n", + " \"Round\": round_name,\n", + " \"Round Number\": round_num,\n", + " \"Phase\": phase,\n", + " \"Memory (MB)\": memory,\n", + " \"Quantization\": quant_type\n", + " })\n", + " \n", + " # Add 8-bit data if provided\n", + " if flow_8bit is not None:\n", + " for collab, rounds_data in flow_8bit.all_memory_stats.items():\n", + " for round_name, stats in rounds_data.items():\n", + " # Extract round number from round_name (e.g., 'round_0' -> 0)\n", + " round_num = int(round_name.split('_')[1]) if '_' in round_name else 0\n", + " quant_type = stats.get(\"quant_type\", \"8bit\")\n", + " \n", + " # Extract memory data\n", + " for phase, memory in stats.items():\n", + " if memory is not None and phase not in ['training_loss', 'eval_loss', 'quant_type']:\n", + " memory_data.append({\n", + " \"Collaborator\": collab,\n", + " \"Round\": round_name,\n", + " \"Round Number\": round_num,\n", + " \"Phase\": phase,\n", + " \"Memory (MB)\": memory,\n", + " \"Quantization\": quant_type\n", + " })\n", + " \n", + " if not memory_data:\n", + " print(\"No memory data collected\")\n", + " return\n", + " \n", + " memory_df = pd.DataFrame(memory_data)\n", + " \n", + " # Create a figure with subplots for memory metrics\n", + " fig, axes = plt.subplots(2, 1, figsize=(15, 14), gridspec_kw={'height_ratios': [1, 0.7]})\n", + " \n", + " # 1. Memory usage by phase for each quantization (top plot)\n", + " if flow_8bit is not None:\n", + " sns.barplot(x=\"Phase\", y=\"Memory (MB)\", hue=\"Quantization\", data=memory_df, ax=axes[0])\n", + " axes[0].set_title(\"Memory Usage by Phase and Quantization Type\", fontsize=14, fontweight='bold')\n", + " else:\n", + " sns.barplot(x=\"Phase\", y=\"Memory (MB)\", hue=\"Collaborator\", data=memory_df, ax=axes[0])\n", + " axes[0].set_title(\"Memory Usage by Phase and Collaborator\", fontsize=14, fontweight='bold')\n", + " \n", + " axes[0].set_xlabel(\"Phase\", fontsize=12)\n", + " axes[0].set_ylabel(\"Memory (MB)\", fontsize=12)\n", + " axes[0].tick_params(axis='x', rotation=45)\n", + " axes[0].legend(title=\"Quantization\" if flow_8bit else \"Collaborator\", bbox_to_anchor=(1.05, 1), loc='upper left')\n", + " \n", + " # 2. Peak memory across rounds (bottom plot)\n", + " peak_data = memory_df[memory_df[\"Phase\"] == \"peak\"]\n", + " if not peak_data.empty:\n", + " group_var = \"Quantization\" if flow_8bit else \"Collaborator\"\n", + " sns.lineplot(\n", + " x=\"Round Number\", \n", + " y=\"Memory (MB)\", \n", + " hue=group_var, \n", + " data=peak_data, \n", + " marker='o', \n", + " sort=True,\n", + " linewidth=3,\n", + " markersize=10,\n", + " ax=axes[1]\n", + " )\n", + " axes[1].set_title(\"Peak Memory Usage Across Rounds\", fontsize=14, fontweight='bold')\n", + " axes[1].set_xlabel(\"Round\", fontsize=12)\n", + " axes[1].set_ylabel(\"Memory (MB)\", fontsize=12)\n", + " axes[1].legend(title=group_var, bbox_to_anchor=(1.05, 1), loc='upper left')\n", + " axes[1].grid(True, linestyle='--', alpha=0.7)\n", + " \n", + " plt.tight_layout()\n", + " plt.savefig('memory_metrics_comparison.png', dpi=300, bbox_inches='tight')\n", + " plt.show()\n", + "\n", + "def plot_loss_metrics(flow_4bit, flow_8bit=None):\n", + " \"\"\"Plot training and evaluation loss metrics comparing 4-bit and 8-bit quantization\"\"\"\n", + " # Extract and organize loss data for 4-bit\n", + " loss_data = []\n", + " \n", + " for collab, rounds_data in flow_4bit.all_memory_stats.items():\n", + " for round_name, stats in rounds_data.items():\n", + " # Extract round number from round_name (e.g., 'round_0' -> 0)\n", + " round_num = int(round_name.split('_')[1]) if '_' in round_name else 0\n", + " quant_type = stats.get(\"quant_type\", \"4bit\")\n", + " \n", + " # Extract loss data\n", + " if 'training_loss' in stats and stats['training_loss'] is not None:\n", + " loss_data.append({\n", + " \"Collaborator\": collab,\n", + " \"Round\": round_name,\n", + " \"Round Number\": round_num,\n", + " \"Metric\": \"Training Loss\",\n", + " \"Value\": stats['training_loss'],\n", + " \"Quantization\": quant_type\n", + " })\n", + " if 'eval_loss' in stats and stats['eval_loss'] is not None:\n", + " loss_data.append({\n", + " \"Collaborator\": collab,\n", + " \"Round\": round_name,\n", + " \"Round Number\": round_num,\n", + " \"Metric\": \"Evaluation Loss\",\n", + " \"Value\": stats['eval_loss'],\n", + " \"Quantization\": quant_type\n", + " })\n", + " \n", + " # Add 8-bit data if provided\n", + " if flow_8bit is not None:\n", + " for collab, rounds_data in flow_8bit.all_memory_stats.items():\n", + " for round_name, stats in rounds_data.items():\n", + " # Extract round number from round_name (e.g., 'round_0' -> 0)\n", + " round_num = int(round_name.split('_')[1]) if '_' in round_name else 0\n", + " quant_type = stats.get(\"quant_type\", \"8bit\")\n", + " \n", + " # Extract loss data\n", + " if 'training_loss' in stats and stats['training_loss'] is not None:\n", + " loss_data.append({\n", + " \"Collaborator\": collab,\n", + " \"Round\": round_name,\n", + " \"Round Number\": round_num,\n", + " \"Metric\": \"Training Loss\",\n", + " \"Value\": stats['training_loss'],\n", + " \"Quantization\": quant_type\n", + " })\n", + " if 'eval_loss' in stats and stats['eval_loss'] is not None:\n", + " loss_data.append({\n", + " \"Collaborator\": collab,\n", + " \"Round\": round_name,\n", + " \"Round Number\": round_num,\n", + " \"Metric\": \"Evaluation Loss\",\n", + " \"Value\": stats['eval_loss'],\n", + " \"Quantization\": quant_type\n", + " })\n", + " \n", + " if not loss_data:\n", + " print(\"No loss data collected\")\n", + " return\n", + " \n", + " loss_df = pd.DataFrame(loss_data)\n", + " \n", + " # Create a figure with subplots for loss metrics\n", + " if flow_8bit is None:\n", + " fig, axes = plt.subplots(2, 1, figsize=(15, 12), gridspec_kw={'height_ratios': [1, 0.8]})\n", + " \n", + " # 1. Training and eval loss per round (top plot)\n", + " sns.lineplot(\n", + " x=\"Round Number\", \n", + " y=\"Value\", \n", + " hue=\"Collaborator\", \n", + " style=\"Metric\", \n", + " data=loss_df, \n", + " marker='o', \n", + " sort=True,\n", + " linewidth=3,\n", + " markersize=10,\n", + " ax=axes[0]\n", + " )\n", + " axes[0].set_title(\"Training and Evaluation Loss by Round\", fontsize=14, fontweight='bold')\n", + " axes[0].set_xlabel(\"Round\", fontsize=12)\n", + " axes[0].set_ylabel(\"Loss\", fontsize=12)\n", + " axes[0].legend(bbox_to_anchor=(1.05, 1), loc='upper left')\n", + " axes[0].grid(True, linestyle='--', alpha=0.7)\n", + " \n", + " # 2. Boxplot of loss distribution by round (bottom plot)\n", + " sns.boxplot(x=\"Round\", y=\"Value\", hue=\"Metric\", data=loss_df, ax=axes[1])\n", + " axes[1].set_title(\"Loss Distribution Across Rounds\", fontsize=14, fontweight='bold')\n", + " axes[1].set_xlabel(\"Round\", fontsize=12)\n", + " axes[1].set_ylabel(\"Loss Value\", fontsize=12)\n", + " axes[1].legend(bbox_to_anchor=(1.05, 1), loc='upper left')\n", + " else:\n", + " # Comparison between 4-bit and 8-bit\n", + " fig, axes = plt.subplots(2, 1, figsize=(15, 12), gridspec_kw={'height_ratios': [1, 1]})\n", + " \n", + " # 1. Training loss comparison\n", + " training_loss_df = loss_df[loss_df[\"Metric\"] == \"Training Loss\"]\n", + " sns.lineplot(\n", + " x=\"Round Number\", \n", + " y=\"Value\", \n", + " hue=\"Quantization\", \n", + " style=\"Collaborator\", \n", + " data=training_loss_df, \n", + " marker='o', \n", + " sort=True,\n", + " linewidth=3,\n", + " markersize=10,\n", + " ax=axes[0]\n", + " )\n", + " axes[0].set_title(\"Training Loss Comparison: 4-bit vs 8-bit\", fontsize=14, fontweight='bold')\n", + " axes[0].set_xlabel(\"Round\", fontsize=12)\n", + " axes[0].set_ylabel(\"Training Loss\", fontsize=12)\n", + " axes[0].legend(bbox_to_anchor=(1.05, 1), loc='upper left')\n", + " axes[0].grid(True, linestyle='--', alpha=0.7)\n", + " \n", + " # 2. Evaluation loss comparison\n", + " eval_loss_df = loss_df[loss_df[\"Metric\"] == \"Evaluation Loss\"]\n", + " sns.lineplot(\n", + " x=\"Round Number\", \n", + " y=\"Value\", \n", + " hue=\"Quantization\", \n", + " style=\"Collaborator\", \n", + " data=eval_loss_df, \n", + " marker='o', \n", + " sort=True,\n", + " linewidth=3,\n", + " markersize=10,\n", + " ax=axes[1]\n", + " )\n", + " axes[1].set_title(\"Evaluation Loss Comparison: 4-bit vs 8-bit\", fontsize=14, fontweight='bold')\n", + " axes[1].set_xlabel(\"Round\", fontsize=12)\n", + " axes[1].set_ylabel(\"Evaluation Loss\", fontsize=12)\n", + " axes[1].legend(bbox_to_anchor=(1.05, 1), loc='upper left')\n", + " axes[1].grid(True, linestyle='--', alpha=0.7)\n", + " \n", + " plt.tight_layout()\n", + " plt.savefig('loss_metrics_comparison.png', dpi=300, bbox_inches='tight')\n", + " plt.show()\n", + "\n", + "def plot_aggregated_metrics(flow_4bit, flow_8bit):\n", + " \"\"\"Plot aggregated metrics comparing 4-bit and 8-bit quantization\"\"\"\n", + " if (not hasattr(flow_4bit, 'average_loss_history') or not flow_4bit.average_loss_history or\n", + " not hasattr(flow_8bit, 'average_loss_history') or not flow_8bit.average_loss_history):\n", + " print(\"Not enough aggregated metrics data available\")\n", + " return\n", + " \n", + " # Create comparison dataframes\n", + " rounds_4bit = list(range(len(flow_4bit.average_loss_history)))\n", + " data_4bit = pd.DataFrame({\n", + " 'Round': rounds_4bit,\n", + " 'Average Training Loss': flow_4bit.average_loss_history,\n", + " 'Aggregated Model Loss': flow_4bit.agg_model_loss_history,\n", + " 'Local Model Loss': flow_4bit.local_model_loss_history,\n", + " 'Quantization': '4-bit'\n", + " })\n", + " \n", + " rounds_8bit = list(range(len(flow_8bit.average_loss_history)))\n", + " data_8bit = pd.DataFrame({\n", + " 'Round': rounds_8bit,\n", + " 'Average Training Loss': flow_8bit.average_loss_history,\n", + " 'Aggregated Model Loss': flow_8bit.agg_model_loss_history,\n", + " 'Local Model Loss': flow_8bit.local_model_loss_history,\n", + " 'Quantization': '8-bit'\n", + " })\n", + " \n", + " # Combine data\n", + " combined_data = pd.concat([data_4bit, data_8bit])\n", + " \n", + " # Melt for easier plotting\n", + " melted_data = pd.melt(\n", + " combined_data,\n", + " id_vars=['Round', 'Quantization'],\n", + " value_vars=['Average Training Loss', 'Aggregated Model Loss', 'Local Model Loss'],\n", + " var_name='Metric',\n", + " value_name='Loss'\n", + " )\n", + " \n", + " # Plot comparison\n", + " plt.figure(figsize=(15, 8))\n", + " sns.lineplot(\n", + " data=melted_data,\n", + " x='Round',\n", + " y='Loss',\n", + " hue='Quantization',\n", + " style='Metric',\n", + " markers=True,\n", + " dashes=True,\n", + " linewidth=3\n", + " )\n", + " \n", + " plt.title('Comparison of 4-bit vs 8-bit Quantization Performance', fontsize=16, fontweight='bold')\n", + " plt.xlabel('Round', fontsize=14)\n", + " plt.ylabel('Loss', fontsize=14)\n", + " plt.grid(True, linestyle='--', alpha=0.7)\n", + " plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')\n", + " plt.tight_layout()\n", + " plt.savefig('aggregated_comparison.png', dpi=300, bbox_inches='tight')\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "61c7da64", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "==== Training & Evaluation Loss Comparison: 4-bit vs 8-bit ====\n", + "\n" + ] + }, + { + "data": { + "image/png": "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Scb9v/76q/Hvvn37EhQUBFRenNaqVYupU6fyyiuvoNfrmT9/PvPnzzdp06hRI77++mtCQkIsOufNLl26REZGBk899RSenp78/PPPxl8+fPXVVwwfPpzu3buXevz1tQKWLFlCdHQ0APXr1+fpp582timrBJkQQgghhChDlabyhRBCiBqsojPTQ0ND9VevXi31fHFxcfrFixfrv/rqK/3nn3+u/+yzz/TOzs7G43/66SdjW0tnpisUCv3+/fuN+yZMmGDc5+3tbXKcpTPT77vvPr1Op9Pr9Xp9WlqaXqVSGffNnDnTeNyNM39DQkL0ubm5xn03z0611sz0iIiIUvswe/Zsk3P9/vvver1er58+fbpx25NPPlninNnZ2fqLFy8a77u7uxvbX7hwoUT706dPWzS2gQMHmvQnLy/PouMOHDhgctxrr71m3FdcXKzv2LGjyXOu1Wr1en3J53XcuHHG4yZNmmSy79lnnzXuGzVqlHF769atTfpy4zHh4eH6goIC477x48eb7I+Pjzc5NiMjQ79mzRr93Llz9dOmTdN/9tln+m7duhnb9+rVq9Rrubu768+dO1fisSktTlasWGHc1q9fvxLH5efn65OSkoz3hwwZYmzv5uamv3TpknHfmjVrTK7xxRdfGPfdaiz+l5npAwYMML7fXJ/NX5kz0+3t7U3688svv5j09bvvvjPuK+09pbx95Tlz5oxeoVAYjz9y5Iher9frCwoK9F5eXsbtS5YsMR5TWXF63e+//272lwZOTk76d955R5+dnV2h8908c/6XX34x7ktISNDb29sb940ePdq4z9zMdEv2CSGEEEKIWyMz04UQQojb5Nlnn8XT07PE9rNnzzJ69Gh27txZ5vHmajKXp2PHjib1kps0aWL821yNc0s8/fTTxrrG3t7e1KpVi0uXLpmcMzs72zjzF2DEiBE4OTkZ748dO9aknq815Obmcvjw4VL78Mgjj/DMM88Y7+/atYuhQ4fSuXNnFAoFer2eb775hn379tGsWTOaNGmCRqOhZ8+e1K5d23hc165d+euvvwBo3rw57du3p1GjRoSHh9OzZ08aNmxo1XFen3l+3aOPPmr8W6VS8dBDDxnbpKenExcXR1hYWInzPPTQQ8a/b55RGxkZafz7xhmtZb2GRo4ciVqtNjn/d999Z7wfExNDw4YN0el0vPHGG3z55ZcU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vI9ddNFF7Nq1y/VBFcCOHTuIj49XIl3kB84mxk6cOFEnYX7qwyvDMMwbrEgboHyHiJwJrUxv4x544AGmTZuGzWZjyJAhzJgxg/Lycm699VYAbr75ZhITE3n++ecBuP/++xk5ciS/+93vuPLKK5k1axZZWVn89a9/PZ/TEPFYTY2xF198kSeffJJ33nmH5ORk134E7dq1o127dudtHiKeqikxFhQURL9+/WrdHxERAVDnvIg4NfV97O6772bmzJncf//93HvvvezcuZPnnnuO++6773xOQ8RjNTXGJkyYwO9//3sGDhzI0KFD2bVrF0888QQTJkyo9Y0QEYHjx4+za9cu18979+5l/fr1REVF0alTJx577DHy8/P517/+BcBdd93FzJkzefjhh/nJT37C0qVLyczMZP78+edrCiLigZRMb+OmTp3K4cOHefLJJzl48CADBgxg4cKFrk039u/fX2vlw4UXXsg777zD448/zq9+9Su6d+/OvHnzlIQQqUdTY+xPf/oTVVVVXHfddbX6mT59Ok899dS5HLpIq9DUGBORpmlqjFmtVhYtWsQvfvELUlNTSUxM5P777+eRRx45X1MQ8WhNjbHHH38ci8XC448/Tn5+PjExMUyYMIFnn332fE1BxGNlZWUxatQo188PPPAAANOmTePtt9/mwIED7N+/33U9JSWF+fPn84tf/II//OEPJCUl8be//Y1x48ad87GLiOeyGPoumIiIiIiIiIiIiIhIg7RUS0RERERERERERESkEUqmi4iIiIiIiIiIiIg0Qsl0EREREREREREREZFGKJkuIiIiIiIiIiIiItIIJdNFRERERERERERERBqhZLqIiIiIiIiIiIiISCOUTBcRERERERERERERaYSS6SIiIiIiIiIiIiIijVAyXURERETahKeeegqLxXK+hyEiIiIiIq2UkukiIiIicsbefvttLBaL6/Dz8yMxMZFbbrmF/Pz88z08ERERERER0/id7wGIiIiISOvzm9/8hpSUFE6ePMk333zD22+/zfLly9m8eTNBQUHne3giIiIiIiItTsl0EREREWmyK664ApvNBsDtt99Ohw4dePHFF/noo4/IyMg4z6MTERERERFpeSrzIiIiIiLNNmLECAB2797tOrd06VJGjBhBaGgoERERTJw4kZycnFr33XLLLSQnJ9fpz119c4vFwj333MO8efPo168fgYGB9O3bl4ULF9a5f/ny5QwePJigoCC6du3KX/7ylxaYpYiIiIiItGVamS4iIiIizbZv3z4AIiMjAVi8eDFXXHEFXbp04amnnqKiooLXX3+diy66iHXr1rlNoJ+J5cuX8/777/PTn/6U9u3b89prrzF58mT2799PdHQ0AJs2bWLs2LHExMTw1FNPUVNTw/Tp04mNjW2JqYqIiIiISBulZLqIiIiINFlJSQlFRUWcPHmSVatW8fTTTxMYGMhVV10FwEMPPURUVBQrV64kKioKgEmTJjFw4ECmT5/OP//5z7N63JycHLZu3UrXrl0BGDVqFGlpabz77rvcc889ADz55JMYhsFXX31Fp06dAJg8eTL9+/dv7rRFRERERKQNUzJdRERERJpszJgxtX5OTk7mP//5D0lJSRw4cID169fz8MMPuxLpAKmpqVx22WUsWLCgWY97KpF+qs+wsDD27NkDgN1uZ9GiRUyaNMmVSAfo3bs348aNa9Zji4iIiIhI26aa6SIiIiLSZG+88QafffYZc+fOZfz48RQVFREYGAjAt99+C0DPnj3r3Ne7d2+KioooLy8/q8c9PUF+SmRkJMeOHQPg8OHDVFRU0L179zrt3I1HRERERETkTGlluoiIiIg02ZAhQ7DZbICzfMvw4cO58cYb2b59e5P6+eEmo6fY7Xa35319fd2eNwyjSY8rIiIiIiLSVFqZLiIiIiLN4uvry/PPP09BQQEzZ86kc+fOAG4T69u2baNDhw6EhoYCzlXlxcXFddqdWt3eVDExMQQHB7Nz584615qa6BcRERERETmdkukiIiIi0myXXHIJQ4YMYcaMGURGRjJgwAD++c9/1kqUb968mf/973+MHz/eda5r166UlJSwceNG17kDBw7wwQcfnNU4fH19GTduHPPmzWP//v2u8zk5OSxatOis+hQREREREQEl00VERESkhTz00EMUFhby9ttv8/LLL3PkyBGGDRvGK6+8wjPPPMOll15KeHg4Tz31lOue66+/ntDQUK655hr+8Ic/8PzzzzN06FB69Ohx1uN4+umnARgxYgQvvvgizz77LKNGjaJv377NnaKIiIiIiLRhSqaLiIiISIu49tpr6dq1K6+88gqjRo1i4cKFREdH8+STT/LKK69wwQUX8PXXX5OSkuK6Jzo6mg8++ICQkBAefvhh/vnPf/L8888zYcKEsx5HamoqixYtIiYmhieffJK///3vPP3001xzzTUtMU0REREREWmjLIZ2axIRERERERERERERaZBWpouIiIiIiIiIiIiINELJdBERERERERERERGRRiiZLiIiIiIiIiIiIiLSCCXTRUREREREREREREQaoWS6iIiIiIiIiIiIiEgjlEwXEREREREREREREWmEkukiIiIiIiIiIiIiIo1QMl1EREREREREREREpBFKpouIiIiIiIiIiIiINELJdBERERERERERERGRRiiZLiIiIiIiIiIiIiLSCCXTRUREREREREREREQaoWS6iIiIiIiIiIiIiEgjlEwXEREREREREREREWmEkukiIiIiIiIiIiIiIo1QMl1EREREREREREREpBFKpouIiIiIiIiIiIiINELJdBEREQ+zbNkyLBaL69i3b9/5HlK9WtNYRc7Evn37av1NL1u27HwPqVV66qmnXL/D5OTkM77vlltucd13ySWXmDY+b3C2r79vv/12rftERERE5MwpmS4iIm3SD5MQ9R233HLL+R7qeeMtifIfJo68NTlqGAYLFizgpptuokePHoSFheHv709sbCyjR4/mxRdf5MCBA+d7mNIK/P73v6/zWugJWnuifcuWLdx555306tWL0NBQ/Pz8iIiIwGaz8fjjj3Po0KHzPUQl2kVEREQa4Xe+ByAiIiKtV9euXXn55ZddP0dFRZ3H0bRdubm53HjjjSxfvrzOtUOHDrF06VKWLl1KTk4Ob7/99rkfYCsSFRVV62+6a9eu53E0596OHTt4/PHHz9vjX3/99fTr1w8Aq9V63sbR0hYsWMA111xDVVVVrfMlJSWsXbuWtWvX8tZbb7Fq1So6depk6lgGDx5c629cRERERM6ckukiIiLA1KlTsdlsdc6fSuqIe1arlQcffPB8D6NNKywsZOTIkezdu9d1LiUlhauvvprY2FiOHTvGN9984zbRLt+rqqrCMAzCwsLa7N+0w+HglltuoaKi4ryN4fLLL+fyyy8/b49vloceesiVSA8MDOQnP/kJiYmJLFmyhM8//xyAgwcPMnPmTF566SVTx9K3b1/69u1r6mOIiIiIeCuVeREREcGZwHnwwQfrHKeSOkuWLKn11ffTE5fgTEIlJCS4rj/77LMAHD16lIcffpjRo0eTnJxM+/btCQgIIDY2lssuu4x///vfGIZxxuO85JJL6i1B09DX85ctW8Ztt93GoEGDiI+PJzAwkJCQELp168att97Kpk2barW3WCyMGjWq1rmUlJQ6j91YKRi73c7f//53Ro8eTYcOHfD39yc6OppRo0bx5ptvUlNTU6u9u3rVs2bNYujQoYSEhBAZGcmUKVPIzc0949/Z2dqxYwd33303PXv2JCQkhJCQEHr06MH//d//sW3btjrty8vL+c1vfsOgQYNo3749/v7+dOzYkQEDBnDHHXewcOHCWu2/+uorrrnmGhITEwkICKBdu3YkJydzxRVX8NRTT1FSUnJG4/z5z39e6+/x7rvvZseOHcyYMYPHHnuMl156iS+//JLt27dz2WWX1bn/vffe48orryQuLo6AgAAiIyO58MIL+d3vfseJEyfqtD/9+Xn77bf597//zYABAwgODqZbt268+uqrANTU1PDb3/6WlJQUAgMD6d27N2+++Wad/n74N71t2zYmT55MVFQUISEhDB8+nMWLF9e574MPPuCmm24iNTWV2NhY1++wT58+3HPPPW7LEv3wsTZv3sykSZOIjo4mMDCQnJycBmum19TUMGPGDIYNG0ZERAR+fn5ER0fTt29fbr75ZmbNmlXnMfPz83nooYfo378/7dq1IygoiOTkZH784x+zevXqOu1/WGu8pKSEhx56iM6dOxMQEECXLl147rnn6rxu/HDcZ/MNhN///vesXLkSPz8/rrrqqibf35CysjJ++ctfYrVaCQoKok+fPsycObPOPNyVcjn12vbPf/7T1e6LL7444/JNpaWlhIaGNvi7mTp1quv66XHSUnG6e/du13/fcccd/PGPf+TXv/41n332GeHh4a5rhw8fPqP+3DEMgzfeeIN+/foRFBREYmIiDzzwAGVlZbXauXuvOPX3c+utt9Zqe3q7p5566qzHJiIiIuI1DBERkTbo888/NwDX8Y9//KPB9g6Hw+jcubOr/XPPPVfr+pIlS1zXfHx8jNzcXMMwDGPTpk21HsfdceuttzY4tr1797qujRw50nV+2rRpte77xz/+Ueu+0/3yl79scAwBAQHGZ5995mrf2JhPPXZDYz1+/Lhx8cUXN9jP8OHDjbKyMtc9e/furXPd3X3du3c3KioqGnzO6vu9fP75543ek5mZaQQFBdU77sDAQOPdd9+tdc8ll1zS4FynTp3qart48WLD19e3wfY5OTmNjrOgoMCwWCyuewYMGGDY7fYz+r3U1NQYGRkZDY6hd+/eRkFBQa37Tr+enp7u9r4nnnjCmDhxottrb731Vq3+Tv+bTk9PN8LCwurc4+PjY2RmZta6b/LkyQ2OPSwszNi4cWO9jzVw4EAjNDS01j3Z2dl1/gZP/3uZNm1ag485dOjQWo/3xRdfGJGRkfW29/HxMX73u9/Vumf69Omu69HR0Ubv3r3r/R2f7ofjbuw17YdycnJcf/NPPPFErXH88PXkTJx+f2xsrGGz2dzO495776113+m/45EjRxqGUTeG3R2NxfVNN93kajt27Nha18rKyozg4GDX9XfeeccwjJaLU8MwjIEDB9b629u9e7dx8uRJ46OPPjJ8fHxc12bNmnVmv2Cj7uvvlVde6XaMgwcPrvV66e694od/P+6O6dOnn/HYRERERLyVyryIiIgACxcupKioqM75qVOnYrVasVgsTJs2jd/85jcAvPPOOzz22GOudu+8847rvy+77DKSkpIA8PHxoXfv3gwZMoS4uDgiIiI4efIk2dnZfPzxxxiGwT/+8Q/uuusuhgwZYtr8QkNDGTlyJP379ycqKorg4GCOHDnC/PnzycnJoaqqivvuu4+tW7cC8PLLL7N7927+/Oc/u/r41a9+RWRkJHBm5W/uu+8+vvzyS9fPY8eOZdiwYXzzzTcsWrQIgOXLl3Pffffx97//3W0fy5cvZ/DgwYwbN47PP/+cr7/+GoCdO3cyb948rr/++rP7hTRg165d3HTTTVRWVgIQHR3NtGnTXCtji4qKqKysZNq0aaSnp9O9e3dycnJcK2N9fHy4+eab6dGjB0VFRezdu7fOqtm//vWv2O12AHr16sWUKVPw8/Nj//79rF+/nnXr1p3RWD///PNaK3unTZuGj8+ZffHwueeeIzMz0/XzBRdcwNixY8nJyWHOnDkA5OTk8KMf/YilS5e67WPt2rUMGzaMyy67jNmzZ7N9+3YAnnnmGQBGjhzJxRdfzJtvvsnBgwcBeOmll/jJT35Sb38JCQncfffdlJWV8dZbb1FZWYnD4eDOO+9k7NixrlW8ERERjB07lt69exMZGUlAQACFhYV88MEH7N+/n9LSUh555BEWLFjg9rGys7Px8/Pjpptuonv37mzbto2goKB6f1/Hjx/nP//5j+vnyZMnM2jQIEpKSvj222/54osvarUvLi7m2muv5dixYwAEBwdz6623EhYWxrvvvsu3336Lw+HgwQcfJD09nZEjR9Z5zCNHjnDs2DFuvvlmEhIS+Nvf/uZ6nfrDH/7A448/TkBAQL1jPlN2u51bbrmFkydPkpaWxhNPPOH6dk1LKCwspLi4mLvuuouIiAj+85//kJeXB8Drr7/O5MmT3c7/lFM1vmfPnk1WVhYAXbp04e6773a1aay2/a233sq///1vwPlNo0OHDtGxY0cA5s2b5yptExERwTXXXAO0XJwCzJgxg6uuuoqysjKys7PrjDcqKorHH3+cqVOnnnGfPzR//nwmTpxIWloan376KWvWrAFgzZo1vPTSSzz55JP13ntqr4CsrCxmz57tOn96bfULL7zwrMcmIiIi4jXOdzZfRETkfPjhir76jtNXO+7Zs6fWKuBNmzYZhmEYlZWVtVafzp49u87jffvtt8bcuXONmTNnGq+88orx8ssvG4mJia57fvOb39Q7tpZYmW4YhmG3241Vq1YZb7/9tjFjxgzj5ZdfNh544IFa9+zfv/+MxtFYm6KiolorOjMyMmrdd/qKaF9fX6OoqMgwjLqrI4cMGWJUVVUZhmEYVVVVRseOHV3XHnjggbpPrBtNXZl+//3311o5fOp5NgznNw1OX0V6//33G4ZhGOvWrXOd6927t+FwOGr1WVNTY+zbt8/189VXX+1q/8MV7oZhGAcOHDDKy8sbndtLL71Ua26ffvppo/cYhvNvISoqynXfsGHDjJqaGtf1hx9+uFa/2dnZrmunn+/Tp4/r+Vm0aFGta2lpaa4+//znP9e6Vlpa6urv9L9pf3//Wn9n//3vf2vd9+abb9aaR1VVlfHll18ab731lvHqq68aL7/8snHrrbe62gcGBrrG98PHAox58+bV+d3UtzL96NGjrnNhYWFGZWVlrfscDoexZ88e18+vvvpqrX4WLFjgulZYWGi0a9fOdW3ixImuaz9cET5jxgzXtXnz5tW6dvrK++asTH/hhRdcv//169e7HUdT/fD+//73v7XG6u/v77r2ox/9yHXN3cr0M7nWGIfDYaSkpLjuf/31113Xxo8f7zp/9913u863VJyesnXrVqNHjx5u32tuvvnmWn8/Z+KHr7933HGH61pVVZXRt29f17WkpCTXtYbeKxp7HxERERFp67QyXURE5AylpKRwySWXuDaLe/fdd3n22WdZuHCha/VpVFQUEydOdN1z5MgRpk2bxvz58xvs+9QqTbN89tln3H777ezfv7/RcVit1mY/3urVq10rOsG5Yvp006ZNc62KttvtrF69miuuuKJOP7fffjv+/v4A+Pv7k5KSwqFDhwBcv/OWtnLlStd/p6en11qF369fP9LT010rPk+17d27N9HR0Rw5coScnBy6devGwIED6dGjB6mpqYwZM4bOnTu7+hkxYgQfffQR4KwR/Ze//IUePXrQs2dPLrroIoYMGVKn7n1L2r59O0ePHnX9/OMf/xhfX1/Xz9OmTau1CeLKlSsZMGBAnX4yMjJcz09ycnKta9dee62rzx+uwj127Bjt27ev09+IESNq9TN16lRuueUWqqurAefK9dtvvx2A//73v/z85z93+42SUyorKykqKiI+Pr7OtX79+tWK1cZERkbSt29ftmzZQmlpKSkpKQwePJju3bvTv39/Ro8eTUpKiqv96X9HMTExtf6+O3bsyBVXXOH6BsDpbU/n6+vL//3f/7l+7tmzZ63rp8dAcnJyk/ZfOCUnJ4fp06cD8Pjjj5OWltboPaWlpfz1r3+tcz48PJw77rijznl/f/9aK66Tk5MZPny467V07dq1TR53U52qk39qru+++y733HMPR44c4bPPPnO1O71meEvG6RdffMG1117L0aNH8fPz48c//jEpKSksXLiQlStX8q9//Yv58+ezYsUKevToAcCbb77ptib7nXfeSVhYWJ3zN/0/e/cdHlWZ/g38e6bPZJJJbxBIaBK6GlBAQcVeVl1UdH2VIljAFWwr6oq44s+yK2AF2yL21V17XYyAgqKAuIhUIfSSRsokk6nn/eNkJjOZc6YkOaTw/VzXuZg5bZ6TyT1D7rnnfq67LnBbr9fjqquuClzv/v37ceTIEWRlZcU0XiIiIiKSx2Q6ERERgCVLloRN6ClnypQpYcn04BYvf/rTn2A0GgP3b7jhhqiJdACBliLxaJ44UzrHwYMHcdlll8lOJtkW45ATnKgFEJbAaX5fKTHePEEb/LP1+XytGKGy4LHLJZ6C1/nHbTKZ8O6772Ly5MnYu3cvdu3ahV27dgX2MxgMePTRR3HHHXcAkCYN3bhxI9566y04nU6sWLEipBXMoEGD8N///lc2CRysW7duIfe3bt0amDQ3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xx8DbX0AYMyYMdi0aRPuvPNODBw4EBaLBQaDAT169MC1116L77//Hnfeeadq4+0oEhISsGrVKvz5z39Gt27dYDAYcMIJJ+Cpp57Cs88+G/N5hg0bhrfffhsnnXRSyMSs8Wr++p2VlRXofR+sLeP0iiuuwPr16zF16lT069cPFosFWq0WKSkpGD16NP7xj39gzZo1shOLxurll1/G/PnzUVhYCKPRiJycHMycORPffPNNSPuYSIxGIz7//HOce+65rRoLERERUVcliKIotvcgiIiIiOj4dMYZZ2DlypUApNYoavb6JiIiIiIiag1WphMRERERERERERERRcFkOhERERERERERERFRFEymExERERERERERERFFwZ7pRERERERERERERERRsDKdiIiIiIiIiIiIiCgKJtOJiIiIiIiIiIiIiKJgMp2IiIiIiIiIiIiIKApdew+gq/D5fDh48CASExMhCEJ7D4eIiIiIiIiIiI5DoiiitrYWubm50GhYR0vUlphMbyMHDx5EXl5eew+DiIiIiIiIiIgI+/btQ/fu3dt7GERdCpPpbSQxMRGA9EKVlJTUzqNpO6Iowuv1QqvVsuKeSAWMMSJ1McaI1MUYI1IXY4xIXV01xmpqapCXlxfIVRFR22EyvY34X3STkpK6XDLd4XDAbDZ3qTcWoo6CMUakLsYYkboYY0TqYowRqaurx1hXvCai9sbGSRSR1+vFxo0b4fV623soRF0SY4xIXYwxInUxxojUxRgjUhdjjIjixWQ6EREREREREREREVEUTKYTEREREREREREREUXBnukUlVarbe8hEHVpjDEidTHGiNTFGCNSF2OMSF2MseODz+eDy+Vq72FQB6XX62N+LRBEURRVHs9xoaamBjabDdXV1V1qAlIiIiIiIiIiIuo8mKMK5XK5UFJSAp/P195DoQ4sOTkZ2dnZUSfuZWU6RSSKIqqrq2Gz2TgLNJEKGGNE6mKMEamLMUakLsYYkboYY12fKIo4dOgQtFot8vLyoNGw4zWFEkUR9fX1KC0tBQDk5ORE3J/JdIrI6/Vi69atKCoqgk7HXxeitsYYI1IXY4xIXYwxInUxxojUxRjr+jweD+rr65GbmwuLxdLew6EOymw2AwBKS0uRmZkZseULP44hIiIiIiIiIiKiLsfr9QIADAZDO4+EOjr/hy1utzvifkymExERERERERERUZfFNj4UTay/I0ymU0SCIMBsNvNFh0gljDEidTHGiNTFGCNSF2OMSF2MMSKKF5PpFJFWq8XQoUMj9goiopZjjBGpizFGpC7GGJG6GGNE6mKMEbXOihUrIAgCqqqqVH2c/Px8LFy4UNXHiBWT6RSRz+dDaWkpfD5few+FqEtijBGpizFGpC7GGJG6GGNE6mKMUUe3b98+TJkyBbm5uTAYDOjZsydmzpyJioqKYz6WM844A7NmzQpZN2rUKBw6dAg2m61NHuPVV19FcnJy2Pq1a9fixhtvbJPHaC0m0ykin8+HXbt28Y2FSCWMMSJ1McaI1MUYI1IXY4xIXYwx6sh27dqFoqIi7NixA2+//TZ+//13LF68GMXFxRg5ciQqKyvbe4gwGAzIzs5WvVVSRkZGYILQ9sZkOilyuLxw+4ATTy6C2yfdJyIiIiIiIiIiInXNmDEDBoMB//3vfzF27Fj06NEDF1xwAb7++mscOHAA999/PwCp9/+HH34YcmxycjJeffXVwP177rkH/fr1g8ViQa9evfDAAw/A7XYHts+dOxfDhg3D66+/jvz8fNhsNlx99dWora0FAEyaNAkrV67EU089BUEQIAgCdu/eHdbm5YwzzghsD152794NAJg/fz4GDx6MhIQE5OXlYfr06bDb7QCkljGTJ09GdXV14Li5c+cCCG/zsnfvXlx66aWwWq1ISkrCVVddhSNHjsR8Pa3BZDqFqXd5UG534tlvduDiZ1bhtMdX4OJnVuHZb3ag3O5EvcvT3kMkIiIiIiIiIiLqkiorK/HVV19h+vTpMJvNIduys7Nx7bXX4l//+hdEUYzpfImJiXj11VexefNmPPXUU3jppZewYMGCkH127tyJDz/8EJ9++ik+/fRTrFy5Eo899hgA4KmnnsLIkSMxbdo0HDp0CIcOHUJeXl7Y47z//vuB7YcOHcIf//hHnHDCCcjKygIAaDQaPP300/jtt9+wdOlSfPPNN/jLX/4CQGoZs3DhQiQlJQWOv+uuu8Iew+fz4dJLL0VlZSVWrlyJZcuWYdeuXZgwYULM19MaulafgbqUBrcXL367C08X74AvKB7L7E48t2InFq3cidvG9cXNY3vDpOcEHUStJQgCbDYbZ48nUgljjEhdjDEidTHGiNTFGKOOaseOHRBFEYWFhbLbCwsLcfToUZSVlcV0vr/+9a+B2/n5+bjrrrvwzjvvBBLZgJSkfvXVV5GYmAgAuO6661BcXIxHHnkENpsNBoMBFosF2dnZio+TmpoauL1gwQJ88803+PHHHwMfCAT3XM/Pz8e8efNw88034/nnn4fBYAjEY6THKC4uxq+//oqSkpJAQv+1117DwIEDsXbtWgwfPjzq9bQGk+kUUO/y4MVvd2Hh1zsU9/GJCGy/cUwvWAz8FSJqDa1Wq/jmSEStxxgjUhdjjEhdjDEidTHGqKOLVnluMBhiOs+//vUvPP3009i5cyfsdjs8Hg+SkpJC9snPzw8kngEgJycHpaWl8Q8awBdffIHZs2fjk08+Qb9+/QLrv/76azz66KPYunUrampq4PF40NDQgPr6+ph7om/ZsgV5eXkhlfEDBgxAcnIytmzZEkimt+X1BGObFwqod3nxdLFyIj3Y08U72EOdqA34fD7s37+fE94QqYQxRqQuxhiRuhhjROpijFFH1adPHwiCgC1btshu37JlCzIyMpCcnAxBEMKS7sH90H/44Qdce+21uPDCC/Hpp59iw4YNuP/+++FyuUKO0ev1IfcFQWhRbGzevBlXX301HnvsMZx77rmB9bt378bFF1+MIUOG4D//+Q/Wr1+P5557DgDCxtIW2up6mmMynQBIk4v+c1VJSGuXSHwi8MqqEvx6oBpLVpfg040H8eOuCuwqs6O2wR1zzyai4x3/80akLsYYkboYY0TqYowRqYsxRh1VWloazjnnHDz//PNwOBwh2w4fPow333wTkyZNAgBkZGTg0KFDge07duxAfX194P7333+Pnj174v7770dRURH69u2LPXv2xD0mg8EArzdyYW15eTkuueQSjB8/HrfffnvItvXr18Pn8+HJJ5/Eqaeein79+uHgwYNxP0ZhYSH27duHffv2BdZt3rwZVVVVGDBgQJxXFT/26KCAr347HPf+E0fl46FPNodtM+k1yEg0It1qxIiCVNx7gfzXphrcXvZeJyIiIiIiIiIiCvLss89i1KhROO+88zBv3jwUFBTgt99+w913341+/fphzpw5AICzzjoLzz77LEaOHAmv14t77rknpCq7b9++2Lt3L9555x0MHz4cn332GT744IO4x5Ofn48ff/wRu3fvhtVqDemP7jd+/HhYLBbMnTsXhw835RkzMjLQp08fuN1uPPPMM7jkkkuwevVqLF68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qirV1dXpfe97nzZv3px137/8y7/okEMOGfZ6I/U3tyxLF154oR544AEdddRRqqio0JFHHqk1a9YMu//xxx/X8ccfr3A4rEWLFunb3/72BMwSAAAAwHTGynQAAAAcsJdeekmSVF9fL0l69NFH9a53vUsLFy7Utddeq3g8rttuu00nnniiNmzYMGKAno/HH39c999/vy644ALV1NTo1ltv1VlnnaVXXnlFM2bMkCT99a9/1Tve8Q41NTXp2muvVSqV0jXXXKOZM2dOxFQBAAAATFOE6QAAAChYLBZTW1ubent79eSTT+q6665TRUWF3vOe90iS/vVf/1UNDQ1at26dGhoaJElnnnmmjj32WF1zzTW65557xvX7bt68WX//+9+1aNEiSdIpp5yiY445Rj/+8Y914YUXSpJWr14t13X1xz/+UQcddJAk6ayzztLrX//6A502AAAAgGmMMB0AAAAFW7FiRdavDznkEP3oRz/SvHnztHPnTj311FO64oor0kG6JB199NF6+9vfroceeuiAft+BIH3gNWtra7V161ZJkm3bevjhh3XmmWemg3RJOuKII3Taaacd0O8NAAAAYHqjZzoAAAAKdvvtt+s3v/mNfvrTn+r0009XW1ubKioqJEkvv/yyJOnwww8fdt8RRxyhtrY2dXd3j+v3zQzIB9TX12v//v2SpNbWVsXjcS1evHjYdSONBwAAAADyxcp0AAAAFGzZsmVqaWmR5LVvefOb36wPfvCDevbZZwt6naGbjA6wbXvE836/f8TzrusW9PsCAAAAQKFYmQ4AAIAD4vf7deONN2rHjh365je/qYMPPliSRgzWt2zZosbGRlVVVUnyVpW3t7cPu25gdXuhmpqaFIlE9Pzzzw97rtCgHwAAAAAyEaYDAADggL31rW/VsmXLdMstt6i+vl5Lly7VPffckxWUP/PMM3rkkUd0+umnp88tWrRIsVhMmzZtSp/buXOnfvazn41rHH6/X6eddpoeeOABvfLKK+nzmzdv1sMPPzyu1wQAAAAAiTAdAAAAE+Rf//VftXv3bt1999362te+pr179+qNb3yjvv71r+v666/X2972NkWjUV177bXpe8455xxVVVXp/e9/v77xjW/oxhtv1PLly3XYYYeNexzXXXedJOktb3mLbrrpJn35y1/WKaecoiOPPPJApwgAAABgGiNMBwAAwIT4f//v/2nRokX6+te/rlNOOUVr1qzRjBkztHr1an3961/XCSecoP/93//VggUL0vfMmDFDP/vZz1RZWakrrrhC99xzj2688UadccYZ4x7H0UcfrYcfflhNTU1avXq17rrrLl133XV6//vfPxHTBAAAADBNWS67NQEAAAAAAAAAMCZWpgMAAAAAAAAAkANhOgAAAAAAAAAAORCmAwAAAAAAAACQA2E6AAAAAAAAAAA5EKYDAAAAAAAAAJADYToAAAAAAAAAADkQpgMAAAAAAAAAkANhOgAAAAAAAAAAORCmAwAAAAAAAACQA2E6AAAAAAAAAAA5EKYDAAAAAAAAAJADYToAAAAAAAAAADkQpgMAAAAAAAAAkMP/B8+ZPYgpDIDFAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot training loss metrics comparison between 4-bit and 8-bit\n", + "print(\"\\n==== Training & Evaluation Loss Comparison: 4-bit vs 8-bit ====\\n\")\n", + "plot_loss_metrics(flflow_4bit, flflow_8bit)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "397cb9c7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "==== Aggregated Performance Metrics: 4-bit vs 8-bit ====\n", + "\n" + ] + }, + { + "data": { + "image/png": "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Wo2qVatizpw52Lx5c4FMK+Lj44PQ0FD069cPNWvWRNmyZWFmZgYjIyM4Ojqifv364muScf7sL774AuHh4Rg9ejRq1qwJGxsbGBkZwc7ODnXr1sWUKVMQHh6ODz/88L23I6PCHNv78uuvv2L16tUICgqCpaUlLCwsUK9ePWzcuDHb6SD0GTBgAH7++WcEBARIfqafW5988onOXPMffvih3hF/VlZWWLduHQYPHoy6devCzc0NFhYWMDIygr29PWrXro1x48bhypUrqFy5co5jMDU1xfbt2/Hnn3+iS5cuKF++PNRqNZRKJaytrVGtWjUMHDgQ58+fx/Dhw/PcZgDo0aMHjh49irZt28Le3h4mJibw8/PDzJkzsWvXrhwvqJzG398fu3fvRtOmTWFra5unubAVCgXGjBmD+/fv4/vvv0ezZs3g4uIimSIHAJydnXH16lVxCqqMbG1tcfToUYSEhKB06dIwNjaGu7s7hgwZgkuXLmX5GtnZ2eH48eP46quvUKZMGRgbG6NMmTIICQnBhQsXUKFChVy3LydcXFxw4MABtG3bFqVKlSqw6ZyMjY2xf/9+jBo1Ch4eHjA2NoajoyM6deqE06dPo379+tme46+//kLfvn3h6uoqWbRVrtGjR+PSpUsYNGgQqlSpAisrKxgZGYmLds6dOxdXrlxBjRo1cn0NQ2nUqBGuX7+OefPmoWnTpnBycoKxsTFMTU1RtmxZNGnSBOPGjcOJEyfQvXv39x5PUX+uDZ2vpUuXxsGDB7FlyxZ07twZHh4eUKvVMDU1Rbly5dCiRQuMGjVKcoyxsTFWrlyJI0eOoHfv3vDz84OlpSVUKhWsra1RpUoVdO/eHb///jtOnz79XuMnIiIiw1IIwnv+jT8REem4d++eZIGqRo0aiVNUEBEVZXv37kWbNm3EKRk6duyIP/74o1isF0BERERERCUP/ydDRERERPmmefPmkkVVN2/ejAEDBhgwIiIiIiIiotxjBzoRERER5auePXviu+++E7eXLVuGCRMmGDAiIiIiIiKi3OEULkREBsApXIiIiIiIiIiICj92oBMRERERERERERER6cEpXIiIiIiIiIiIiIiI9GAHOhERERERERERERGRHkaGDkCfxYsX48cff8Tjx4/h7++Pn376CbVr1860fkxMDMaNG4ctW7bg5cuXcHd3x/z589G6detc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QVEUpbVPIhVwlWciIiIiIiIiotbF+AwRtTROP7ZDsixjy5YtXECEKEkcM0T6cMwQ6cMxQ6QPxwyRPhwzRERNwwB6OyTLMg4ePMgPT6IkccwQ6cMxQ6QPxwyRPhwzRPpwzBARNQ0D6EREREREREREREREcRhb+wRSRbBUfHV1dSufSdP5/X7U1dWhuroaRiN/BIgS4Zgh0odjhkgfjhkifThmiPRJtzETjMtwST8iaimp/87ZQmpqagAAZWVlrXwmRERERERERETtW01NDex2e2ufBhG1A4LCKbukyLKM8vJyZGdnQxCE1j6dJqmurkZZWRl27drFFauJksAxQ6QPxwyRPhwzRPpwzBDpk25jRlEU1NTUoKSkBKLIysREdOQxAz1JoiiitLS0tU+jWeXk5KTFhydRS+GYIdKHY4ZIH44ZIn04Zoj0Sacxw8xzImpJnKojIiIiIiIiIiIiIoqDAXQiIiIiIiIiIiIiojgYQG+HLBYL7r//flgsltY+FaKUwDFDpA/HDJE+HDNE+nDMEOnDMUNE1DRcRJSIiIiIiIiIiIiIKA5moBMRERERERERERERxcEAOhERERERERERERFRHAygExERERERERERERHFwQB6mnrxxRfRrVs3WK1WjB07FosXL25w/w8//BD9+vWD1WrF4MGD8dVXX7XQmRK1DXrGzKuvvoqJEyciLy8PeXl5mDZtWsIxRpRu9H7OBL333nsQBAGnn376kT1BojZG75hxOBy49tpr0alTJ1gsFvTp04e/n1G7onfMPPvss+jbty9sNhvKyspw0003we12t9DZErWuH3/8EaeccgpKSkogCAI++eSThM+ZO3cuRowYAYvFgl69euHf//73ET9PIqJUxQB6Gnr//fdx88034/7778fy5csxdOhQzJgxAwcOHIi7/4IFC3D++efjsssuw4oVK3D66afj9NNPx+rVq1v4zIlah94xM3fuXJx//vn44YcfsHDhQpSVlWH69OnYs2dPC585UevQO2aCtm/fjltvvRUTJ05soTMlahv0jhmv14vjjjsO27dvx0cffYQN/9/e3cdUWfdxHP8cEULmyCc4CNI0cbMNkeYjSAppc5PhamtolBJqzh58IhNBnhRDTHO1kZnoYvxBPrR0Fgx8ioKmTHC02sA6R5gbC5U2MiHH07n/8tz3ieO9gDzXAd+v7fxx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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot aggregated metrics comparison\n", + "print(\"\\n==== Aggregated Performance Metrics: 4-bit vs 8-bit ====\\n\")\n", + "plot_aggregated_metrics(flflow_4bit, flflow_8bit)" + ] + }, + { + "cell_type": "markdown", + "id": "4c089e09", + "metadata": {}, + "source": [ + "### Memory Efficiency Comparison\n", + "\n", + "- **4-bit Quantization**: Uses less memory overall, allowing for larger batch sizes or model sizes on the same hardware.\n", + "- **8-bit Quantization**: Requires more memory but still offers significant savings compared to full precision (FP16/FP32).\n", + "- **Peak Memory Usage**: The difference in peak memory consumption shows the trade-off between precision and memory requirements.\n", + "\n", + "### Training Performance Comparison\n", + "\n", + "- **Training Loss**: 8-bit quantization typically maintains closer fidelity to the original model, potentially leading to slightly better training convergence.\n", + "- **Evaluation Loss**: The evaluation metrics help determine if the higher precision of 8-bit quantization translates to better model performance.\n", + "\n", + "### Use Case Recommendations\n", + "\n", + "- **Resource-constrained environments**: 4-bit quantization provides better memory efficiency for edge devices or limited GPU resources.\n", + "- **Higher precision needs**: If model accuracy is critical and resources permit, 8-bit quantization offers a good balance between performance and efficiency.\n", + "- **Federated Learning Impact**: The quantization choice particularly affects resource utilization across collaborators in the federated setting." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (myenv)", + "language": "python", + "name": "myenv" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From f2a2eedf04a3e8be624e35cb7de2319b58214e4d Mon Sep 17 00:00:00 2001 From: Rajith Date: Fri, 16 May 2025 15:45:01 +0530 Subject: [PATCH 30/34] removed older code --- .../LLM/phi-4-with4bit quantization.ipynb | 1772 ----------------- 1 file changed, 1772 deletions(-) delete mode 100644 openfl-tutorials/experimental/workflow/LLM/phi-4-with4bit quantization.ipynb diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-with4bit quantization.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-with4bit quantization.ipynb deleted file mode 100644 index e2efa9054b..0000000000 --- a/openfl-tutorials/experimental/workflow/LLM/phi-4-with4bit quantization.ipynb +++ /dev/null @@ -1,1772 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "a59f475d-d843-46bc-b75e-10984b687ed3", - "metadata": {}, - "source": [ - "# Enhanced Federated Fine-Tuning of Phi-4 Using OpenFL with PEFT & Quantization" - ] - }, - { - "cell_type": "markdown", - "id": "20c74cb9-51a2-42e2-893f-d280e227e8bf", - "metadata": {}, - "source": [ - "In this tutorial, we demonstrate how to fine-tune Microsoft's Phi-4 model in a federated learning workflow with enhanced local training using:\n", - "- Parameter-Efficient Fine-Tuning (PEFT)\n", - "- 4-bit Quantization (QLoRA)\n", - "- Gradient Checkpointing\n", - "- Optimized Training Configuration" - ] - }, - { - "cell_type": "markdown", - "id": "d07c32d3-1a8d-4162-af45-bc3a10e0ae3f", - "metadata": {}, - "source": [ - "## Installation" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "05b2ad75-8c7b-499c-902e-dbd5b24361bc", - "metadata": {}, - "outputs": [], - "source": [ - "!pip install torch transformers peft datasets trl==0.12.2 bitsandbytes accelerate -q" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "a7ae1a7e-8c16-4c5a-be57-33d84723aed7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Thu May 15 13:27:27 2025 \n", - "+-----------------------------------------------------------------------------------------+\n", - "| NVIDIA-SMI 550.144.03 Driver Version: 550.144.03 CUDA Version: 12.4 |\n", - "|-----------------------------------------+------------------------+----------------------+\n", - "| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |\n", - "| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |\n", - "| | | MIG M. |\n", - "|=========================================+========================+======================|\n", - "| 0 NVIDIA H100 NVL Off | 00000001:00:00.0 Off | 0 |\n", - "| N/A 39C P0 62W / 400W | 1MiB / 95830MiB | 0% Default |\n", - "| | | Disabled |\n", - "+-----------------------------------------+------------------------+----------------------+\n", - " \n", - "+-----------------------------------------------------------------------------------------+\n", - "| Processes: |\n", - "| GPU GI CI PID Type Process name GPU Memory |\n", - "| ID ID Usage |\n", - "|=========================================================================================|\n", - "| No running processes found |\n", - "+-----------------------------------------------------------------------------------------+\n" - ] - } - ], - "source": [ - "!nvidia-smi" - ] - }, - { - "cell_type": "markdown", - "id": "440a9c39-ec42-45a5-80f6-9a9e0bc90d2f", - "metadata": {}, - "source": [ - "## Import Libraries" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "be4690ae-0671-4d3a-8f21-620ab865a03e", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/azureuser/env_name/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n", - "2025-05-15 13:27:30,648\tINFO util.py:154 -- Missing packages: ['ipywidgets']. Run `pip install -U ipywidgets`, then restart the notebook server for rich notebook output.\n" - ] - } - ], - "source": [ - "# System imports\n", - "import os\n", - "import numpy as np\n", - "\n", - "# PyTorch imports\n", - "import torch\n", - "\n", - "# Hugging Face Transformers imports for model loading and training\n", - "from transformers import (\n", - " AutoModelForCausalLM, # For loading large language models\n", - " AutoTokenizer, # For tokenizing text inputs\n", - " BitsAndBytesConfig, # For 4-bit quantization configuration\n", - " TrainingArguments # For configuring training hyperparameters\n", - ")\n", - "\n", - "# PEFT (Parameter-Efficient Fine-Tuning) imports\n", - "from peft import (\n", - " LoraConfig, # For configuring Low-Rank Adaptation\n", - " get_peft_model, # For applying PEFT to a model\n", - " prepare_model_for_kbit_training, # For preparing quantized models for training\n", - " PeftModel # Base class for PEFT models\n", - ")\n", - "from peft.utils import get_peft_model_state_dict, set_peft_model_state_dict # For state dict manipulation\n", - "\n", - "# Dataset and training imports\n", - "from datasets import load_dataset\n", - "from trl import SFTTrainer # Supervised Fine-Tuning Trainer\n", - "\n", - "# OpenFL imports for federated learning\n", - "from openfl.experimental.workflow.interface import Aggregator, Collaborator, FLSpec\n", - "from openfl.experimental.workflow.placement import aggregator, collaborator\n", - "from openfl.experimental.workflow.runtime import LocalRuntime" - ] - }, - { - "cell_type": "markdown", - "id": "06274755", - "metadata": {}, - "source": [ - "## Acquiring and preprocessing dataset" - ] - }, - { - "cell_type": "markdown", - "id": "a6edefa4", - "metadata": {}, - "source": [ - "We can download the dataset directly from the [LLM-Adapters repository](https://github.com/AGI-Edgerunners/LLM-Adapters)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "962ac825", - "metadata": {}, - "outputs": [], - "source": [ - "# Import libraries needed for downloading and verifying the dataset\n", - "import hashlib\n", - "import requests\n", - "\n", - "def file_checksum(file_path, algorithm=\"sha256\"):\n", - " \"\"\"\n", - " Calculate the checksum of a file using the specified hashing algorithm.\n", - " \n", - " Args:\n", - " file_path (str): The path to the file for which the checksum is to be calculated.\n", - " algorithm (str): The hashing algorithm to use (default is 'sha256').\n", - " \n", - " Returns:\n", - " str: The calculated checksum of the file.\n", - " \"\"\"\n", - " hash_func = hashlib.new(algorithm)\n", - " with open(file_path, \"rb\") as f:\n", - " for chunk in iter(lambda: f.read(4096), b\"\"):\n", - " hash_func.update(chunk)\n", - " return hash_func.hexdigest()\n", - "\n", - "\n", - "# Download the dataset if it doesn't exist locally\n", - "if not os.path.exists(\"math_10k.json\"):\n", - " print(\"Downloading math_10k.json dataset...\")\n", - " r = requests.get(\n", - " \"https://raw.githubusercontent.com/AGI-Edgerunners/LLM-Adapters/main/ft-training_set/math_10k.json\",\n", - " )\n", - " with open(\n", - " \"math_10k.json\",\n", - " \"wb\",\n", - " ) as f:\n", - " f.write(r.content)\n", - " print(\"Download complete.\")\n", - "\n", - " # Verify the integrity of the downloaded file\n", - " actual_checksum = file_checksum(\"math_10k.json\")\n", - " expected_checksum = \"0342d0d860ad8592b579329337c90e42eefd3d9f2898043140cbd120630418b8\"\n", - " if actual_checksum != expected_checksum:\n", - " raise ValueError(\n", - " \"Checksum verification failed. The file may have been altered.\"\n", - " )\n", - " print(\"Checksum verification successful.\")\n", - "else:\n", - " print(\"Dataset already exists locally.\")\n", - "\n", - "# Set the dataset path to be used later\n", - "dataset_name = \"math_10k.json\"" - ] - }, - { - "cell_type": "markdown", - "id": "08576aa0-f628-4ae6-8fc3-dd167d164784", - "metadata": {}, - "source": [ - "## Configuration" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "eada9809-468a-47c6-9b03-55aa887c9487", - "metadata": {}, - "outputs": [], - "source": [ - "# Model and dataset configuration\n", - "model_name = \"microsoft/phi-4\" # Pre-trained model identifier from Hugging Face Hub\n", - "#dataset_name = \"math_10k.json\" # Dataset file containing mathematical QA pairs\n", - "\n", - "# QLoRA (Quantized Low-Rank Adaptation) configuration for 4-bit quantization\n", - "# This reduces memory footprint while maintaining model quality\n", - "bnb_config = BitsAndBytesConfig(\n", - " load_in_4bit=True, # Enable 4-bit quantization\n", - " bnb_4bit_quant_type=\"nf4\", # Use normalized float 4 format for better precision\n", - " bnb_4bit_compute_dtype=torch.bfloat16, # Computation precision\n", - " bnb_4bit_use_double_quant=False, # Disable nested quantization for simplicity\n", - ")\n", - "\n", - "# LoRA (Low-Rank Adaptation) configuration for parameter-efficient fine-tuning\n", - "# This allows fine-tuning with significantly fewer parameters\n", - "peft_config = LoraConfig(\n", - " r=8, # Rank of the update matrices (higher = more capacity but more parameters)\n", - " lora_alpha=16, # Scaling factor for the trained weights\n", - " lora_dropout=0.01, # Dropout probability for LoRA layers\n", - " bias=\"none\", # Don't train bias parameters to reduce memory\n", - " task_type=\"CAUSAL_LM\", # Specify causal language modeling task\n", - " target_modules=\"all-linear\", # Apply LoRA to all linear layers\n", - ")\n", - "\n", - "# Training hyperparameters configuration\n", - "training_args = TrainingArguments(\n", - " output_dir=\"./results\", # Directory to save checkpoints and logs\n", - " num_train_epochs=1, # Number of training epochs\n", - " per_device_train_batch_size=2, # Batch size per GPU/TPU core\n", - " gradient_accumulation_steps=2, # Number of updates steps to accumulate before backward pass\n", - " optim=\"adamw_torch_fused\", # Optimizer to use (fused for better performance)\n", - " save_steps=100, # Save checkpoint every X updates steps\n", - " logging_steps=10, # Log metrics every X updates steps\n", - " learning_rate=3e-4, # Initial learning rate\n", - " weight_decay=0.001, # Weight decay regularization\n", - " fp16=False, # Disable FP16 training (using BF16 instead)\n", - " bf16=True, # Enable BF16 training (better numerical stability than FP16)\n", - " max_grad_norm=0.5, # Max gradient norm for gradient clipping\n", - " warmup_ratio=0.02, # Portion of steps for learning rate warmup\n", - " lr_scheduler_type=\"cosine\", # Learning rate scheduler type\n", - " gradient_checkpointing=True, # Enable gradient checkpointing to save memory\n", - " report_to=\"none\" # Disable reporting to tracking platforms\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "ffe93234-2a1a-4809-a431-efe2f35ce496", - "metadata": {}, - "source": [ - "## Load and Prepare Model" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "8ab371f1-64c3-4225-82e7-fb3c5b05578c", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████████████████| 6/6 [00:04<00:00, 1.36it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "trainable params: 27,852,800 || all params: 14,687,360,000 || trainable%: 0.1896\n" - ] - } - ], - "source": [ - "# Load tokenizer\n", - "tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)\n", - "tokenizer.pad_token = tokenizer.eos_token\n", - "tokenizer.padding_side = \"right\"\n", - "\n", - "# Load model with quantization\n", - "model = AutoModelForCausalLM.from_pretrained(\n", - " model_name,\n", - " quantization_config=bnb_config,\n", - " device_map=\"auto\",\n", - " trust_remote_code=True\n", - ")\n", - "\n", - "# Prepare model for k-bit training\n", - "model = prepare_model_for_kbit_training(model, use_gradient_checkpointing=True)\n", - "\n", - "# Apply LoRA\n", - "model = get_peft_model(model, peft_config)\n", - "model.print_trainable_parameters()" - ] - }, - { - "cell_type": "markdown", - "id": "dd058fff-f6dd-4cc6-acaf-7e2fa2c1132d", - "metadata": {}, - "source": [ - "## Load and Prepare Dataset" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4392ddab-10b7-41f6-a8e0-65ba298ea457", - "metadata": {}, - "outputs": [], - "source": [ - "def format_prompt(example):\n", - " \"\"\"\n", - " Format a dataset example into a standardized prompt-response format for instruction tuning.\n", - " \n", - " This function converts raw dataset examples into a structured format suitable for\n", - " instruction fine-tuning of large language models. The format follows the common\n", - " pattern used for instruction-following tasks with clear section demarcation.\n", - " \n", - " Args:\n", - " example (dict): A dictionary containing the example data with keys:\n", - " - 'instruction': The task instruction\n", - " - 'input': The optional input context (may be empty)\n", - " - 'output': The expected output/response\n", - " \n", - " Returns:\n", - " str: A formatted prompt string with instruction, optional input, and response\n", - " \"\"\"\n", - " if example[\"input\"]:\n", - " return f\"\"\"Below is an instruction that describes a task. Write a response that appropriately completes the request.\n", - "\n", - "### Instruction:\n", - "{example['instruction']}\n", - "\n", - "### Input:\n", - "{example['input']}\n", - "\n", - "### Response:\n", - "{example['output']}\"\"\"\n", - " else:\n", - " return f\"\"\"Below is an instruction that describes a task. Write a response that appropriately completes the request.\n", - "\n", - "### Instruction:\n", - "{example['instruction']}\n", - "\n", - "### Response:\n", - "{example['output']}\"\"\"\n", - "\n", - "# Load dataset from JSON file (contains mathematical question-answer pairs)\n", - "dataset = load_dataset(\"json\", data_files=dataset_name, split=\"train\", num_proc=4)\n", - "\n", - "# Transform raw examples into formatted text for instruction tuning\n", - "dataset = dataset.map(lambda x: {\"text\": format_prompt(x)}, num_proc=4)\n", - "\n", - "# Split dataset into training (90%) and evaluation (10%) sets\n", - "dataset = dataset.train_test_split(test_size=0.1)\n", - "train_dataset = dataset[\"train\"]\n", - "eval_dataset = dataset[\"test\"]" - ] - }, - { - "cell_type": "markdown", - "id": "812cfcc8-33ec-4a2b-8a74-27bfc2a41d7b", - "metadata": {}, - "source": [ - "## Enhanced Training with SFTTrainer" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "6dc85c57-68b2-4514-9373-43e3d7c05c10", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': dataset_text_field, max_seq_length, packing. Will not be supported from version '0.13.0'.\n", - "\n", - "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", - " warnings.warn(message, FutureWarning)\n", - "/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "Generating train split: 1820 examples [00:02, 613.71 examples/s]\n", - "Generating train split: 209 examples [00:00, 582.95 examples/s]\n" - ] - } - ], - "source": [ - "trainer = SFTTrainer(\n", - " model=model,\n", - " train_dataset=train_dataset,\n", - " eval_dataset=eval_dataset,\n", - " peft_config=peft_config,\n", - " dataset_text_field=\"text\",\n", - " max_seq_length=1024,\n", - " tokenizer=tokenizer,\n", - " args=training_args,\n", - " packing=True,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "810eb75e", - "metadata": {}, - "source": [ - "## Federated Averaging Function" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "58298e8e-ab9e-4377-966e-143823441697", - "metadata": {}, - "outputs": [], - "source": [ - "def FedAvg(peft_params, model, weights=None):\n", - " \"\"\"\n", - " Perform Federated Averaging (FedAvg) on the model parameters.\n", - " \n", - " This function aggregates PEFT parameters from multiple collaborators using weighted\n", - " averaging. It handles the complex task of averaging parameters while maintaining \n", - " the correct tensor types and shapes required by the PEFT framework.\n", - " \n", - " Args:\n", - " peft_params (list): A list of state dictionaries containing PEFT parameters from different collaborators.\n", - " model (torch.nn.Module): The base model to which the averaged parameters will be applied.\n", - " weights (list, optional): A list of weights for averaging the parameters. If None, equal weights are used.\n", - " Weights determine the contribution of each collaborator to the final model.\n", - " \n", - " Returns:\n", - " torch.nn.Module: The model with the averaged parameters applied.\n", - " \n", - " Notes:\n", - " The function converts tensors to float for averaging to avoid precision issues,\n", - " then converts back to the original data type for model compatibility.\n", - " \"\"\"\n", - " # Store the state dictionaries for easy access\n", - " state_dicts = peft_params\n", - " # Get the current state dict from the model as a template\n", - " state_dict = get_peft_model_state_dict(model)\n", - " \n", - " # Iterate through each parameter in the first state dict as reference\n", - " for key in peft_params[0]:\n", - " # Store original data type for later conversion\n", - " dtype = state_dicts[0][key].dtype\n", - " \n", - " # Convert all tensors to float, move to CPU, perform weighted average\n", - " state_dict[key] = torch.from_numpy(\n", - " np.average(\n", - " [state[key].cpu().to(torch.float).numpy() for state in state_dicts], \n", - " axis=0, \n", - " weights=weights\n", - " )\n", - " ).to(dtype) # Convert back to original data type\n", - " \n", - " # Apply the averaged parameters back to the model\n", - " set_peft_model_state_dict(model, state_dict)\n", - " return model" - ] - }, - { - "cell_type": "markdown", - "id": "e120a656-f4a5-47a5-a3d4-62c5f3672bba", - "metadata": {}, - "source": [ - "## Federated Learning Workflow" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e5e108c6-5150-4931-9c01-6b64a913fa04", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Aggregator step \"start\" registered\n", - "Collaborator step \"aggregated_model_validation\" registered\n", - "Collaborator step \"train\" registered\n", - "Collaborator step \"local_model_validation\" registered\n", - "Aggregator step \"join\" registered\n", - "Aggregator step \"end\" registered\n" - ] - } - ], - "source": [ - "# Import the required PrinterCallback for proper initialization/removal\n", - "from transformers.trainer_callback import PrinterCallback\n", - "import transformers\n", - "\n", - "class FederatedFlow(FLSpec):\n", - " \"\"\"\n", - " Federated Learning workflow for fine-tuning Phi-4 model with PEFT and quantization.\n", - " \n", - " This class implements the complete federated learning workflow for a language model,\n", - " including initialization, aggregated model validation, training, local model validation,\n", - " and parameter aggregation. It uses Parameter-Efficient Fine-Tuning (PEFT) with 4-bit\n", - " quantization to efficiently train large language models in memory-constrained environments.\n", - " \n", - " The workflow follows these steps for each round:\n", - " 1. Initialize model on each collaborator\n", - " 2. Validate the aggregated model on local data\n", - " 3. Train the model locally on each collaborator\n", - " 4. Validate the locally trained model\n", - " 5. Aggregate PEFT parameters from all collaborators using FedAvg\n", - " 6. Repeat for specified number of rounds\n", - " \n", - " Attributes:\n", - " model: The base language model being fine-tuned\n", - " peft_params: PEFT parameters dictionary for the model\n", - " optimizer: Optimizer for training (optional)\n", - " rounds: Number of federated learning rounds to perform\n", - " current_round: Counter for the current round\n", - " collaborators: List of collaborators participating in federated learning\n", - " \"\"\"\n", - " def __init__(self, model=None, optimizer=None, rounds=3, **kwargs):\n", - " \"\"\"\n", - " Initialize the federated learning workflow.\n", - " \n", - " Args:\n", - " model: The base language model to fine-tune. Must be provided.\n", - " optimizer: Optional optimizer for model training.\n", - " rounds: Number of federated learning rounds to perform (default: 3).\n", - " **kwargs: Additional arguments passed to the parent class.\n", - " \n", - " Raises:\n", - " ValueError: If no model is provided.\n", - " \"\"\"\n", - " super().__init__(**kwargs)\n", - " if model is not None:\n", - " self.model = model\n", - " self.peft_params = get_peft_model_state_dict(self.model)\n", - " self.optimizer = optimizer\n", - " else:\n", - " raise ValueError(\"No model inputted\")\n", - "\n", - " self.rounds = rounds\n", - " \n", - "\n", - " @aggregator\n", - " def start(self):\n", - " \"\"\"\n", - " Start the federated learning process on the aggregator.\n", - " \n", - " This method initializes the workflow by:\n", - " 1. Setting up the list of collaborators from the runtime\n", - " 2. Initializing the current round counter\n", - " 3. Starting the first step of the workflow by sending the model\n", - " to all collaborators for validation\n", - " \n", - " The @aggregator decorator ensures this method runs on the aggregator node.\n", - " \"\"\"\n", - " print(f\"Performing initialization for model\")\n", - " self.collaborators = self.runtime.collaborators\n", - " self.current_round = 0\n", - " # Start the workflow by sending the model to all collaborators\n", - " self.next(\n", - " self.aggregated_model_validation,\n", - " foreach=\"collaborators\",\n", - " )\n", - "\n", - " \n", - " @collaborator\n", - " def aggregated_model_validation(self):\n", - " \"\"\"\n", - " Validate the aggregated model on each collaborator's local dataset.\n", - " \n", - " This method:\n", - " 1. Loads the model with appropriate quantization configuration\n", - " 2. Applies the PEFT configuration and parameters\n", - " 3. Creates a trainer with local validation dataset\n", - " 4. Evaluates the model and records the validation loss\n", - " 5. Transitions to the training phase\n", - " \n", - " The @collaborator decorator ensures this method runs on each collaborator node.\n", - " \n", - " Notes:\n", - " Includes fallback to CPU if GPU memory is insufficient\n", - " \"\"\"\n", - " print(f\"Performing aggregated model validation for collaborator {self.input}\")\n", - " # Load model with quantization and CPU offloading if needed\n", - " device_map = \"auto\" \n", - " try:\n", - " # Try to load model on GPU with quantization\n", - " self.model = AutoModelForCausalLM.from_pretrained(\n", - " model_name,\n", - " quantization_config=bnb_config,\n", - " device_map=device_map,\n", - " #max_memory={0: \"4GiB\", \"cpu\": \"24GiB\"},\n", - " trust_remote_code=True\n", - " )\n", - " except ValueError:\n", - " # Fallback to CPU if GPU memory is insufficient\n", - " print(f\"Falling back to CPU mode for {self.input}\")\n", - " self.model = AutoModelForCausalLM.from_pretrained(\n", - " model_name,\n", - " device_map=\"cpu\",\n", - " trust_remote_code=True\n", - " )\n", - " \n", - " # Prepare model for training with quantization\n", - " self.model = prepare_model_for_kbit_training(self.model)\n", - " # Apply PEFT configuration (LoRA)\n", - " self.model = get_peft_model(self.model, peft_config)\n", - " # Load aggregated parameters\n", - " set_peft_model_state_dict(self.model, self.peft_params)\n", - " \n", - " # Setup trainer for evaluation\n", - " trainer = SFTTrainer(\n", - " model=self.model,\n", - " args=training_args,\n", - " peft_config=peft_config,\n", - " train_dataset=self.train_dataset,\n", - " eval_dataset=self.eval_dataset,\n", - " max_seq_length=1024,\n", - " dataset_text_field=\"text\",\n", - " tokenizer=tokenizer,\n", - " packing=True,\n", - " data_collator=transformers.DataCollatorForSeq2Seq(\n", - " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", - " ),\n", - " )\n", - "\n", - " # Remove default printer callback to avoid verbose output\n", - " trainer.remove_callback(PrinterCallback)\n", - " # Evaluate model and store metrics\n", - " out = trainer.evaluate()\n", - " self.agg_validation_score = out[\"eval_loss\"]\n", - " print(f\"{self.input} value of {self.agg_validation_score}\")\n", - " # Move to training phase\n", - " self.next(self.train)\n", - "\n", - " @collaborator\n", - " def train(self):\n", - " \"\"\"\n", - " Train the model on each collaborator's local dataset.\n", - " \n", - " This method:\n", - " 1. Creates an SFTTrainer with the local training dataset\n", - " 2. Runs the training process\n", - " 3. Records the training loss\n", - " 4. Saves the trained model\n", - " 5. Transitions to local validation phase\n", - " \n", - " The @collaborator decorator ensures this method runs on each collaborator node.\n", - " \"\"\"\n", - " # Setup trainer for local training\n", - " trainer = SFTTrainer(\n", - " model=self.model,\n", - " args=training_args,\n", - " peft_config=peft_config,\n", - " train_dataset=self.train_dataset,\n", - " eval_dataset=self.eval_dataset,\n", - " max_seq_length=1024,\n", - " dataset_text_field=\"text\",\n", - " tokenizer=tokenizer,\n", - " packing=True,\n", - " data_collator=transformers.DataCollatorForSeq2Seq(\n", - " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", - " ),\n", - " )\n", - "\n", - " # Execute training\n", - " out = trainer.train()\n", - " # Store training loss for later analysis\n", - " self.loss = out.training_loss\n", - " # Save locally trained model\n", - " trainer.save_model()\n", - " self.training_completed = True\n", - " # Move to local validation phase\n", - " self.next(self.local_model_validation)\n", - "\n", - " @collaborator\n", - " def local_model_validation(self):\n", - " \"\"\"\n", - " Validate the locally trained model on each collaborator's validation dataset.\n", - " \n", - " This method:\n", - " 1. Creates an SFTTrainer with the local validation dataset\n", - " 2. Evaluates the locally trained model\n", - " 3. Records the validation loss\n", - " 4. Extracts the PEFT parameters for aggregation\n", - " 5. Sends results to the aggregator for parameter aggregation\n", - " \n", - " The @collaborator decorator ensures this method runs on each collaborator node.\n", - " \n", - " Notes:\n", - " Excludes the full model and training flags from the data sent to the aggregator\n", - " to reduce communication overhead\n", - " \"\"\"\n", - " # Setup trainer for evaluation\n", - " trainer = SFTTrainer(\n", - " model=self.model,\n", - " args=training_args,\n", - " peft_config=peft_config,\n", - " train_dataset=self.train_dataset,\n", - " eval_dataset=self.eval_dataset,\n", - " max_seq_length=1024,\n", - " dataset_text_field=\"text\",\n", - " tokenizer=tokenizer,\n", - " packing=True,\n", - " data_collator=transformers.DataCollatorForSeq2Seq(\n", - " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", - " ),\n", - " )\n", - " # Evaluate the locally trained model\n", - " out = trainer.evaluate()\n", - " self.local_validation_score = out[\"eval_loss\"]\n", - " # Extract PEFT parameters for aggregation\n", - " self.peft_params = get_peft_model_state_dict(self.model)\n", - " print(f\"Doing local model validation for collaborator {self.input}\")\n", - " # Send results to aggregator, excluding the full model and training flags\n", - " # to reduce communication overhead\n", - " self.next(self.join, exclude=[\"training_completed\", \"model\"])\n", - "\n", - " @aggregator\n", - " def join(self, inputs):\n", - " \"\"\"\n", - " Aggregate results from all collaborators and update the global model.\n", - " \n", - " This method:\n", - " 1. Calculates average loss, aggregated model accuracy, and local model accuracy\n", - " 2. Updates the global model using Federated Averaging (FedAvg)\n", - " 3. Saves the aggregated model and tokenizer\n", - " 4. Either starts the next round or ends the workflow depending on round count\n", - " \n", - " Args:\n", - " inputs: List of data objects from all collaborators containing validation scores\n", - " and PEFT parameters.\n", - " \n", - " The @aggregator decorator ensures this method runs on the aggregator node.\n", - " \"\"\"\n", - " # Calculate average metrics across all collaborators\n", - " self.average_loss = sum(input.loss for input in inputs) / len(inputs)\n", - " self.aggregated_model_accuracy = sum(\n", - " input.agg_validation_score for input in inputs\n", - " ) / len(inputs)\n", - " self.local_model_accuracy = sum(\n", - " input.local_validation_score for input in inputs\n", - " ) / len(inputs)\n", - " \n", - " # Display aggregated metrics\n", - " print(\n", - " f\"Average aggregated model validation values = {self.aggregated_model_accuracy}\"\n", - " )\n", - " print(f\"Average training loss = {self.average_loss}\")\n", - " print(f\"Average local model validation values = {self.local_model_accuracy}\")\n", - "\n", - " # Perform federated averaging of model parameters\n", - " self.model = FedAvg([input.peft_params for input in inputs], self.model)\n", - " self.peft_params = get_peft_model_state_dict(self.model)\n", - "\n", - " # Save the aggregated model for future use\n", - " self.model.save_pretrained(\"./aggregated/model\")\n", - " tokenizer.save_pretrained(\"./aggregated/tokenizer\")\n", - " \n", - " # Increment round counter and start next round or end workflow\n", - " self.current_round += 1\n", - " if self.current_round < self.rounds:\n", - " self.next(\n", - " self.aggregated_model_validation,\n", - " foreach=\"collaborators\",\n", - " exclude=[\"model\"],\n", - " )\n", - " else:\n", - " self.next(self.end)\n", - "\n", - " @aggregator\n", - " def end(self):\n", - " \"\"\"\n", - " End the federated learning process.\n", - " \n", - " This method marks the end of the federated learning workflow after all rounds\n", - " have been completed. The final aggregated model and tokenizer are already saved\n", - " in the last join step.\n", - " \n", - " The @aggregator decorator ensures this method runs on the aggregator node.\n", - " \"\"\"\n", - " print(f\"This is the end of the flow\")" - ] - }, - { - "cell_type": "markdown", - "id": "7bc8fe27", - "metadata": {}, - "source": [ - "## Run Federated Learning" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "38894111-41d9-4dd4-b1c8-eb7ec3cdd3e1", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Calling start\n", - "\u001b[94mPerforming initialization for model\u001b[0m\u001b[94m\n", - "\u001b[0m\n", - "Calling aggregated_model_validation\n", - "\u001b[94mPerforming aggregated model validation for collaborator Portland\u001b[0m\u001b[94m\n", - "\u001b[0m" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.30it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", - "\n", - "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", - " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "Generating train split: 913 examples [00:01, 623.08 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", - "Generating train split: 104 examples [00:00, 583.62 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", - "\u001b[0m" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - " \n", - " [13/13 00:12]\n", - "
\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[94mPortland value of 0.5918120741844177\u001b[0m\u001b[94m\n", - "\u001b[0m\n", - "Calling train\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", - "\n", - "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", - " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "Generating train split: 913 examples [00:01, 616.37 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", - "Generating train split: 104 examples [00:00, 615.85 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", - "\u001b[0m`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`...\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - " \n", - " [228/228 08:54, Epoch 0/1]\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
StepTraining Loss
100.516900
200.373400
300.346100
400.339100
500.333000
600.323700
700.329800
800.312800
900.326000
1000.306800
1100.314900
1200.328300
1300.311300
1400.313400
1500.315400
1600.312200
1700.303000
1800.307400
1900.307600
2000.312500
2100.307000
2200.308000

" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Calling local_model_validation\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", - "\n", - "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", - " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m" - ] - }, - { - "data": { - "text/html": [ - "\n", - "

\n", - " \n", - " \n", - " [13/13 00:13]\n", - "
\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", - "\u001b[0mShould transfer from local_model_validation to join\n", - "\n", - "Calling aggregated_model_validation\n", - "\u001b[94mPerforming aggregated model validation for collaborator Seattle\u001b[0m\u001b[94m\n", - "\u001b[0m" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.32it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", - "\n", - "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", - " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "Generating train split: 907 examples [00:01, 626.09 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", - "Generating train split: 105 examples [00:00, 634.41 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", - "\u001b[0m" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - " \n", - " [14/14 00:13]\n", - "
\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[94mSeattle value of 0.589488685131073\u001b[0m\u001b[94m\n", - "\u001b[0m\n", - "Calling train\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", - "\n", - "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", - " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - " \n", - " [227/227 08:53, Epoch 1/1]\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
StepTraining Loss
100.500700
200.392300
300.364500
400.327800
500.342000
600.310900
700.318500
800.317900
900.333300
1000.321300
1100.312500
1200.301500
1300.314000
1400.317100
1500.316800
1600.318300
1700.318000
1800.295800
1900.311000
2000.310900
2100.327200
2200.311600

" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Calling local_model_validation\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", - "\n", - "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", - " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m" - ] - }, - { - "data": { - "text/html": [ - "\n", - "

\n", - " \n", - " \n", - " [14/14 00:13]\n", - "
\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", - "\u001b[0mShould transfer from local_model_validation to join\n", - "\n", - "Calling join\n", - "\u001b[94mAverage aggregated model validation values = 0.5906503796577454\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94mAverage training loss = 0.3295206361469617\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94mAverage local model validation values = 0.3146952837705612\u001b[0m\u001b[94m\n", - "\u001b[0m\n", - "Calling aggregated_model_validation\n", - "\u001b[94mPerforming aggregated model validation for collaborator Portland\u001b[0m\u001b[94m\n", - "\u001b[0m" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.33it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", - "\n", - "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", - " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - " \n", - " [13/13 00:13]\n", - "
\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[94mPortland value of 0.31504756212234497\u001b[0m\u001b[94m\n", - "\u001b[0m\n", - "Calling train\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", - "\n", - "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", - " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - " \n", - " [228/228 08:57, Epoch 0/1]\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
StepTraining Loss
100.314000
200.292000
300.287100
400.288900
500.283600
600.281300
700.290200
800.277900
900.291600
1000.278400
1100.285700
1200.302800
1300.291500
1400.295600
1500.299100
1600.298400
1700.291200
1800.297700
1900.298500
2000.305400
2100.301000
2200.303100

" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Calling local_model_validation\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", - "\n", - "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", - " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m" - ] - }, - { - "data": { - "text/html": [ - "\n", - "

\n", - " \n", - " \n", - " [13/13 00:13]\n", - "
\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", - "\u001b[0mShould transfer from local_model_validation to join\n", - "\n", - "Calling aggregated_model_validation\n", - "\u001b[94mPerforming aggregated model validation for collaborator Seattle\u001b[0m\u001b[94m\n", - "\u001b[0m" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.30it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", - "\n", - "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", - " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - " \n", - " [14/14 00:13]\n", - "
\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[94mSeattle value of 0.31057578325271606\u001b[0m\u001b[94m\n", - "\u001b[0m\n", - "Calling train\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", - "\n", - "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", - " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - " \n", - " [227/227 08:50, Epoch 1.00/1]\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
StepTraining Loss
100.300900
200.307900
300.303400
400.274300
500.295200
600.270700
700.280300
800.284600
900.298700
1000.290900
1100.284300
1200.277500
1300.292400
1400.299300
1500.298800
1600.305300
1700.304600
1800.286900
1900.302600
2000.305300
2100.320000
2200.306800

" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Setup federated learning participants\n", - "aggregator = Aggregator() # Central coordinator that aggregates model updates\n", - "collaborators = [\n", - " Collaborator(name=\"Portland\"), # First participant with local dataset\n", - " Collaborator(name=\"Seattle\") # Second participant with local dataset\n", - "]\n", - "\n", - "# Distribute data shards to collaborators (simulating data silos)\n", - "# Each collaborator gets a non-overlapping portion of the dataset\n", - "for idx, colab in enumerate(collaborators):\n", - " colab.private_attributes = {\n", - " \"train_dataset\": train_dataset.shard(len(collaborators), idx), # Training shard\n", - " \"eval_dataset\": eval_dataset.shard(len(collaborators), idx) # Evaluation shard\n", - " }\n", - "\n", - "# Set up and execute the federated learning workflow\n", - "runtime = LocalRuntime(aggregator=aggregator, collaborators=collaborators) # Local simulation runtime\n", - "flflow = FederatedFlow(model, rounds=2) # Create flow with 2 federated learning rounds\n", - "flflow.runtime = runtime # Assign runtime to the flow\n", - "flflow.run() # Start the federated learning process" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python (myenv)", - "language": "python", - "name": "myenv" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 46dba98a94edbb7a6b9b82dedf9d6b89d5dcf707 Mon Sep 17 00:00:00 2001 From: Rajith Date: Wed, 21 May 2025 16:11:00 +0530 Subject: [PATCH 31/34] resolving comments --- .../workflow/LLM/phi-4-withquantization.ipynb | 12068 +++++++++++++--- openfl/utilities/phi_utils.py | 434 + 2 files changed, 10433 insertions(+), 2069 deletions(-) create mode 100644 openfl/utilities/phi_utils.py diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-withquantization.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-withquantization.ipynb index 8a33373f91..5e592b5873 100644 --- a/openfl-tutorials/experimental/workflow/LLM/phi-4-withquantization.ipynb +++ b/openfl-tutorials/experimental/workflow/LLM/phi-4-withquantization.ipynb @@ -5,7 +5,7 @@ "id": "a59f475d-d843-46bc-b75e-10984b687ed3", "metadata": {}, "source": [ - "# Enhanced Federated Fine-Tuning of Phi-4 Using OpenFL with PEFT & Quantization" + "# LLM Federated Finetuning with PEFT and Quantization" ] }, { @@ -13,11 +13,40 @@ "id": "20c74cb9-51a2-42e2-893f-d280e227e8bf", "metadata": {}, "source": [ - "In this tutorial, we demonstrate how to fine-tune Microsoft's Phi-4 model in a federated learning workflow with enhanced local training using:\n", - "- Parameter-Efficient Fine-Tuning (PEFT)\n", - "- 4-bit Quantization (QLoRA)\n", - "- Gradient Checkpointing\n", - "- Optimized Training Configuration" + "## Overview\n", + "\n", + "This tutorial demonstrates how to efficiently fine-tune Microsoft's Phi-4 model (7B parameter variant) in a federated learning workflow using OpenFL framework with advanced techniques for memory optimization and performance enhancement. The approach combines:\n", + "\n", + "### Memory Optimization Techniques\n", + "- **Parameter-Efficient Fine-Tuning (PEFT)**: Using Low-Rank Adaptation (LoRA) to fine-tune only a small subset of model parameters\n", + "- **Quantization**: Comparing 4-bit (NF4) and 8-bit quantization approaches with QLoRA to reduce memory footprint\n", + "- **Gradient Checkpointing**: Trading computation for memory by recomputing activations during backpropagation\n", + "\n", + "### Training Enhancements\n", + "- **Partial Round Updates**: Breaking each global round into partial updates for more frequent knowledge sharing\n", + "- **Fixed Training Steps**: Using a fixed number of training steps (100) equivalent to one epoch\n", + "- **Optimizer State Preservation**: Maintaining optimizer momentum across federation rounds\n", + "- **Memory Usage Tracking**: Detailed monitoring of GPU/CPU memory consumption across training phases\n", + "\n", + "### Federated Learning Architecture\n", + "- **Server-Client Model**: Central aggregator and multiple collaborators (simulated locally)\n", + "- **Federated Averaging**: Weighted parameter averaging between collaborator models\n", + "- **Metrics Visualization**: Tracking and comparing training loss, validation loss, and memory usage\n", + "\n", + "The tutorial implements a complete workflow that addresses common challenges in federated fine-tuning of large language models, including memory constraints, training efficiency, and performance metrics tracking across heterogeneous clients." + ] + }, + { + "cell_type": "markdown", + "id": "7241cc9a", + "metadata": {}, + "source": [ + "Before running the notebook make sure to install NVIDIA drivers using the below command\n", + "```\n", + "sudo apt update \n", + "sudo apt install -y nvidia-driver-550 \n", + "sudo reboot\n", + "```" ] }, { @@ -48,7 +77,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Fri May 16 07:23:10 2025 \n", + "Wed May 21 08:21:44 2025 \n", "+-----------------------------------------------------------------------------------------+\n", "| NVIDIA-SMI 550.144.03 Driver Version: 550.144.03 CUDA Version: 12.4 |\n", "|-----------------------------------------+------------------------+----------------------+\n", @@ -57,7 +86,7 @@ "| | | MIG M. |\n", "|=========================================+========================+======================|\n", "| 0 NVIDIA H100 NVL Off | 00000001:00:00.0 Off | 0 |\n", - "| N/A 41C P0 66W / 400W | 1MiB / 95830MiB | 0% Default |\n", + "| N/A 31C P0 61W / 400W | 1MiB / 95830MiB | 0% Default |\n", "| | | Disabled |\n", "+-----------------------------------------+------------------------+----------------------+\n", " \n", @@ -86,6 +115,16 @@ { "cell_type": "code", "execution_count": 3, + "id": "a3e6c3f4-dec3-4d3a-97cb-5b35bec06046", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install seaborn matplotlib pandas -q" + ] + }, + { + "cell_type": "code", + "execution_count": 4, "id": "be4690ae-0671-4d3a-8f21-620ab865a03e", "metadata": {}, "outputs": [ @@ -95,7 +134,7 @@ "text": [ "/home/azureuser/env_name/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", " from .autonotebook import tqdm as notebook_tqdm\n", - "2025-05-16 07:23:13,756\tINFO util.py:154 -- Missing packages: ['ipywidgets']. Run `pip install -U ipywidgets`, then restart the notebook server for rich notebook output.\n" + "2025-05-21 08:21:48,953\tINFO util.py:154 -- Missing packages: ['ipywidgets']. Run `pip install -U ipywidgets`, then restart the notebook server for rich notebook output.\n" ] } ], @@ -124,19 +163,28 @@ "from transformers.trainer_callback import PrinterCallback\n", "import transformers\n", "import gc\n", - "import psutil" + "import psutil\n", + "\n", + "# Import our utility functions\n", + "from openfl.utilities.phi_utils import (\n", + " get_gpu_memory_info,\n", + " MemoryTracker,\n", + " plot_memory_metrics,\n", + " plot_loss_metrics,\n", + " plot_aggregated_metrics\n", + ")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "74fed8f2", "metadata": {}, "outputs": [], "source": [ "# Memory optimization setup\n", - "os.environ[\"PYTORCH_CUDA_ALLOC_CONF\"] = \"expandable_segments:True\" # Enable dynamic memory allocation\n", - "os.environ[\"TRANSFORMERS_ATTN_IMPLEMENTATION\"] = \"flash_attention_2\" # Use optimized attention\n", + "os.environ[\"PYTORCH_CUDA_ALLOC_CONF\"] = \"expandable_segments:True\"\n", + "os.environ[\"TRANSFORMERS_ATTN_IMPLEMENTATION\"] = \"flash_attention_2\"\n", "\n", "def clear_gpu():\n", " torch.cuda.empty_cache()\n", @@ -147,20 +195,27 @@ }, { "cell_type": "markdown", - "id": "813b4917", + "id": "8fa0941e-5fd7-401b-9cc7-0beb5a2a3621", "metadata": {}, "source": [ "## Acquiring and preprocessing dataset\n", - "\n", "We can download the dataset directly from the [LLM-Adapters repository](https://github.com/AGI-Edgerunners/LLM-Adapters)" ] }, { "cell_type": "code", - "execution_count": null, - "id": "6df7bfb4", + "execution_count": 6, + "id": "a50ae4a4-628d-4f45-a9fc-c5c437df229e", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dataset already exists locally.\n" + ] + } + ], "source": [ "# Import libraries needed for downloading and verifying the dataset\n", "import hashlib\n", @@ -222,24 +277,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "eada9809-468a-47c6-9b03-55aa887c9487", "metadata": {}, "outputs": [], "source": [ "# Model and dataset\n", "model_name = \"microsoft/phi-4\"\n", - "#dataset_name = \"math_10k.json\"\n", + "dataset_name = \"math_10k.json\"\n", "\n", "# 4-bit QLoRA configuration\n", "bnb_config_4bit = BitsAndBytesConfig(\n", " load_in_4bit=True,\n", " bnb_4bit_quant_type=\"nf4\",\n", " bnb_4bit_compute_dtype=torch.bfloat16,\n", - " bnb_4bit_use_double_quant=False,\n", + " bnb_4bit_use_double_quant=True, # Enable double quantization for further memory saving\n", ")\n", "\n", - "# 8-bit QLoRA configuration\n", + "# 8-bit QLoRA configuration with more aggressive memory savings\n", "bnb_config_8bit = BitsAndBytesConfig(\n", " load_in_8bit=True,\n", " llm_int8_enable_fp32_cpu_offload=True,\n", @@ -251,9 +306,9 @@ "# Active quantization config (will be set to either 4-bit or 8-bit)\n", "bnb_config = bnb_config_4bit # Default to 4-bit\n", "\n", - "# LoRA configuration\n", + "# LoRA configuration - reduce parameters to save memory\n", "peft_config = LoraConfig(\n", - " r=8, # Increased from original for better adaptation\n", + " r=4, # Reduced from 8 to save memory\n", " lora_alpha=16,\n", " lora_dropout=0.01,\n", " bias=\"none\",\n", @@ -261,15 +316,18 @@ " target_modules=\"all-linear\",\n", ")\n", "\n", - "# Training configuration\n", + "# Training configuration with memory optimizations\n", "training_args = TrainingArguments(\n", " output_dir=\"./results\",\n", - " num_train_epochs=1,\n", - " per_device_train_batch_size=2, # Reduced for Phi-4\n", - " gradient_accumulation_steps=2,\n", + " # Reduced steps for testing\n", + " max_steps=50, # Reduced from 100 to 50 to save memory\n", + " per_device_train_batch_size=1,\n", + " per_device_eval_batch_size=1,\n", + " gradient_accumulation_steps=8, # Increased from 4 to 8 to reduce memory pressure\n", " optim=\"adamw_torch_fused\",\n", - " save_steps=100,\n", - " logging_steps=10,\n", + " # More frequent saving and logging\n", + " save_steps=25,\n", + " logging_steps=5,\n", " learning_rate=3e-4,\n", " weight_decay=0.001,\n", " fp16=False,\n", @@ -278,7 +336,12 @@ " warmup_ratio=0.02,\n", " lr_scheduler_type=\"cosine\",\n", " gradient_checkpointing=True,\n", - " report_to=\"none\"\n", + " report_to=\"none\",\n", + " # Enable memory optimization options\n", + " deepspeed=None, # Not using DeepSpeed but enabling other memory optimizations\n", + " optim_target_modules=[\"c_attn\", \"c_proj\"], # Optimize specific modules\n", + " # Add auto memory optimization flag\n", + " auto_find_batch_size=True # Automatically find the largest batch size that fits in memory\n", ")" ] }, @@ -292,7 +355,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "id": "8ab371f1-64c3-4225-82e7-fb3c5b05578c", "metadata": {}, "outputs": [ @@ -300,14 +363,14 @@ "name": "stderr", "output_type": "stream", "text": [ - "Loading checkpoint shards: 100%|██████████| 6/6 [00:04<00:00, 1.33it/s]\n" + "Loading checkpoint shards: 100%|██████████| 6/6 [00:04<00:00, 1.31it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "trainable params: 27,852,800 || all params: 14,687,360,000 || trainable%: 0.1896\n" + "trainable params: 13,926,400 || all params: 14,673,433,600 || trainable%: 0.0949\n" ] } ], @@ -343,28 +406,13 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "4392ddab-10b7-41f6-a8e0-65ba298ea457", "metadata": {}, "outputs": [], "source": [ "def format_prompt(example):\n", - " \"\"\"\n", - " Format the input example into a standardized prompt structure for training.\n", - " \n", - " This function creates a consistent instruction-response format for the LLM training:\n", - " - Includes instruction, optional input, and expected output\n", - " - Using a standardized template inspired by instruction-tuning datasets\n", - " \n", - " Parameters:\n", - " example (dict): Dictionary containing 'instruction', 'input' (optional), and 'output' fields\n", - " \n", - " Returns:\n", - " str: Formatted prompt with consistent structure for model training and evaluation\n", - " \"\"\"\n", - " # Handle case where input is provided\n", " if example[\"input\"]:\n", - " # Format with both instruction and input fields\n", " return f\"\"\"Below is an instruction that describes a task. Write a response that appropriately completes the request.\n", "\n", "### Instruction:\n", @@ -376,7 +424,6 @@ "### Response:\n", "{example['output']}\"\"\"\n", " else:\n", - " # Format with only instruction (no input field)\n", " return f\"\"\"Below is an instruction that describes a task. Write a response that appropriately completes the request.\n", "\n", "### Instruction:\n", @@ -387,10 +434,9 @@ "\n", "# Load dataset\n", "dataset = load_dataset(\"json\", data_files=dataset_name, split=\"train\", num_proc=4)\n", - "# Apply formatting to each example in the dataset\n", "dataset = dataset.map(lambda x: {\"text\": format_prompt(x)}, num_proc=4)\n", "\n", - "# Split dataset into training and evaluation subsets\n", + "# Split dataset\n", "dataset = dataset.train_test_split(test_size=0.1)\n", "train_dataset = dataset[\"train\"]\n", "eval_dataset = dataset[\"test\"]" @@ -406,7 +452,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "id": "6dc85c57-68b2-4514-9373-43e3d7c05c10", "metadata": {}, "outputs": [ @@ -414,32 +460,31 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': dataset_text_field, max_seq_length, packing. Will not be supported from version '0.13.0'.\n", + "/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': dataset_text_field, max_seq_length. Will not be supported from version '0.13.0'.\n", "\n", "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", " warnings.warn(message, FutureWarning)\n", - "/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", "/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", "/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", - "Generating train split: 1832 examples [00:02, 615.45 examples/s]\n", - "Generating train split: 197 examples [00:00, 575.95 examples/s]\n" + "Map: 100%|██████████| 8927/8927 [00:02<00:00, 3310.91 examples/s]\n", + "Map: 100%|██████████| 992/992 [00:00<00:00, 3267.10 examples/s]\n", + "max_steps is given, it will override any value given in num_train_epochs\n" ] } ], "source": [ + "# Create SFTTrainer\n", "trainer = SFTTrainer(\n", " model=model,\n", " train_dataset=train_dataset,\n", " eval_dataset=eval_dataset,\n", " peft_config=peft_config,\n", " dataset_text_field=\"text\",\n", - " max_seq_length=1024,\n", + " max_seq_length=512, # Reduced from 1024 to save memory\n", " tokenizer=tokenizer,\n", - " args=training_args,\n", - " packing=True,\n", + " args=training_args\n", ")" ] }, @@ -453,7 +498,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "id": "58298e8e-ab9e-4377-966e-143823441697", "metadata": {}, "outputs": [], @@ -493,7 +538,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "e5e108c6-5150-4931-9c01-6b64a913fa04", "metadata": {}, "outputs": [ @@ -516,268 +561,14 @@ "import transformers\n", "import gc\n", "import psutil\n", - "\n", - "def get_gpu_memory_info():\n", - " \"\"\"Get detailed GPU memory usage information in megabytes.\n", - " \n", - " This function checks for CUDA availability and returns a dictionary with memory allocation\n", - " information including allocated, reserved, and maximum allocated GPU memory.\n", - " \n", - " Returns:\n", - " dict: Dictionary with memory usage information in MB:\n", - " - allocated: Currently allocated memory by PyTorch tensors\n", - " - reserved: Total memory reserved by PyTorch\n", - " - max_allocated: Maximum allocated memory since last reset\n", - " \n", - " Note:\n", - " Returns zeros for all metrics if CUDA is not available or if an error occurs.\n", - " \"\"\"\n", - " try:\n", - " if torch.cuda.is_available():\n", - " allocated = torch.cuda.memory_allocated() / (1024 * 1024)\n", - " reserved = torch.cuda.memory_reserved() / (1024 * 1024)\n", - " max_allocated = torch.cuda.max_memory_allocated() / (1024 * 1024)\n", - " return {\n", - " \"allocated\": allocated,\n", - " \"reserved\": reserved,\n", - " \"max_allocated\": max_allocated\n", - " }\n", - " else:\n", - " return {\"allocated\": 0, \"reserved\": 0, \"max_allocated\": 0}\n", - " except:\n", - " return {\"allocated\": 0, \"reserved\": 0, \"max_allocated\": 0}\n", - "\n", - "class MemoryTracker:\n", - " \"\"\"Track GPU memory usage during training\"\"\"\n", - " def __init__(self, collaborator_name, quant_type):\n", - " self.collaborator_name = collaborator_name\n", - " self.quant_type = quant_type\n", - " self.timestamps = {}\n", - " self.peak = {\"allocated\": 0, \"reserved\": 0, \"max_allocated\": 0}\n", - " self.training_loss = None\n", - " self.eval_loss = None\n", - " \n", - " def log(self, timestamp):\n", - " \"\"\"Log current memory usage at a specific timestamp\"\"\"\n", - " self.timestamps[timestamp] = get_gpu_memory_info()\n", - " \n", - " def log_loss(self, training_loss=None, eval_loss=None):\n", - " \"\"\"Log training or evaluation loss\"\"\"\n", - " if training_loss is not None:\n", - " self.training_loss = training_loss\n", - " if eval_loss is not None:\n", - " self.eval_loss = eval_loss\n", - " \n", - " def update_peak(self):\n", - " \"\"\"Update peak memory usage values\"\"\"\n", - " current = get_gpu_memory_info()\n", - " self.peak[\"allocated\"] = max(self.peak[\"allocated\"], current[\"allocated\"])\n", - " self.peak[\"reserved\"] = max(self.peak[\"reserved\"], current[\"reserved\"])\n", - " self.peak[\"max_allocated\"] = max(self.peak[\"max_allocated\"], current[\"max_allocated\"])\n", - " \n", - " def reset_peak(self):\n", - " \"\"\"Reset peak memory usage values\"\"\"\n", - " self.peak = {\"allocated\": 0, \"reserved\": 0, \"max_allocated\": 0}\n", - " \n", - " def report(self):\n", - " \"\"\"Print memory usage report\"\"\"\n", - " print(f\"\\n==== Memory Usage Report for {self.collaborator_name} ({self.quant_type}) ====\")\n", - " print(f\"Peak Memory Usage:\")\n", - " print(f\" Allocated: {self.peak['allocated']:.2f} MB\")\n", - " print(f\" Reserved: {self.peak['reserved']:.2f} MB\")\n", - " print(f\" Max Allocated: {self.peak['max_allocated']:.2f} MB\")\n", - " \n", - " print(\"\\nMemory Usage by Stage:\")\n", - " for timestamp, mem in self.timestamps.items():\n", - " print(f\" {timestamp}:\")\n", - " print(f\" Allocated: {mem['allocated']:.2f} MB\")\n", - " print(f\" Reserved: {mem['reserved']:.2f} MB\")\n", - " print(f\" Max Allocated: {mem['max_allocated']:.2f} MB\")\n", - " \n", - " print(\"\\nPerformance Metrics:\")\n", - " if self.training_loss is not None:\n", - " print(f\" Training Loss: {self.training_loss:.4f}\")\n", - " if self.eval_loss is not None:\n", - " print(f\" Evaluation Loss: {self.eval_loss:.4f}\")\n", - " print(\"-\" * 50)\n", - " \n", - " def get_stats(self):\n", - " \"\"\"Get all statistics as a dictionary\"\"\"\n", - " stats = {\n", - " \"peak_allocated\": self.peak[\"allocated\"],\n", - " \"peak_reserved\": self.peak[\"reserved\"],\n", - " \"peak_max_allocated\": self.peak[\"max_allocated\"],\n", - " \"quant_type\": self.quant_type,\n", - " \"training_loss\": self.training_loss,\n", - " \"eval_loss\": self.eval_loss\n", - " }\n", - " for timestamp, mem in self.timestamps.items():\n", - " stats[f\"{timestamp}_allocated\"] = mem[\"allocated\"]\n", - " stats[f\"{timestamp}_reserved\"] = mem[\"reserved\"]\n", - " stats[f\"{timestamp}_max_allocated\"] = mem[\"max_allocated\"]\n", - " return stats\n", - "\n", - "def plot_memory_metrics(flow_4bit, flow_8bit):\n", - " \"\"\"Plot and compare memory metrics between 4-bit and 8-bit quantization.\"\"\"\n", - " try:\n", - " import matplotlib.pyplot as plt\n", - " import pandas as pd\n", - " from matplotlib.ticker import EngFormatter\n", - "\n", - " # Create figure with multiple subplots\n", - " fig, axs = plt.subplots(2, 2, figsize=(16, 12))\n", - " fig.suptitle('4-bit vs 8-bit Quantization Comparison', fontsize=16)\n", - " \n", - " # Colors for consistent plotting\n", - " colors_4bit = {'Portland': 'blue', 'Seattle': 'green'}\n", - " colors_8bit = {'Portland': 'darkblue', 'Seattle': 'darkgreen'}\n", - " markers_4bit = {'Portland': 'o', 'Seattle': 's'}\n", - " markers_8bit = {'Portland': '^', 'Seattle': 'D'}\n", - " \n", - " # Flatten the metric data for plotting\n", - " memory_data = []\n", - " for quant, flow in [(\"4-bit\", flow_4bit), (\"8-bit\", flow_8bit)]:\n", - " stats = flow.all_memory_stats\n", - " for collab, rounds_data in stats.items():\n", - " for round_name, metrics in rounds_data.items():\n", - " round_num = int(round_name.split('_')[1])\n", - " row = {\n", - " 'Collaborator': collab,\n", - " 'Round': round_num,\n", - " 'Quantization': quant,\n", - " 'Peak Memory (MB)': metrics.get('peak_max_allocated', 0),\n", - " 'Training Loss': metrics.get('training_loss', 0),\n", - " 'Eval Loss': metrics.get('eval_loss', 0)\n", - " }\n", - " memory_data.append(row)\n", - " \n", - " df = pd.DataFrame(memory_data)\n", - " \n", - " # Plot 1: Peak Memory Usage by Round\n", - " axs[0, 0].set_title('Peak Memory Usage by Round')\n", - " for quant_type in ['4-bit', '8-bit']:\n", - " for collab in df['Collaborator'].unique():\n", - " subset = df[(df['Quantization'] == quant_type) & (df['Collaborator'] == collab)]\n", - " color = colors_4bit[collab] if quant_type == '4-bit' else colors_8bit[collab]\n", - " marker = markers_4bit[collab] if quant_type == '4-bit' else markers_8bit[collab]\n", - " axs[0, 0].plot(subset['Round'], subset['Peak Memory (MB)'], \n", - " marker=marker, linestyle='-', label=f\"{collab} ({quant_type})\",\n", - " color=color)\n", - " \n", - " axs[0, 0].set_xlabel('Round')\n", - " axs[0, 0].set_ylabel('Memory (MB)')\n", - " axs[0, 0].legend()\n", - " axs[0, 0].grid(True, alpha=0.3)\n", - " axs[0, 0].yaxis.set_major_formatter(EngFormatter(unit='B'))\n", - " \n", - " # Plot 2: Training Loss by Round\n", - " axs[0, 1].set_title('Training Loss by Round')\n", - " for quant_type in ['4-bit', '8-bit']:\n", - " for collab in df['Collaborator'].unique():\n", - " subset = df[(df['Quantization'] == quant_type) & (df['Collaborator'] == collab)]\n", - " color = colors_4bit[collab] if quant_type == '4-bit' else colors_8bit[collab]\n", - " marker = markers_4bit[collab] if quant_type == '4-bit' else markers_8bit[collab]\n", - " axs[0, 1].plot(subset['Round'], subset['Training Loss'], \n", - " marker=marker, linestyle='-', label=f\"{collab} ({quant_type})\",\n", - " color=color)\n", - " \n", - " axs[0, 1].set_xlabel('Round')\n", - " axs[0, 1].set_ylabel('Loss')\n", - " axs[0, 1].legend()\n", - " axs[0, 1].grid(True, alpha=0.3)\n", - " \n", - " # Plot 3: Eval Loss by Round\n", - " axs[1, 0].set_title('Evaluation Loss by Round')\n", - " for quant_type in ['4-bit', '8-bit']:\n", - " for collab in df['Collaborator'].unique():\n", - " subset = df[(df['Quantization'] == quant_type) & (df['Collaborator'] == collab)]\n", - " color = colors_4bit[collab] if quant_type == '4-bit' else colors_8bit[collab]\n", - " marker = markers_4bit[collab] if quant_type == '4-bit' else markers_8bit[collab]\n", - " axs[1, 0].plot(subset['Round'], subset['Eval Loss'], \n", - " marker=marker, linestyle='-', label=f\"{collab} ({quant_type})\",\n", - " color=color)\n", - " \n", - " axs[1, 0].set_xlabel('Round')\n", - " axs[1, 0].set_ylabel('Loss')\n", - " axs[1, 0].legend()\n", - " axs[1, 0].grid(True, alpha=0.3)\n", - " \n", - " # Plot 4: Memory vs Loss (bubble chart)\n", - " axs[1, 1].set_title('Memory Usage vs. Evaluation Loss')\n", - " for quant_type in ['4-bit', '8-bit']:\n", - " for collab in df['Collaborator'].unique():\n", - " subset = df[(df['Quantization'] == quant_type) & (df['Collaborator'] == collab)]\n", - " color = colors_4bit[collab] if quant_type == '4-bit' else colors_8bit[collab]\n", - " marker = markers_4bit[collab] if quant_type == '4-bit' else markers_8bit[collab]\n", - " \n", - " # Size proportional to round number for visual differentiation\n", - " sizes = [100 * (r+1) for r in subset['Round']]\n", - " \n", - " axs[1, 1].scatter(subset['Peak Memory (MB)'], subset['Eval Loss'],\n", - " s=sizes, alpha=0.7, \n", - " label=f\"{collab} ({quant_type})\",\n", - " color=color, marker=marker)\n", - " \n", - " # Add round number annotations\n", - " for _, row in subset.iterrows():\n", - " axs[1, 1].annotate(f\"R{int(row['Round'])}\", \n", - " (row['Peak Memory (MB)'], row['Eval Loss']),\n", - " xytext=(5, 5), textcoords='offset points')\n", - " \n", - " axs[1, 1].set_xlabel('Peak Memory (MB)')\n", - " axs[1, 1].set_ylabel('Evaluation Loss')\n", - " axs[1, 1].legend()\n", - " axs[1, 1].grid(True, alpha=0.3)\n", - " axs[1, 1].xaxis.set_major_formatter(EngFormatter(unit='B'))\n", - " \n", - " plt.tight_layout()\n", - " plt.subplots_adjust(top=0.92)\n", - " plt.show()\n", - " \n", - " # Print summary comparison\n", - " print(\"\\n==== Performance Summary ====\\n\")\n", - " # Group by quantization and compute means\n", - " summary = df.groupby('Quantization').agg({\n", - " 'Peak Memory (MB)': 'mean',\n", - " 'Training Loss': 'mean', \n", - " 'Eval Loss': 'mean'\n", - " }).reset_index()\n", - " \n", - " # Calculate percentage difference\n", - " mem_diff_pct = ((summary.loc[1, 'Peak Memory (MB)'] - summary.loc[0, 'Peak Memory (MB)']) / \n", - " summary.loc[0, 'Peak Memory (MB)'] * 100)\n", - " \n", - " eval_diff_pct = ((summary.loc[1, 'Eval Loss'] - summary.loc[0, 'Eval Loss']) / \n", - " summary.loc[0, 'Eval Loss'] * 100)\n", - " \n", - " print(f\"Memory Usage Comparison:\")\n", - " print(f\" 4-bit Avg: {summary.loc[0, 'Peak Memory (MB)']:.2f} MB\")\n", - " print(f\" 8-bit Avg: {summary.loc[1, 'Peak Memory (MB)']:.2f} MB\")\n", - " print(f\" Difference: {abs(mem_diff_pct):.1f}% {'more' if mem_diff_pct > 0 else 'less'} memory with 8-bit\")\n", - " \n", - " print(f\"\\nEvaluation Loss Comparison:\")\n", - " print(f\" 4-bit Avg: {summary.loc[0, 'Eval Loss']:.4f}\")\n", - " print(f\" 8-bit Avg: {summary.loc[1, 'Eval Loss']:.4f}\")\n", - " print(f\" Difference: {abs(eval_diff_pct):.1f}% {'higher' if eval_diff_pct > 0 else 'lower'} loss with 8-bit\")\n", - " \n", - " loss_efficiency = ((summary.loc[0, 'Eval Loss'] - summary.loc[1, 'Eval Loss']) / \n", - " (summary.loc[0, 'Peak Memory (MB)'] - summary.loc[1, 'Peak Memory (MB)']))\n", - " \n", - " if loss_efficiency > 0:\n", - " efficiency_msg = \"8-bit provides better memory efficiency with lower loss\"\n", - " else:\n", - " efficiency_msg = \"4-bit provides better memory efficiency with lower loss\"\n", - " \n", - " print(f\"\\nEfficiency Analysis: {efficiency_msg}\")\n", - " except ImportError:\n", - " print(\"Plotting requires matplotlib and pandas. Install with: pip install matplotlib pandas\")\n", - " except Exception as e:\n", - " print(f\"Error plotting metrics: {str(e)}\")\n", + "import os\n", + "import math\n", + "import time\n", "\n", "class FederatedFlow(FLSpec):\n", " def __init__(self, model=None, optimizer=None, rounds=3, quant_type=\"4bit\", **kwargs):\n", " \"\"\"\n", - " Initialize the class with the given model, optimizer, and number of rounds.\n", + " Initialize the class with the given model, optimizer, and training parameters.\n", "\n", " Parameters:\n", " model (torch.nn.Module, optional): The model to be used. If None, a ValueError is raised.\n", @@ -803,6 +594,8 @@ " self.average_loss_history = []\n", " self.agg_model_loss_history = []\n", " self.local_model_loss_history = []\n", + " # Dictionary to store optimizer states for each collaborator\n", + " self.optimizer_states = {}\n", " \n", "\n", " @aggregator\n", @@ -815,8 +608,10 @@ " of the federated learning process.\n", " \"\"\"\n", " print(f\"Performing initialization for model with {self.quant_type} quantization\")\n", + " print(f\"Using {self.rounds} main rounds with partial round updates\")\n", " self.collaborators = self.runtime.collaborators\n", " self.current_round = 0\n", + " self.current_sub_round = 0\n", " # Initialize dictionary to collect memory stats\n", " # Check if collaborators are objects with name attribute or strings\n", " if hasattr(self.collaborators[0], 'name'):\n", @@ -825,6 +620,8 @@ " # If collaborators are already strings, use them directly\n", " collab_names = self.collaborators\n", " self.all_memory_stats = {collab: {} for collab in collab_names}\n", + " # Initialize optimizer states dictionary for each collaborator\n", + " self.optimizer_states = {collab: None for collab in collab_names}\n", " self.next(\n", " self.aggregated_model_validation,\n", " foreach=\"collaborators\",\n", @@ -840,7 +637,7 @@ " the model using the provided training and evaluation datasets. The validation\n", " score is then stored and the next step in the process is triggered.\n", " \"\"\"\n", - " print(f\"Performing aggregated model validation for collaborator {self.input} with {self.quant_type}\")\n", + " print(f\"[Round {self.current_round}, Update {self.current_sub_round}] Performing aggregated model validation for collaborator {self.input} with {self.quant_type}\")\n", " # Initialize memory tracker for this collaborator\n", " self.memory_tracker = MemoryTracker(self.input, self.quant_type)\n", " self.memory_tracker.reset_peak()\n", @@ -852,7 +649,6 @@ " quant_config = bnb_config_8bit\n", " \n", " # Define device_map variable\n", - " #device_map = \"auto\"\n", " device_map = {\"\": torch.cuda.current_device()} if torch.cuda.is_available() else \"cpu\"\n", " try:\n", " self.model = AutoModelForCausalLM.from_pretrained(\n", @@ -876,9 +672,34 @@ " self.model = get_peft_model(self.model, peft_config)\n", " set_peft_model_state_dict(self.model, self.peft_params)\n", " \n", + " # Use fixed number of steps (max_steps) for each round\n", + " steps_per_round = training_args.max_steps # Use the hardcoded 100 steps\n", + " \n", + " # Create a custom TrainingArguments for this round\n", + " self.round_args = TrainingArguments(\n", + " output_dir=training_args.output_dir,\n", + " max_steps=steps_per_round, # Use fixed steps per round\n", + " per_device_train_batch_size=training_args.per_device_train_batch_size,\n", + " gradient_accumulation_steps=training_args.gradient_accumulation_steps,\n", + " optim=training_args.optim,\n", + " save_steps=steps_per_round // 2 or 1, # More frequent saving\n", + " logging_steps=5,\n", + " learning_rate=training_args.learning_rate,\n", + " weight_decay=training_args.weight_decay,\n", + " fp16=training_args.fp16,\n", + " bf16=training_args.bf16,\n", + " max_grad_norm=training_args.max_grad_norm,\n", + " warmup_ratio=training_args.warmup_ratio,\n", + " lr_scheduler_type=training_args.lr_scheduler_type,\n", + " gradient_checkpointing=training_args.gradient_checkpointing,\n", + " report_to=training_args.report_to\n", + " )\n", + " \n", + " print(f\"[{self.input}] Training with {steps_per_round} steps\")\n", + " \n", " trainer = SFTTrainer(\n", " model=self.model,\n", - " args=training_args,\n", + " args=self.round_args, # Use round specific args\n", " peft_config=peft_config,\n", " train_dataset=self.train_dataset,\n", " eval_dataset=self.eval_dataset,\n", @@ -894,7 +715,7 @@ " trainer.remove_callback(PrinterCallback)\n", " out = trainer.evaluate()\n", " self.agg_validation_score = out[\"eval_loss\"]\n", - " print(f\"{self.input} value of {self.agg_validation_score}\")\n", + " print(f\"{self.input} evaluation loss: {self.agg_validation_score}\")\n", " self.memory_tracker.log_loss(eval_loss=self.agg_validation_score) # Log eval loss\n", " self.memory_tracker.update_peak()\n", " self.next(self.train)\n", @@ -902,34 +723,207 @@ " @collaborator\n", " def train(self):\n", " \"\"\"\n", - " Train the model for a collaborator.\n", + " Train the model for a collaborator with partial epoch updates.\n", "\n", - " This method trains the model using the provided training and evaluation datasets.\n", - " The training loss is stored, the model is saved, and the next step in the process\n", - " is triggered.\n", + " This method trains the model using the provided training dataset,\n", + " but processes it in smaller chunks (partial epochs) to allow more\n", + " frequent parameter sharing between collaborators.\n", " \"\"\"\n", " self.memory_tracker.log(\"before_training\")\n", + " \n", + " # Reduce steps for 8-bit quantization\n", + " if self.quant_type == \"8bit\":\n", + " max_steps = training_args.max_steps // 2 # Half the steps for 8-bit\n", + " else:\n", + " max_steps = training_args.max_steps\n", + " \n", + " # Define partial training args\n", + " self.sub_round_args = TrainingArguments(\n", + " output_dir=training_args.output_dir,\n", + " max_steps=max_steps,\n", + " per_device_train_batch_size=training_args.per_device_train_batch_size,\n", + " gradient_accumulation_steps=training_args.gradient_accumulation_steps,\n", + " optim=training_args.optim,\n", + " save_steps=max_steps // 4,\n", + " logging_steps=2,\n", + " learning_rate=training_args.learning_rate,\n", + " weight_decay=training_args.weight_decay,\n", + " fp16=training_args.fp16,\n", + " bf16=training_args.bf16,\n", + " max_grad_norm=training_args.max_grad_norm,\n", + " warmup_ratio=training_args.warmup_ratio,\n", + " lr_scheduler_type=training_args.lr_scheduler_type,\n", + " gradient_checkpointing=training_args.gradient_checkpointing,\n", + " report_to=training_args.report_to,\n", + " auto_find_batch_size=True # Add auto batch size finding\n", + " )\n", + " \n", + " # Create trainer instance with our custom training args\n", " trainer = SFTTrainer(\n", " model=self.model,\n", - " args=training_args,\n", + " args=self.sub_round_args,\n", " peft_config=peft_config,\n", " train_dataset=self.train_dataset,\n", " eval_dataset=self.eval_dataset,\n", - " max_seq_length=1024,\n", + " max_seq_length=512, # Reduced sequence length\n", " dataset_text_field=\"text\",\n", " tokenizer=tokenizer,\n", - " packing=True,\n", - " data_collator=transformers.DataCollatorForSeq2Seq(\n", - " tokenizer, pad_to_multiple_of=8, return_tensors=\"pt\", padding=True\n", - " ),\n", " )\n", - "\n", - " out = trainer.train()\n", - " self.loss = out.training_loss\n", + " \n", + " # Make sure optimizer is initialized before training\n", + " if not hasattr(trainer, 'optimizer') or trainer.optimizer is None:\n", + " trainer.create_optimizer_and_scheduler(num_training_steps=self.sub_round_args.max_steps)\n", + " if trainer.optimizer is None:\n", + " print(f\"[{self.input}] Warning: Failed to create optimizer. Creating standard optimizer.\")\n", + " # Create a simple optimizer if trainer.create_optimizer_and_scheduler failed\n", + " from torch.optim import AdamW\n", + " trainer.optimizer = AdamW(\n", + " trainer.model.parameters(),\n", + " lr=self.sub_round_args.learning_rate,\n", + " weight_decay=self.sub_round_args.weight_decay\n", + " )\n", + " # Create a simple scheduler\n", + " from transformers import get_scheduler\n", + " trainer.lr_scheduler = get_scheduler(\n", + " name=self.sub_round_args.lr_scheduler_type,\n", + " optimizer=trainer.optimizer,\n", + " num_warmup_steps=int(self.sub_round_args.max_steps * self.sub_round_args.warmup_ratio),\n", + " num_training_steps=self.sub_round_args.max_steps,\n", + " )\n", + " \n", + " # Restore optimizer state if available from previous rounds\n", + " if self.optimizer_states.get(self.input) is not None:\n", + " print(f\"[{self.input}] Restoring optimizer state\")\n", + " try:\n", + " # Load the optimizer state\n", + " trainer.optimizer.load_state_dict(self.optimizer_states[self.input])\n", + " except Exception as e:\n", + " print(f\"Failed to restore optimizer state: {e}\")\n", + " \n", + " # For 8-bit quantization with limited GPU memory, use simplified training\n", + " if self.quant_type == \"8bit\":\n", + " # Simplify training for 8-bit\n", + " try:\n", + " # Use trainer.train() for simpler training flow\n", + " trainer.train(resume_from_checkpoint=False)\n", + " # Get the last loss\n", + " self.loss = trainer.state.log_history[-1].get('loss', float('inf'))\n", + " except Exception as e:\n", + " print(f\"Training failed with error: {str(e)}\")\n", + " self.loss = float('inf') # Set to infinity to indicate failure\n", + " else:\n", + " # Regular training with manual control for 4-bit\n", + " print(f\"[{self.input}] Starting partial epoch training with {max_steps} steps\")\n", + " trainer.model.train()\n", + " total_loss = 0\n", + " step_count = 0\n", + " \n", + " # Set up dataloader for manual batching\n", + " dataloader = trainer.get_train_dataloader()\n", + " \n", + " # Process batches manually for more control\n", + " for step, inputs in enumerate(dataloader):\n", + " # Move inputs to the appropriate device\n", + " inputs = {k: v.to(trainer.args.device) for k, v in inputs.items()}\n", + " \n", + " # Forward pass\n", + " outputs = trainer.model(**inputs)\n", + " \n", + " # Handle different output formats\n", + " if isinstance(outputs, dict):\n", + " if \"loss\" in outputs:\n", + " loss = outputs[\"loss\"] / trainer.args.gradient_accumulation_steps\n", + " else:\n", + " # Calculate loss manually if not provided in outputs\n", + " # Get logits from outputs\n", + " if \"logits\" in outputs:\n", + " logits = outputs[\"logits\"]\n", + " # Get labels from inputs\n", + " labels = inputs.get(\"labels\")\n", + " if labels is not None:\n", + " # Calculate loss using cross-entropy\n", + " import torch.nn.functional as F\n", + " # Shift logits and labels for causal LM\n", + " shift_logits = logits[..., :-1, :].contiguous()\n", + " shift_labels = labels[..., 1:].contiguous()\n", + " loss = F.cross_entropy(\n", + " shift_logits.view(-1, shift_logits.size(-1)),\n", + " shift_labels.view(-1),\n", + " ignore_index=-100\n", + " ) / trainer.args.gradient_accumulation_steps\n", + " else:\n", + " print(f\"Warning: No labels in inputs, using dummy loss\")\n", + " loss = (outputs[\"logits\"].sum() * 0.0) / trainer.args.gradient_accumulation_steps\n", + " else:\n", + " print(f\"Warning: No logits or loss in outputs, using dummy loss\")\n", + " # Use any tensor from outputs for a dummy loss\n", + " dummy_tensor = next(iter(outputs.values()))\n", + " loss = (dummy_tensor.sum() * 0.0) / trainer.args.gradient_accumulation_steps\n", + " else:\n", + " loss = outputs.loss / trainer.args.gradient_accumulation_steps\n", + " \n", + " total_loss += loss.detach().float()\n", + " \n", + " # Backward pass\n", + " loss.backward()\n", + " \n", + " # Update weights on gradient accumulation steps or at the end\n", + " if ((step + 1) % trainer.args.gradient_accumulation_steps == 0) or (step == len(dataloader) - 1):\n", + " # Double check optimizer exists before using it\n", + " if trainer.optimizer is None:\n", + " print(f\"[{self.input}] Warning: Optimizer is None at step {step}. Creating optimizer.\")\n", + " # Create a simple optimizer\n", + " from torch.optim import AdamW\n", + " trainer.optimizer = AdamW(\n", + " trainer.model.parameters(), \n", + " lr=self.sub_round_args.learning_rate,\n", + " weight_decay=self.sub_round_args.weight_decay\n", + " )\n", + " # Create a simple scheduler\n", + " from transformers import get_scheduler\n", + " trainer.lr_scheduler = get_scheduler(\n", + " name=self.sub_round_args.lr_scheduler_type,\n", + " optimizer=trainer.optimizer,\n", + " num_warmup_steps=int(self.sub_round_args.max_steps * self.sub_round_args.warmup_ratio),\n", + " num_training_steps=self.sub_round_args.max_steps,\n", + " )\n", + " \n", + " trainer.optimizer.step()\n", + " trainer.lr_scheduler.step()\n", + " trainer.optimizer.zero_grad()\n", + " step_count += 1\n", + " \n", + " # Log progress\n", + " if step_count > 0 and step_count % 10 == 0:\n", + " print(f\"[{self.input}] Completed {step_count} steps, current loss: {total_loss/step_count:.4f}\")\n", + " \n", + " # Stop after max_steps\n", + " if step_count >= max_steps:\n", + " break\n", + " \n", + " # Calculate final training loss\n", + " self.loss = total_loss / step_count if step_count > 0 else 0\n", + " \n", + " print(f\"[{self.input}] Training completed, average loss: {self.loss:.4f}\")\n", + " \n", + " # Log memory and training metrics\n", " self.memory_tracker.log(\"after_training\")\n", - " self.memory_tracker.log_loss(training_loss=self.loss) # Log training loss\n", + " self.memory_tracker.log_loss(training_loss=self.loss)\n", " self.memory_tracker.update_peak()\n", - " trainer.save_model()\n", + " \n", + " # Save optimizer state for next round\n", + " if hasattr(trainer, 'optimizer') and trainer.optimizer is not None:\n", + " self.optimizer_states[self.input] = trainer.optimizer.state_dict()\n", + " # Create directory for saving optimizer state if needed\n", + " os.makedirs(f\"./optimizer_state/{self.input}\", exist_ok=True)\n", + " # Save optimizer state to disk as backup\n", + " torch.save(\n", + " trainer.optimizer.state_dict(), \n", + " f\"./optimizer_state/{self.input}/optimizer_round_{self.current_round}_update_{self.current_sub_round}.pt\"\n", + " )\n", + " \n", + " # Save model checkpoint\n", + " trainer.save_model(f\"./local_models/{self.input}/round_{self.current_round}_update_{self.current_sub_round}\")\n", " self.training_completed = True\n", " self.next(self.local_model_validation)\n", "\n", @@ -944,7 +938,7 @@ " \"\"\"\n", " trainer = SFTTrainer(\n", " model=self.model,\n", - " args=training_args,\n", + " args=self.sub_round_args, # Use sub-round specific args\n", " peft_config=peft_config,\n", " train_dataset=self.train_dataset,\n", " eval_dataset=self.eval_dataset,\n", @@ -958,6 +952,7 @@ " )\n", " out = trainer.evaluate()\n", " self.local_validation_score = out[\"eval_loss\"]\n", + " print(f\"[{self.input}] Local evaluation loss: {self.local_validation_score}\")\n", " self.memory_tracker.log_loss(eval_loss=self.local_validation_score) # Log eval loss\n", " self.peft_params = get_peft_model_state_dict(self.model)\n", " print(f\"Doing local model validation for collaborator {self.input}\")\n", @@ -984,10 +979,10 @@ " input.local_validation_score for input in inputs\n", " ) / len(inputs)\n", " print(\n", - " f\"Average aggregated model validation values = {self.aggregated_model_accuracy}\"\n", + " f\"[Round {self.current_round}, Update {self.current_sub_round}] Average aggregated model validation loss = {self.aggregated_model_accuracy}\"\n", " )\n", - " print(f\"Average training loss = {self.average_loss}\")\n", - " print(f\"Average local model validation values = {self.local_model_accuracy}\")\n", + " print(f\"[Round {self.current_round}, Update {self.current_sub_round}] Average training loss = {self.average_loss}\")\n", + " print(f\"[Round {self.current_round}, Update {self.current_sub_round}] Average local model validation loss = {self.local_model_accuracy}\")\n", "\n", " # Store metrics in history for plotting trends\n", " self.average_loss_history.append(self.average_loss)\n", @@ -996,14 +991,36 @@ " \n", " # Collect memory stats from all collaborators for this round\n", " for input_data in inputs:\n", - " self.all_memory_stats[input_data.input][f\"round_{self.current_round}\"] = input_data.memory_stats\n", + " round_key = f\"round_{self.current_round}_update_{self.current_sub_round}\"\n", + " self.all_memory_stats[input_data.input][round_key] = input_data.memory_stats\n", + " # Update optimizer states from collaborators\n", + " if hasattr(input_data, 'optimizer_states') and input_data.optimizer_states.get(input_data.input) is not None:\n", + " self.optimizer_states[input_data.input] = input_data.optimizer_states[input_data.input]\n", "\n", + " # Save aggregated optimizer states for debug/analysis\n", + " os.makedirs(\"./optimizer_state/aggregator\", exist_ok=True)\n", + " torch.save(\n", + " self.optimizer_states, \n", + " f\"./optimizer_state/aggregator/optimizers_round_{self.current_round}_update_{self.current_sub_round}.pt\"\n", + " )\n", + " \n", " self.model = FedAvg([input.peft_params for input in inputs], self.model)\n", " self.peft_params = get_peft_model_state_dict(self.model)\n", "\n", - " self.model.save_pretrained(\"./aggregated/model\")\n", - " tokenizer.save_pretrained(\"./aggregated/tokenizer\")\n", - " self.current_round += 1\n", + " # Save aggregated model after each sub-round update\n", + " save_dir = f\"./aggregated/model_round_{self.current_round}_update_{self.current_sub_round}\"\n", + " os.makedirs(save_dir, exist_ok=True)\n", + " self.model.save_pretrained(save_dir)\n", + " tokenizer.save_pretrained(f\"./aggregated/tokenizer_round_{self.current_round}_update_{self.current_sub_round}\")\n", + " \n", + " # Update round and sub-round counters\n", + " self.current_sub_round += 1\n", + " # Each update is treated as a partial update within a full round\n", + " # Update main round counter and reset sub-round when appropriate\n", + " if self.current_sub_round >= 2: # Default to 2 partial updates per round\n", + " self.current_sub_round = 0\n", + " self.current_round += 1\n", + " \n", " if self.current_round < self.rounds:\n", " self.next(\n", " self.aggregated_model_validation,\n", @@ -1027,11 +1044,24 @@ " print(f\"Final Aggregated Model Loss: {self.agg_model_loss_history[-1]:.4f}\")\n", " print(f\"Final Local Model Loss: {self.local_model_loss_history[-1]:.4f}\")\n", " \n", + " print(\"\\n===== Metric History =====\\n\")\n", + " print(\"Training Loss History:\")\n", + " for i, loss in enumerate(self.average_loss_history):\n", + " print(f\" Update {i}: {loss:.4f}\")\n", + " \n", + " print(\"\\nAggregated Model Loss History:\")\n", + " for i, loss in enumerate(self.agg_model_loss_history):\n", + " print(f\" Update {i}: {loss:.4f}\")\n", + " \n", + " print(\"\\nLocal Model Loss History:\")\n", + " for i, loss in enumerate(self.local_model_loss_history):\n", + " print(f\" Update {i}: {loss:.4f}\")\n", + " \n", " print(\"\\n===== Memory Usage Summary Across All Rounds =====\\n\")\n", " \n", " # Print aggregated memory statistics\n", " for collab, rounds_data in self.all_memory_stats.items():\n", - " print(f\"\\n==== {collab} Memory Usage Across Rounds ({self.quant_type}) ====\\n\")\n", + " print(f\"\\n==== {collab} Memory Usage Across Rounds/Updates ({self.quant_type}) ====\\n\")\n", " for round_name, stats in rounds_data.items():\n", " print(f\" {round_name}:\")\n", " for metric, value in stats.items():\n", @@ -1051,14 +1081,16 @@ "id": "7bc8fe27", "metadata": {}, "source": [ - "## Run Federated Learning with 4-bit and 8-bit Quantization" + "## Run Federated Learning with 4-bit Quantization" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "id": "38894111-41d9-4dd4-b1c8-eb7ec3cdd3e1", - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", @@ -1070,9 +1102,10 @@ "\n", "Calling start\n", "\u001b[94mPerforming initialization for model with 4bit quantization\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mUsing 5 main rounds with partial round updates\u001b[0m\u001b[94m\n", "\u001b[0m\n", "Calling aggregated_model_validation\n", - "\u001b[94mPerforming aggregated model validation for collaborator Portland with 4bit\u001b[0m\u001b[94m\n", + "\u001b[94m[Round 0, Update 0] Performing aggregated model validation for collaborator Portland with 4bit\u001b[0m\u001b[94m\n", "\u001b[0m" ] }, @@ -1080,8 +1113,23 @@ "name": "stderr", "output_type": "stream", "text": [ - "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.27it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", "\n", "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", " warnings.warn(message, FutureWarning)\n", @@ -1091,8 +1139,11 @@ " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", - "Generating train split: 915 examples [00:01, 626.55 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", - "Generating train split: 96 examples [00:00, 570.74 examples/s]\u001b[0m\u001b[94m0m\u001b[94m\n", + "Generating train split: 912 examples [00:01, 622.96 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "Generating train split: 103 examples [00:00, 627.49 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", "\u001b[0m" ] }, @@ -1102,8 +1153,8 @@ "\n", "

\n", " \n", - " \n", - " [12/12 00:11]\n", + " \n", + " [13/13 00:12]\n", "
\n", " " ], @@ -1118,7 +1169,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[94mPortland value of 0.5819987058639526\u001b[0m\u001b[94m\n", + "\u001b[94mPortland evaluation loss: 0.5811071991920471\u001b[0m\u001b[94m\n", "\u001b[0m\n", "Calling train\n" ] @@ -1127,141 +1178,63 @@ "name": "stderr", "output_type": "stream", "text": [ - "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", "\n", "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", - "Generating train split: 915 examples [00:01, 619.44 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", - "Generating train split: 96 examples [00:00, 628.10 examples/s]\u001b[0m\u001b[94m0m\u001b[94m\n", - "\u001b[0m`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`...\n" + "Map: 100%|##########| 4464/4464 [00:01<00:00, 3487.12 examples/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "Map: 100%|##########| 496/496 [00:00<00:00, 3341.29 examples/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n", + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`...\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" ] }, - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - " \n", - " [229/229 09:05, Epoch 1/1]\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
StepTraining Loss
100.501600
200.373200
300.337300
400.348300
500.334300
600.331800
700.322600
800.325800
900.320700
1000.328900
1100.303000
1200.313100
1300.312800
1400.320100
1500.308100
1600.312800
1700.325200
1800.307200
1900.320100
2000.310600
2100.308200
2200.310700

" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\u001b[94m[Portland] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.5313\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.5340\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.5390\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.5433\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.5464\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.5491\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.5525\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.5587\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.4287\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.4316\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.4328\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.4357\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.4377\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.4393\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.4421\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.4445\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.3906\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.3917\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.3931\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.3945\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.3967\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.3976\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.3993\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.4006\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.3724\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.3728\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.3738\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.3752\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.3763\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.3773\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.3783\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.3791\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 50 steps, current loss: 0.3572\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Training completed, average loss: 0.3572\u001b[0m\u001b[94m\n", + "\u001b[0m\n", "Calling local_model_validation\n" ] }, @@ -1279,6 +1252,11 @@ " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", + "Generating train split: 912 examples [00:01, 618.15 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "Generating train split: 103 examples [00:00, 632.61 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", "\u001b[0m" ] }, @@ -1288,8 +1266,8 @@ "\n", "

\n", " \n", - " \n", - " [12/12 00:12]\n", + " \n", + " [13/13 00:13]\n", "
\n", " " ], @@ -1304,36 +1282,37 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[94m[Portland] Local evaluation loss: 0.3916991055011749\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "==== Memory Usage Report for Portland (4bit) ====\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 35323.02 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 60420.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 57461.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 32696.12 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57374.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 54745.21 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "Memory Usage by Stage:\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 32979.33 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 45302.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 48011.95 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 30342.61 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 41548.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 43451.02 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 35078.37 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 60420.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 57461.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 32388.53 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57268.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 54745.21 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 35323.02 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 41244.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 57461.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 32696.12 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57374.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 54745.21 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "Performance Metrics:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Training Loss: 0.3295\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Evaluation Loss: 0.3029\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.3572\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.3917\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", "\u001b[0mShould transfer from local_model_validation to join\n", "\n", "Calling aggregated_model_validation\n", - "\u001b[94mPerforming aggregated model validation for collaborator Seattle with 4bit\u001b[0m\u001b[94m\n", + "\u001b[94m[Round 0, Update 0] Performing aggregated model validation for collaborator Seattle with 4bit\u001b[0m\u001b[94m\n", "\u001b[0m" ] }, @@ -1342,7 +1321,22 @@ "output_type": "stream", "text": [ "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", "\n", "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", " warnings.warn(message, FutureWarning)\n", @@ -1352,8 +1346,11 @@ " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", - "Generating train split: 917 examples [00:01, 622.35 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", - "Generating train split: 100 examples [00:00, 631.84 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "Generating train split: 912 examples [00:01, 631.44 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "Generating train split: 101 examples [00:00, 625.21 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", "\u001b[0m" ] }, @@ -1364,7 +1361,7 @@ "
\n", " \n", " \n", - " [13/13 00:13]\n", + " [13/13 00:12]\n", "
\n", " " ], @@ -1379,7 +1376,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[94mSeattle value of 0.5914124846458435\u001b[0m\u001b[94m\n", + "\u001b[94mSeattle evaluation loss: 0.5805659294128418\u001b[0m\u001b[94m\n", "\u001b[0m\n", "Calling train\n" ] @@ -1388,139 +1385,62 @@ "name": "stderr", "output_type": "stream", "text": [ - "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", "\n", "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", + "Map: 100%|##########| 4463/4463 [00:01<00:00, 3422.90 examples/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "Map: 100%|##########| 496/496 [00:00<00:00, 3404.21 examples/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", "\u001b[0m" ] }, - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - " \n", - " [229/229 09:07, Epoch 0/1]\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
StepTraining Loss
100.487200
200.371700
300.346800
400.334800
500.324900
600.319300
700.331200
800.336300
900.310900
1000.308100
1100.313600
1200.312600
1300.318200
1400.323600
1500.304700
1600.323100
1700.305100
1800.314500
1900.303500
2000.314900
2100.327900
2200.314100

" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\u001b[94m[Seattle] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.5439\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.5469\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.5501\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.5523\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.5550\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.5580\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.5638\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.5660\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.4307\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.4329\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.4347\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.4358\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.4375\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.4432\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.4451\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.4487\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.3982\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.3988\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.3996\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.4012\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.4025\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.4033\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.4041\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.4052\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.3717\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.3723\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.3728\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.3741\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.3749\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.3755\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.3769\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.3778\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 50 steps, current loss: 0.3601\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Training completed, average loss: 0.3601\u001b[0m\u001b[94m\n", + "\u001b[0m\n", "Calling local_model_validation\n" ] }, @@ -1538,6 +1458,10 @@ " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", + "Generating train split: 912 examples [00:01, 639.46 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", "\u001b[0m" ] }, @@ -1563,41 +1487,42 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[94m[Seattle] Local evaluation loss: 0.3990606665611267\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "==== Memory Usage Report for Seattle (4bit) ====\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 23170.02 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 48256.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 21814.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 47222.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 54883.62 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "Memory Usage by Stage:\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 20890.32 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 33280.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 19625.16 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 30754.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 54883.62 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 22957.36 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 48256.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 21639.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 47114.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 54883.62 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 23170.02 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 29538.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 21814.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 47222.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 54883.62 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "Performance Metrics:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Training Loss: 0.3287\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Evaluation Loss: 0.3178\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.3601\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.3991\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", "\u001b[0mShould transfer from local_model_validation to join\n", "\n", "Calling join\n", - "\u001b[94mAverage aggregated model validation values = 0.5867055952548981\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94mAverage training loss = 0.3290792714039832\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94mAverage local model validation values = 0.310357466340065\u001b[0m\u001b[94m\n", + "\u001b[94m[Round 0, Update 0] Average aggregated model validation loss = 0.5808365643024445\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 0, Update 0] Average training loss = 0.35865288972854614\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 0, Update 0] Average local model validation loss = 0.3953798860311508\u001b[0m\u001b[94m\n", "\u001b[0m\n", "Calling aggregated_model_validation\n", - "\u001b[94mPerforming aggregated model validation for collaborator Portland with 4bit\u001b[0m\u001b[94m\n", + "\u001b[94m[Round 0, Update 1] Performing aggregated model validation for collaborator Portland with 4bit\u001b[0m\u001b[94m\n", "\u001b[0m" ] }, @@ -1605,8 +1530,23 @@ "name": "stderr", "output_type": "stream", "text": [ - "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.28it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", "\n", "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", " warnings.warn(message, FutureWarning)\n", @@ -1616,6 +1556,10 @@ " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", + "Generating train split: 912 examples [00:01, 650.05 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", "\u001b[0m" ] }, @@ -1625,8 +1569,8 @@ "\n", "

\n", " \n", - " \n", - " [12/12 00:12]\n", + " \n", + " [13/13 00:13]\n", "
\n", " " ], @@ -1641,7 +1585,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[94mPortland value of 0.30139902234077454\u001b[0m\u001b[94m\n", + "\u001b[94mPortland evaluation loss: 0.38848692178726196\u001b[0m\u001b[94m\n", "\u001b[0m\n", "Calling train\n" ] @@ -1650,139 +1594,62 @@ "name": "stderr", "output_type": "stream", "text": [ - "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", "\n", "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", + "Map: 100%|##########| 496/496 [00:00<00:00, 3328.62 examples/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", "\u001b[0m" ] }, - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - " \n", - " [229/229 09:06, Epoch 1/1]\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
StepTraining Loss
100.298900
200.293900
300.279100
400.293300
500.290500
600.291100
700.280500
800.289900
900.289200
1000.298400
1100.275500
1200.290700
1300.290200
1400.301600
1500.290300
1600.299000
1700.313100
1800.297100
1900.313400
2000.303800
2100.302100
2200.306200

" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.2647\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.2668\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.2703\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.2734\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.2761\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.2782\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.2813\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.2857\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.2647\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.2676\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.2687\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.2708\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.2726\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.2740\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.2758\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.2780\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2695\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2704\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2717\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2729\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2748\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2756\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2772\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2783\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2720\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2724\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2732\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2745\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2752\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2762\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2770\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2778\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 50 steps, current loss: 0.2645\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Training completed, average loss: 0.2645\u001b[0m\u001b[94m\n", + "\u001b[0m\n", "Calling local_model_validation\n" ] }, @@ -1800,6 +1667,10 @@ " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", + "Generating train split: 103 examples [00:00, 645.41 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", "\u001b[0m" ] }, @@ -1809,8 +1680,8 @@ "\n", "

\n", " \n", - " \n", - " [12/12 00:12]\n", + " \n", + " [13/13 00:13]\n", "
\n", " " ], @@ -1825,36 +1696,37 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[94m[Portland] Local evaluation loss: 0.3903903663158417\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "==== Memory Usage Report for Portland (4bit) ====\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 35535.52 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 59824.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33547.22 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57726.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55734.72 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "Memory Usage by Stage:\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 33255.83 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 33440.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31364.12 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31586.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 54883.62 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 35322.87 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 59824.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33378.03 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57670.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55734.72 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 35535.52 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 41948.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 57706.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33547.22 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57726.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55734.72 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "Performance Metrics:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Training Loss: 0.2949\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Evaluation Loss: 0.2986\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.2645\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.3904\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", "\u001b[0mShould transfer from local_model_validation to join\n", "\n", "Calling aggregated_model_validation\n", - "\u001b[94mPerforming aggregated model validation for collaborator Seattle with 4bit\u001b[0m\u001b[94m\n", + "\u001b[94m[Round 0, Update 1] Performing aggregated model validation for collaborator Seattle with 4bit\u001b[0m\u001b[94m\n", "\u001b[0m" ] }, @@ -1862,7 +1734,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.27it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.24it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", "\n", "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", @@ -1873,6 +1745,23 @@ " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", "\u001b[0m" ] }, @@ -1898,11 +1787,74 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[94mSeattle value of 0.3157660961151123\u001b[0m\u001b[94m\n", + "\u001b[94mSeattle evaluation loss: 0.3931271433830261\u001b[0m\u001b[94m\n", "\u001b[0m\n", "Calling train\n" ] }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "Map: 100%|##########| 496/496 [00:00<00:00, 3406.01 examples/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.2763\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.2785\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.2815\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.2831\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.2853\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.2878\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.2919\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.2938\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.2690\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.2709\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.2725\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.2735\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.2749\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.2798\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.2815\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.2844\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2730\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2736\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2743\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2757\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2770\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2778\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2785\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2795\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2696\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2701\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2707\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2717\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2725\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2730\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2740\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2748\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 50 steps, current loss: 0.2659\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Training completed, average loss: 0.2659\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling local_model_validation\n" + ] + }, { "name": "stderr", "output_type": "stream", @@ -1917,6 +1869,10 @@ " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", + "Generating train split: 101 examples [00:00, 653.25 examples/s]\u001b[0m\u001b[94mm\u001b[94m\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", "\u001b[0m" ] }, @@ -1926,104 +1882,8265 @@ "\n", "
\n", " \n", - " \n", - " [229/229 09:07, Epoch 0/1]\n", + " \n", + " [13/13 00:13]\n", "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Local evaluation loss: 0.3981446623802185\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33447.23 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57866.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55734.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31364.12 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31506.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55734.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33378.03 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57810.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55734.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33447.23 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57866.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55734.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.2659\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.3981\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94m[Round 0, Update 1] Average aggregated model validation loss = 0.39080703258514404\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 0, Update 1] Average training loss = 0.2652348279953003\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 0, Update 1] Average local model validation loss = 0.3942675143480301\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 1, Update 0] Performing aggregated model validation for collaborator Portland with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.23it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.38319262862205505\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Completed 10 steps, current loss: 0.2195\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.2213\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.2243\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.2270\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.2291\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.2310\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.2341\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.2371\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.2230\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.2253\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.2263\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.2280\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.2298\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.2311\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.2324\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.2346\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2331\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2338\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2351\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2361\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2378\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2385\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2398\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2408\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2375\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2379\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2386\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2398\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2404\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2413\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2421\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2428\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 50 steps, current loss: 0.2315\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Training completed, average loss: 0.2315\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Local evaluation loss: 0.392806738615036\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33706.76 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58286.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.26 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31523.66 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31766.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55734.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33537.57 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58230.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.26 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33706.76 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58286.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.26 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.2315\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.3928\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 1, Update 0] Performing aggregated model validation for collaborator Seattle with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.24it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.3884606957435608\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Completed 10 steps, current loss: 0.2279\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.2298\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.2329\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.2345\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.2363\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.2382\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.2412\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.2428\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.2262\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.2280\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.2295\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.2305\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.2317\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.2359\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.2375\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.2394\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2341\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2347\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2354\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2367\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2378\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2386\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2392\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2402\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2352\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2356\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2361\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2369\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2376\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2381\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2390\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2397\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 50 steps, current loss: 0.2306\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Training completed, average loss: 0.2306\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Local evaluation loss: 0.4016312062740326\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33606.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58166.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.26 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31523.66 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31784.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.26 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33537.57 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58110.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.26 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33606.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58166.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.26 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.2306\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.4016\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94m[Round 1, Update 0] Average aggregated model validation loss = 0.3858266621828079\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 1, Update 0] Average training loss = 0.23103156685829163\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 1, Update 0] Average local model validation loss = 0.3972189724445343\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 1, Update 1] Performing aggregated model validation for collaborator Portland with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.24it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.38549479842185974\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Completed 10 steps, current loss: 0.1714\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1729\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1755\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1777\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1793\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1809\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1836\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1854\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.1804\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.1824\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.1834\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.1847\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.1863\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.1876\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.1888\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.1907\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1972\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1979\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1991\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2000\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2014\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2021\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2032\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.2043\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2048\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2052\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2057\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2068\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2073\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2081\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2088\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.2095\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 50 steps, current loss: 0.1995\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Training completed, average loss: 0.1995\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Local evaluation loss: 0.401896208524704\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33706.76 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58226.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.27 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31523.66 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31748.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.26 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33537.58 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58170.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.27 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33706.76 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58226.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.27 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.1995\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.4019\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 1, Update 1] Performing aggregated model validation for collaborator Seattle with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.24it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.3921719491481781\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1773\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1793\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1823\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1835\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1851\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1866\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1891\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1905\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1832\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1849\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1863\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1870\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1881\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1913\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1927\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1940\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1960\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1966\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1973\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1984\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1993\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2001\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2007\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.2017\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1996\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2001\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2005\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2011\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2018\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2023\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2031\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.2037\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 50 steps, current loss: 0.1968\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Training completed, average loss: 0.1968\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Local evaluation loss: 0.413899302482605\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33606.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57886.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.27 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31523.66 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31770.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.27 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33537.58 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57830.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.27 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33606.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57886.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.27 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.1968\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.4139\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94m[Round 1, Update 1] Average aggregated model validation loss = 0.3888333737850189\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 1, Update 1] Average training loss = 0.19815459847450256\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 1, Update 1] Average local model validation loss = 0.4078977555036545\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 2, Update 0] Performing aggregated model validation for collaborator Portland with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.39401885867118835\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Completed 10 steps, current loss: 0.1237\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1246\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1261\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1270\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1279\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1287\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1301\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1316\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.1355\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.1373\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.1381\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.1395\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.1409\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.1420\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.1430\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.1444\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1612\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1619\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1628\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1637\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1649\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1656\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1666\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1675\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.1733\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.1737\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.1742\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.1751\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.1756\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.1762\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.1768\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.1775\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 50 steps, current loss: 0.1710\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Training completed, average loss: 0.1710\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Local evaluation loss: 0.41375958919525146\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33706.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58186.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31523.67 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31838.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.27 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33537.59 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58130.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33706.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58186.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.1710\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.4138\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 2, Update 0] Performing aggregated model validation for collaborator Seattle with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.40143540501594543\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1366\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1386\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1411\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1418\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1435\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1452\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1468\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1478\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1464\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1478\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1488\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1494\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1505\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1524\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1537\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1551\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1653\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1658\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1664\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1673\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1681\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1689\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1695\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1704\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1743\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1748\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1751\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1757\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1764\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1768\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1775\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1780\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 50 steps, current loss: 0.1720\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Training completed, average loss: 0.1720\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Local evaluation loss: 0.42323189973831177\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33606.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58206.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31523.67 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31798.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33537.59 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58150.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33606.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58206.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.1720\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.4232\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94m[Round 2, Update 0] Average aggregated model validation loss = 0.3977271318435669\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 2, Update 0] Average training loss = 0.17152628302574158\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 2, Update 0] Average local model validation loss = 0.4184957444667816\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 2, Update 1] Performing aggregated model validation for collaborator Portland with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.40234553813934326\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Completed 10 steps, current loss: 0.0984\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0989\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0996\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1004\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1011\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1018\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1027\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.1035\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 50 steps, current loss: 0.1473\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Training completed, average loss: 0.1473\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Local evaluation loss: 0.4498145878314972\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33706.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57986.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31523.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31762.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33537.59 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57930.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33706.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57986.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.1473\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.4498\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 2, Update 1] Performing aggregated model validation for collaborator Seattle with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.24it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.41048040986061096\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1032\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1041\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1049\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1058\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1065\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1075\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1085\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.1092\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1116\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1130\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1140\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1148\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1160\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1172\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1186\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.1195\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1353\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1358\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1363\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1370\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1377\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1384\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1390\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1397\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1460\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1463\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1467\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1472\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1478\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1482\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1489\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1493\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 50 steps, current loss: 0.1441\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Training completed, average loss: 0.1441\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Local evaluation loss: 0.44478899240493774\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33606.79 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58266.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31523.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31822.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33537.59 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58210.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33606.79 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58266.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.1441\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.4448\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94m[Round 2, Update 1] Average aggregated model validation loss = 0.4064129739999771\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 2, Update 1] Average training loss = 0.14573591947555542\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 2, Update 1] Average local model validation loss = 0.44730179011821747\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 3, Update 0] Performing aggregated model validation for collaborator Portland with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.4368877112865448\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Completed 10 steps, current loss: 0.0855\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0863\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0871\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0882\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0889\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0895\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0902\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0911\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0842\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0857\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0862\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0868\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0874\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0882\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0887\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0894\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1078\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1084\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1092\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1099\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1108\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1113\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1121\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.1129\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.1229\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.1232\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.1235\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.1241\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.1245\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.1249\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.1254\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.1259\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 50 steps, current loss: 0.1210\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Training completed, average loss: 0.1210\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Local evaluation loss: 0.4723173975944519\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33706.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58146.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.29 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31523.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31782.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33537.60 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58090.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.29 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33706.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58146.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.29 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.1210\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.4723\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 3, Update 0] Performing aggregated model validation for collaborator Seattle with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.24it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.44539061188697815\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0859\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0867\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0880\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0891\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0899\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0907\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0927\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0936\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0927\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0941\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0948\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0954\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0963\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0970\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0981\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0987\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1174\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1178\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1183\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1188\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1197\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1203\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1210\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.1218\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1301\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1304\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1308\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1312\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1317\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1321\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1326\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1330\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 50 steps, current loss: 0.1277\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Training completed, average loss: 0.1277\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Local evaluation loss: 0.4785761833190918\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33606.79 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58106.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.29 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31523.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31914.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.29 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33537.60 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58050.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.29 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33606.79 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58106.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.29 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.1277\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.4786\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94m[Round 3, Update 0] Average aggregated model validation loss = 0.4411391615867615\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 3, Update 0] Average training loss = 0.12434957921504974\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 3, Update 0] Average local model validation loss = 0.47544679045677185\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 3, Update 1] Performing aggregated model validation for collaborator Portland with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.47256991267204285\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Completed 10 steps, current loss: 0.0721\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0727\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0735\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0744\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0752\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0759\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0768\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0777\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0733\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0750\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0756\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0761\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0766\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0771\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0780\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0786\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 50 steps, current loss: 0.1022\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Training completed, average loss: 0.1022\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Local evaluation loss: 0.5270882248878479\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33706.79 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58346.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31523.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31804.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.29 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33537.61 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58290.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33706.79 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58346.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.1022\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.5271\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 3, Update 1] Performing aggregated model validation for collaborator Seattle with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.24it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.48190006613731384\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0685\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0691\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0700\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0707\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0716\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0723\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0734\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0744\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0731\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0741\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0750\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0754\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0761\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0766\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0772\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0777\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0940\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0945\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0949\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0954\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0960\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0966\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0972\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0978\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1058\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1061\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1064\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1068\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1073\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1076\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1082\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.1085\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 50 steps, current loss: 0.1042\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Training completed, average loss: 0.1042\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Local evaluation loss: 0.528550386428833\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33606.80 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58384.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31523.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31838.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33537.61 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58328.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33606.80 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58384.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.1042\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.5286\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94m[Round 3, Update 1] Average aggregated model validation loss = 0.47723498940467834\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 3, Update 1] Average training loss = 0.10317578911781311\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 3, Update 1] Average local model validation loss = 0.5278193056583405\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 4, Update 0] Performing aggregated model validation for collaborator Portland with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Completed 30 steps, current loss: 0.0727\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.0730\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.0734\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.0739\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.0744\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.0748\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.0754\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.0759\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.0824\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.0826\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.0828\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.0831\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.0832\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.0835\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.0838\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.0841\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 50 steps, current loss: 0.0805\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Training completed, average loss: 0.0805\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Local evaluation loss: 0.5606555938720703\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33706.80 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58806.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31523.70 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31916.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33537.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58748.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33706.80 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58806.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.0805\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.5607\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 4, Update 0] Performing aggregated model validation for collaborator Seattle with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.5261728763580322\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0576\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0584\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0589\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0594\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0602\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0610\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0617\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0622\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0613\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0622\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0627\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0631\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0637\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0642\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0649\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0653\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0763\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0766\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0770\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0773\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0778\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0783\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0788\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0791\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.0871\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.0873\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.0875\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.0878\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.0882\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.0885\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.0891\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.0893\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 50 steps, current loss: 0.0857\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Training completed, average loss: 0.0857\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Local evaluation loss: 0.5728362202644348\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33606.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58444.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31523.70 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 32006.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33537.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58388.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33606.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58444.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.0857\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.5728\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94m[Round 4, Update 0] Average aggregated model validation loss = 0.5190570056438446\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 4, Update 0] Average training loss = 0.08311298489570618\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 4, Update 0] Average local model validation loss = 0.5667459070682526\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 4, Update 1] Performing aggregated model validation for collaborator Portland with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.26it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.5445127487182617\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Completed 10 steps, current loss: 0.0533\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0536\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0543\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0551\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0557\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0563\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0570\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 10 steps, current loss: 0.0577\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0569\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0578\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0583\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0587\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0590\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0595\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0600\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 20 steps, current loss: 0.0604\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.0669\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.0672\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.0675\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.0677\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.0682\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.0684\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.0688\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 30 steps, current loss: 0.0694\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.0748\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.0750\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.0752\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.0755\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.0757\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.0759\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.0763\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 40 steps, current loss: 0.0766\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Completed 50 steps, current loss: 0.0734\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Portland] Training completed, average loss: 0.0734\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Local evaluation loss: 0.5720435380935669\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33706.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57946.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31523.71 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31786.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33537.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57888.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33706.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 57946.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.0734\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.5720\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 4, Update 1] Performing aggregated model validation for collaborator Seattle with 4bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.24it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.562188982963562\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Starting partial epoch training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py:838: UserWarning: torch.utils.checkpoint: the use_reentrant parameter should be passed explicitly. In version 2.5 we will raise an exception if use_reentrant is not passed. use_reentrant=False is recommended, but if you need to preserve the current default behavior, you can pass use_reentrant=True. Refer to docs for more details on the differences between the two variants.\n", + " return fn(*args, **kwargs)\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0550\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0556\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0563\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0569\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0575\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0582\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0598\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 10 steps, current loss: 0.0602\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0583\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0590\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0594\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0597\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0605\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0610\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0614\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 20 steps, current loss: 0.0619\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0678\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0680\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0683\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0686\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0689\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0692\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0696\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 30 steps, current loss: 0.0699\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.0732\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.0734\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.0736\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.0738\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.0741\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.0743\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.0746\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 40 steps, current loss: 0.0748\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Completed 50 steps, current loss: 0.0720\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Seattle] Training completed, average loss: 0.0720\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:13]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Local evaluation loss: 0.6029046773910522\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (4bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33606.82 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58264.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 31523.71 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 31886.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33537.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58208.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 33606.82 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 58264.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: 0.0720\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.6029\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94m[Round 4, Update 1] Average aggregated model validation loss = 0.5533508658409119\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 4, Update 1] Average training loss = 0.07266537845134735\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 4, Update 1] Average local model validation loss = 0.5874741077423096\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling end\n", + "\u001b[94mThis is the end of the flow for 4bit quantization\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "===== Final Metrics =====\n", + "\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mAverage Training Loss: 0.0727\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mFinal Aggregated Model Loss: 0.5534\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mFinal Local Model Loss: 0.5875\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "===== Metric History =====\n", + "\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mTraining Loss History:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 0: 0.3587\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 1: 0.2652\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 2: 0.2310\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 3: 0.1982\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 4: 0.1715\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 5: 0.1457\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 6: 0.1243\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 7: 0.1032\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 8: 0.0831\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 9: 0.0727\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Aggregated Model Loss History:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 0: 0.5808\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 1: 0.3908\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 2: 0.3858\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 3: 0.3888\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 4: 0.3977\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 5: 0.4064\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 6: 0.4411\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 7: 0.4772\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 8: 0.5191\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 9: 0.5534\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Local Model Loss History:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 0: 0.3954\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 1: 0.3943\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 2: 0.3972\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 3: 0.4079\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 4: 0.4185\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 5: 0.4473\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 6: 0.4754\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 7: 0.5278\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 8: 0.5667\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 9: 0.5875\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "===== Memory Usage Summary Across All Rounds =====\n", + "\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Portland Memory Usage Across Rounds/Updates (4bit) ====\n", + "\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_0_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 32696.12 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 57374.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 54745.21 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.3572\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.3917\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 30342.61 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 41548.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 43451.02 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 32388.53 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 57268.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 54745.21 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 32696.12 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 57374.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 54745.21 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_0_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33547.22 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 57726.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55734.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.2645\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.3904\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31364.12 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31586.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 54883.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33378.03 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 57670.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55734.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33547.22 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 57726.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55734.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_1_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33706.76 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 58286.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55894.26 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.2315\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.3928\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31523.66 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31766.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55734.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33537.57 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 58230.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55894.26 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33706.76 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 58286.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55894.26 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_1_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33706.76 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 58226.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55894.27 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.1995\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.4019\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31523.66 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31748.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55894.26 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33537.58 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 58170.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55894.27 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33706.76 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 58226.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55894.27 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_2_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33706.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 58186.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.1710\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.4138\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31523.67 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31838.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55894.27 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33537.59 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 58130.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33706.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 58186.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_2_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33706.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 57986.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.1473\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.4498\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31523.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31762.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33537.59 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 57930.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33706.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 57986.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_3_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33706.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 58146.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55894.29 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.1210\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.4723\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31523.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31782.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33537.60 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 58090.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55894.29 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33706.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 58146.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55894.29 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_3_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33706.79 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 58346.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.1022\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.5271\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31523.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31804.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55894.29 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33537.61 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 58290.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33706.79 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 58346.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_4_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33706.80 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 58806.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.0805\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.5607\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31523.70 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31916.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33537.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 58748.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33706.80 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 58806.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_4_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33706.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 57946.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.0734\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.5720\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31523.71 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31786.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33537.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 57888.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33706.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 57946.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Seattle Memory Usage Across Rounds/Updates (4bit) ====\n", + "\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_0_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 21814.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 47222.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 54883.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.3601\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.3991\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 19625.16 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 30754.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 54883.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 21639.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 47114.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 54883.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 21814.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 47222.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 54883.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_0_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33447.23 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 57866.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55734.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.2659\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.3981\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31364.12 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31506.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55734.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33378.03 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 57810.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55734.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33447.23 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 57866.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55734.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_1_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33606.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 58166.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55894.26 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.2306\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.4016\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31523.66 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31784.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55894.26 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33537.57 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 58110.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55894.26 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33606.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 58166.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55894.26 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_1_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33606.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 57886.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55894.27 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.1968\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.4139\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31523.66 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31770.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55894.27 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33537.58 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 57830.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55894.27 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33606.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 57886.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55894.27 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_2_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33606.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 58206.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.1720\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.4232\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31523.67 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31798.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33537.59 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 58150.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33606.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 58206.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_2_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33606.79 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 58266.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.1441\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.4448\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31523.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31822.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33537.59 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 58210.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33606.79 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 58266.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55894.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_3_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33606.79 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 58106.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55894.29 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.1277\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.4786\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31523.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31914.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55894.29 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33537.60 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 58050.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55894.29 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33606.79 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 58106.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55894.29 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_3_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33606.80 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 58384.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.1042\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.5286\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31523.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31838.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33537.61 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 58328.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33606.80 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 58384.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55894.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_4_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33606.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 58444.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.0857\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.5728\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31523.70 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 32006.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33537.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 58388.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33606.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 58444.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_4_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 33606.82 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 58264.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: 0.0720\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.6029\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 31523.71 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 31886.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 33537.62 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 58208.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 33606.82 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 58264.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + } + ], + "source": [ + "# Setup participants\n", + "aggregator = Aggregator()\n", + "collaborators = [\n", + " Collaborator(name=\"Portland\"),\n", + " Collaborator(name=\"Seattle\")\n", + "]\n", + "\n", + "# Assign data shards\n", + "for idx, colab in enumerate(collaborators):\n", + " colab.private_attributes = {\n", + " \"train_dataset\": train_dataset.shard(len(collaborators), idx),\n", + " \"eval_dataset\": eval_dataset.shard(len(collaborators), idx)\n", + " }\n", + "\n", + "# Run with 4-bit quantization\n", + "print(\"\\n=============== Running with 4-bit Quantization ===============\\n\")\n", + "bnb_config = bnb_config_4bit # Set active config to 4-bit\n", + "runtime = LocalRuntime(aggregator=aggregator, collaborators=collaborators)\n", + "flflow_4bit = FederatedFlow(model, rounds=5, quant_type=\"4bit\") # Reduce to 1 round\n", + "flflow_4bit.runtime = runtime\n", + "flflow_4bit.run()" + ] + }, + { + "cell_type": "markdown", + "id": "87c4865a", + "metadata": {}, + "source": [ + "## Run Federated Learning with 8-bit Quantization" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "93c60404", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cleared CUDA cache between runs\n", + "\n", + "=============== Running with 8-bit Quantization ===============\n", + "\n", + "Loading model with 8-bit quantization on CPU first...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|██████████| 6/6 [00:02<00:00, 2.05it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling start\n", + "\u001b[94mPerforming initialization for model with 8bit quantization\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mUsing 5 main rounds with partial round updates\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 0, Update 0] Performing aggregated model validation for collaborator Portland with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.27it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.561655580997467\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [25/25 01:29, Epoch 0/1]\n", + "
\n", + "
StepTraining Loss
100.297100
200.287600
300.288400
400.284300
500.282800
600.281400
700.292800
800.296100
900.276100
1000.277400
1100.283700
1200.288200
1300.296800
1400.301800
1500.285500
1600.308200
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
20.728600
40.559300
60.475600
80.319500
100.310800
120.300300
140.244800
160.375300
180.305800
200.279400
220.359400
240.257100

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Local evaluation loss: 0.3953164219856262\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39210.98 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 59636.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 56253.51 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 36814.91 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38196.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39210.98 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 59636.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 56253.51 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39008.34 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 42136.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 56253.51 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.3953\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 0, Update 0] Performing aggregated model validation for collaborator Seattle with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.26it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.5638197064399719\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [25/25 01:30, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
20.845500
40.502000
60.451700
80.422500
100.285700
120.259400
140.324700
160.300600
180.309400
200.332400
220.378600
240.347400

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Local evaluation loss: 0.40347251296043396\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39317.46 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 59596.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 56364.86 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 36974.44 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38276.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 56364.86 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39317.46 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 59596.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 56364.86 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39149.93 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 42176.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 56364.86 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.4035\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94m[Round 0, Update 0] Average aggregated model validation loss = 0.5627376437187195\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 0, Update 0] Average training loss = inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 0, Update 0] Average local model validation loss = 0.3993944674730301\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 0, Update 1] Performing aggregated model validation for collaborator Portland with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.395594984292984\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [22/25 01:14 < 00:11, 0.27 it/s, Epoch 0.04/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
20.287200
40.248800
60.295900
80.238400
100.245100
120.248000
140.212000
160.306900
180.248200
200.230800

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Local evaluation loss: 0.39317232370376587\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40105.33 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60902.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57210.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37772.41 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38798.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57164.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40105.33 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60902.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57210.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39841.12 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 42898.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57210.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.3932\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94m[Round 0, Update 1] Average aggregated model validation loss = 0.3971341550350189\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 0, Update 1] Average training loss = inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 0, Update 1] Average local model validation loss = 0.39462728798389435\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 1, Update 0] Performing aggregated model validation for collaborator Portland with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.24it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.3897101879119873\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [25/25 01:29, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
20.237800
40.217600
60.244500
80.208000
100.210300
120.213500
140.190500
160.264600
180.209000
200.189600
220.251900
240.158800

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Local evaluation loss: 0.40585511922836304\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40210.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 61118.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57272.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37825.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38822.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57214.60 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40210.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 61118.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57272.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39916.32 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 42894.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57272.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.4059\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 1, Update 0] Performing aggregated model validation for collaborator Seattle with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.24it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.3935319185256958\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [25/25 01:29, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
20.268500
40.193500
60.218900
80.268700
100.190400
120.189700
140.214800
160.211600
180.231400
200.240300
220.246100
240.177200

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Local evaluation loss: 0.40515169501304626\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40215.71 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60930.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57319.97 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37878.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38916.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57272.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40215.71 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60930.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57319.97 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39949.17 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 42986.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57319.97 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.4052\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94m[Round 1, Update 0] Average aggregated model validation loss = 0.39162105321884155\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 1, Update 0] Average training loss = inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 1, Update 0] Average local model validation loss = 0.40550340712070465\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 1, Update 1] Performing aggregated model validation for collaborator Portland with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.24it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.3948669135570526\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [25/25 01:29, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
20.184200
40.176300
60.187500
80.161600
100.176600
120.178600
140.169600
160.213200
180.169800
200.152300
220.184800
240.121900

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Local evaluation loss: 0.4210392236709595\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40210.16 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60316.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37825.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38794.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40210.16 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60316.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39911.82 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 42890.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.4210\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 1, Update 1] Performing aggregated model validation for collaborator Seattle with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.24it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.39981263875961304\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [25/25 01:30, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
20.211300
40.154100
60.163600
80.212400
100.163400
120.166300
140.176000
160.181400
180.182900
200.197100
220.201300
240.147700

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Local evaluation loss: 0.4217308461666107\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40218.59 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 61308.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37878.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38902.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40218.59 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 61308.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39946.36 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 42924.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.4217\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94m[Round 1, Update 1] Average aggregated model validation loss = 0.3973397761583328\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 1, Update 1] Average training loss = inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 1, Update 1] Average local model validation loss = 0.4213850349187851\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 2, Update 0] Performing aggregated model validation for collaborator Portland with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.40616321563720703\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [25/25 01:29, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
20.128500
40.116900
60.109700
80.119700
100.154000
120.148100
140.156600
160.162500
180.128900
200.127000
220.123400
240.083500

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Local evaluation loss: 0.5076923370361328\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40203.53 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 61136.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37825.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38848.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40203.53 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 61136.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39909.20 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 42830.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.5077\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 2, Update 0] Performing aggregated model validation for collaborator Seattle with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.41194236278533936\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [25/25 01:29, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
20.150600
40.110600
60.114500
80.168300
100.139400
120.133200
140.144500
160.158400
180.144300
200.149400
220.145400
240.108200

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Local evaluation loss: 0.4701308310031891\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40210.40 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 61008.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37878.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38938.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40210.40 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 61008.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39941.88 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 43064.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.4701\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94m[Round 2, Update 0] Average aggregated model validation loss = 0.4090527892112732\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 2, Update 0] Average training loss = inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 2, Update 0] Average local model validation loss = 0.48891158401966095\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 2, Update 1] Performing aggregated model validation for collaborator Portland with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.24it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.4745386242866516\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [25/25 01:29, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
20.077900
40.073000
60.103700
80.090100
100.109100
120.110200
140.128100
160.140200
180.123900
200.105000
220.098300
240.070000

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Local evaluation loss: 0.5099506974220276\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40192.70 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 61154.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37825.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38856.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40192.70 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 61154.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39908.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 42890.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.5100\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 2, Update 1] Performing aggregated model validation for collaborator Seattle with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.24it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.48276180028915405\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [25/25 01:29, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
20.086700
40.066700
60.083300
80.140100
100.135800
120.124500
140.128400
160.135900
180.132500
200.125100
220.109400
240.079100

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Local evaluation loss: 0.5275096893310547\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40199.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60928.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37878.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38960.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40199.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60928.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39946.38 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 42922.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.5275\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94m[Round 2, Update 1] Average aggregated model validation loss = 0.47865021228790283\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 2, Update 1] Average training loss = inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 2, Update 1] Average local model validation loss = 0.5187301933765411\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 3, Update 0] Performing aggregated model validation for collaborator Portland with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.5035024285316467\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [25/25 01:29, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
20.049000
40.054900
60.076800
80.087800
100.106500
120.091100
140.111600
160.129900
180.105400
200.090700
220.099800
240.083200

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Local evaluation loss: 0.5614020824432373\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40187.96 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60596.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37825.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38822.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40187.96 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60596.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39911.37 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 42870.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.5614\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 3, Update 0] Performing aggregated model validation for collaborator Seattle with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.23it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.5139071941375732\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [25/25 01:30, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
20.055200
40.049700
60.085100
80.116400
100.106000
120.111700
140.102500
160.114700
180.106000
200.107500
220.085900
240.080100

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Local evaluation loss: 0.5329421162605286\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40194.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 61068.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37878.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38914.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40194.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 61068.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39942.97 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 42944.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.5329\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling join\n", + "\u001b[94m[Round 3, Update 0] Average aggregated model validation loss = 0.50870481133461\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 3, Update 0] Average training loss = inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 3, Update 0] Average local model validation loss = 0.5471720993518829\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 3, Update 1] Performing aggregated model validation for collaborator Portland with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.24it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.5240783095359802\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [25/25 01:29, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
20.041300
40.044000
60.060200
80.074900
100.080700
120.078300
140.096000
160.111400
180.093000
200.079100
220.084700
240.066400

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [13/13 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Local evaluation loss: 0.5784252882003784\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Portland (8bit) ====\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40185.57 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60476.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Memory Usage by Stage:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37825.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38820.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40185.57 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60476.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39910.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 42950.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Performance Metrics:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.5784\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", + "\u001b[0mShould transfer from local_model_validation to join\n", + "\n", + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 3, Update 1] Performing aggregated model validation for collaborator Seattle with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [13/13 00:11]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.5348654389381409\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [25/25 01:29, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
StepTraining Loss
1700.29210020.047700
1800.30560040.042700
1900.29630060.064300
2000.30690080.092000
2100.321900100.089600
2200.309400120.105100
140.101900
160.093900
180.090200
200.093600
220.081300
240.066200

" @@ -2035,12 +10152,35 @@ "metadata": {}, "output_type": "display_data" }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "Calling local_model_validation\n" + "\u001b[94m[Seattle] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" ] }, { @@ -2057,6 +10197,27 @@ " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m" ] }, @@ -2067,7 +10228,7 @@ "

\n", " \n", " \n", - " [13/13 00:13]\n", + " [13/13 00:11]\n", "
\n", " " ], @@ -2082,141 +10243,68 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[94m[Seattle] Local evaluation loss: 0.5685837864875793\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", - "==== Memory Usage Report for Seattle (4bit) ====\u001b[0m\u001b[94m\n", + "==== Memory Usage Report for Seattle (8bit) ====\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 35535.52 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 59804.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 57918.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40193.50 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60808.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "Memory Usage by Stage:\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 33255.83 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 33424.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 57918.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37878.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38936.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 35322.87 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 59804.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 57918.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40193.50 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60808.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 35535.52 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 41528.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 57918.78 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39946.86 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 42922.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "Performance Metrics:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Training Loss: 0.2942\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Evaluation Loss: 0.3126\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.5686\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", "\u001b[0mShould transfer from local_model_validation to join\n", "\n", "Calling join\n", - "\u001b[94mAverage aggregated model validation values = 0.3085825592279434\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94mAverage training loss = 0.29453011579388616\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94mAverage local model validation values = 0.30557093024253845\u001b[0m\u001b[94m\n", + "\u001b[94m[Round 3, Update 1] Average aggregated model validation loss = 0.5294718742370605\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 3, Update 1] Average training loss = inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 3, Update 1] Average local model validation loss = 0.5735045373439789\u001b[0m\u001b[94m\n", "\u001b[0m\n", - "Calling end\n", - "\u001b[94mThis is the end of the flow for 4bit quantization\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m\n", - "===== Final Metrics =====\n", - "\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94mAverage Training Loss: 0.2945\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94mFinal Aggregated Model Loss: 0.3086\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94mFinal Local Model Loss: 0.3056\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m\n", - "===== Memory Usage Summary Across All Rounds =====\n", - "\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m\n", - "==== Portland Memory Usage Across Rounds (4bit) ====\n", - "\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m round_0:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_allocated: 35323.02 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_reserved: 60420.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_max_allocated: 57461.62 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m training_loss: 0.3295\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m eval_loss: 0.3029\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_allocated: 32979.33 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_reserved: 45302.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_max_allocated: 48011.95 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_allocated: 35078.37 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_reserved: 60420.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_max_allocated: 57461.62 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_allocated: 35323.02 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_reserved: 41244.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_max_allocated: 57461.62 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m round_1:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_allocated: 35535.52 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_reserved: 59824.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_max_allocated: 57706.28 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m training_loss: 0.2949\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m eval_loss: 0.2986\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_allocated: 33255.83 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_reserved: 33440.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_max_allocated: 57706.28 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_allocated: 35322.87 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_reserved: 59824.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_max_allocated: 57706.28 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_allocated: 35535.52 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_reserved: 41948.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_max_allocated: 57706.28 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m\n", - "==== Seattle Memory Usage Across Rounds (4bit) ====\n", - "\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m round_0:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_allocated: 23170.02 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_reserved: 48256.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_max_allocated: 57706.28 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m training_loss: 0.3287\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m eval_loss: 0.3178\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_allocated: 20890.32 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_reserved: 33280.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_max_allocated: 57706.28 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_allocated: 22957.36 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_reserved: 48256.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_max_allocated: 57706.28 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_allocated: 23170.02 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_reserved: 29538.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_max_allocated: 57706.28 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m round_1:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_allocated: 35535.52 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_reserved: 59804.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_max_allocated: 57918.78 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m training_loss: 0.2942\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m eval_loss: 0.3126\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_allocated: 33255.83 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_reserved: 33424.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_max_allocated: 57918.78 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_allocated: 35322.87 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_reserved: 59804.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_max_allocated: 57918.78 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_allocated: 35535.52 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_reserved: 41528.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_max_allocated: 57918.78 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", - "\u001b[0mCleared CUDA cache between runs\n", - "\n", - "=============== Running with 8-bit Quantization ===============\n", - "\n" + "Calling aggregated_model_validation\n", + "\u001b[94m[Round 4, Update 0] Performing aggregated model validation for collaborator Portland with 8bit\u001b[0m\u001b[94m\n", + "\u001b[0m" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "Loading checkpoint shards: 100%|██████████| 6/6 [00:04<00:00, 1.36it/s]\n" + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.23it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\n", + "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", + " warnings.warn(message, FutureWarning)\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "Calling start\n", - "\u001b[94mPerforming initialization for model with 8bit quantization\u001b[0m\u001b[94m\n", - "\u001b[0m\n", - "Calling aggregated_model_validation\n", - "\u001b[94mPerforming aggregated model validation for collaborator Portland with 8bit\u001b[0m\u001b[94m\n", + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", "\u001b[0m" ] }, @@ -2224,16 +10312,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.30it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", - "\n", - "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", - " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", @@ -2248,8 +10327,8 @@ "\n", "
\n", " \n", - " \n", - " [12/12 00:11]\n", + " \n", + " [13/13 00:11]\n", "
\n", " " ], @@ -2260,30 +10339,37 @@ "metadata": {}, "output_type": "display_data" }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[94mPortland value of 0.5662918090820312\u001b[0m\u001b[94m\n", - "\u001b[0m\n", - "Calling train\n" - ] - }, { "name": "stderr", "output_type": "stream", "text": [ - "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", "\n", "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.5471141934394836\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", @@ -2296,8 +10382,8 @@ "\n", "
\n", " \n", - " \n", - " [229/229 13:26, Epoch 1/1]\n", + " \n", + " [25/25 01:29, Epoch 0/1]\n", "
\n", " \n", " \n", @@ -2308,92 +10394,52 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
100.494400
200.367000
300.331100
400.342600
500.32900020.033400
600.32660040.040500
700.31560060.064200
800.32040080.065800
900.316400
1000.323500
1100.297700
1200.309000
1300.308100
1400.315500
1500.303500100.077300
1600.307800120.071600
1700.320400140.080400
1800.304000160.088800
1900.314900180.082500
2000.305600200.062700
2100.303100220.066100
2200.306500240.056600

" @@ -2417,6 +10463,14 @@ " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m" ] }, @@ -2424,7 +10478,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\u001b[94m[Portland] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\n", "Calling local_model_validation\n" ] }, @@ -2442,6 +10497,9 @@ " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", @@ -2455,8 +10513,8 @@ "\n", "

\n", " \n", - " \n", - " [12/12 00:11]\n", + " \n", + " [13/13 00:12]\n", "
\n", " " ], @@ -2471,36 +10529,37 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[94m[Portland] Local evaluation loss: 0.5927156209945679\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "==== Memory Usage Report for Portland (8bit) ====\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 75278.13 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 93310.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 92214.55 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40181.67 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60874.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "Memory Usage by Stage:\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 72811.06 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 91120.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 91914.16 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37825.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38838.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 75278.13 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 93310.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 92214.55 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40181.67 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60874.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 75250.57 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 83158.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 92214.55 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39912.48 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 42850.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "Performance Metrics:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Training Loss: 0.3243\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Evaluation Loss: 0.2989\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.5927\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", "\u001b[0mShould transfer from local_model_validation to join\n", "\n", "Calling aggregated_model_validation\n", - "\u001b[94mPerforming aggregated model validation for collaborator Seattle with 8bit\u001b[0m\u001b[94m\n", + "\u001b[94m[Round 4, Update 0] Performing aggregated model validation for collaborator Seattle with 8bit\u001b[0m\u001b[94m\n", "\u001b[0m" ] }, @@ -2508,7 +10567,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.28it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.24it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", "\n", "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", @@ -2519,6 +10578,23 @@ " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", @@ -2544,30 +10620,37 @@ "metadata": {}, "output_type": "display_data" }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[94mSeattle value of 0.5757399201393127\u001b[0m\u001b[94m\n", - "\u001b[0m\n", - "Calling train\n" - ] - }, { "name": "stderr", "output_type": "stream", "text": [ - "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", "\n", "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.5571405291557312\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", @@ -2580,8 +10663,8 @@ "\n", "
\n", " \n", - " \n", - " [229/229 13:29, Epoch 0/1]\n", + " \n", + " [25/25 01:29, Epoch 0/1]\n", "
\n", " \n", " \n", @@ -2592,92 +10675,52 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
100.481300
200.365600
300.344500
400.331200
500.320000
600.314700
700.326100
800.331600
900.306900
1000.30480020.035800
1100.30920040.037800
1200.30830060.059100
1300.31350080.089500
1400.318300
1500.299200100.071900
1600.318800120.084300
1700.300500140.088000
1800.310100160.095700
1900.299400180.074300
2000.310000200.082400
2100.323100220.071100
2200.310700240.058900

" @@ -2701,6 +10744,14 @@ " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m" ] }, @@ -2708,8 +10759,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", - "Calling local_model_validation\n" + "\u001b[94m[Seattle] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" ] }, { @@ -2726,6 +10777,23 @@ " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", @@ -2755,41 +10823,42 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[94m[Seattle] Local evaluation loss: 0.5642604827880859\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "==== Memory Usage Report for Seattle (8bit) ====\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 58276.76 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 83620.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 92551.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40189.73 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 61506.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "Memory Usage by Stage:\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 55775.01 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 74152.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 92551.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37878.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38928.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 58145.08 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 83620.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 92551.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40189.73 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 61506.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 58276.76 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 65726.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 92551.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39944.91 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 43022.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "Performance Metrics:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Training Loss: 0.3242\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Evaluation Loss: 0.3134\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.5643\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", "\u001b[0mShould transfer from local_model_validation to join\n", "\n", "Calling join\n", - "\u001b[94mAverage aggregated model validation values = 0.571015864610672\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94mAverage training loss = 0.3242545044578319\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94mAverage local model validation values = 0.30610978603363037\u001b[0m\u001b[94m\n", + "\u001b[94m[Round 4, Update 0] Average aggregated model validation loss = 0.5521273612976074\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 4, Update 0] Average training loss = inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 4, Update 0] Average local model validation loss = 0.5784880518913269\u001b[0m\u001b[94m\n", "\u001b[0m\n", "Calling aggregated_model_validation\n", - "\u001b[94mPerforming aggregated model validation for collaborator Portland with 8bit\u001b[0m\u001b[94m\n", + "\u001b[94m[Round 4, Update 1] Performing aggregated model validation for collaborator Portland with 8bit\u001b[0m\u001b[94m\n", "\u001b[0m" ] }, @@ -2797,7 +10866,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.28it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.25it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", "\n", "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", @@ -2808,6 +10877,23 @@ " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Portland] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", @@ -2821,8 +10907,8 @@ "\n", "

\n", " \n", - " \n", - " [12/12 00:11]\n", + " \n", + " [13/13 00:11]\n", "
\n", " " ], @@ -2833,30 +10919,37 @@ "metadata": {}, "output_type": "display_data" }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[94mPortland value of 0.296934574842453\u001b[0m\u001b[94m\n", - "\u001b[0m\n", - "Calling train\n" - ] - }, { "name": "stderr", "output_type": "stream", "text": [ - "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", "\n", "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mPortland evaluation loss: 0.5503019094467163\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Portland] Restoring optimizer state\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", @@ -2869,8 +10962,8 @@ "\n", "
\n", " \n", - " \n", - " [229/229 13:24, Epoch 1/1]\n", + " \n", + " [25/25 01:29, Epoch 0/1]\n", "
\n", " \n", " \n", @@ -2881,92 +10974,52 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
100.295100
200.290700
300.277600
400.291800
500.286200
600.288300
700.27760020.033700
800.28600040.033800
900.28520060.052200
1000.29540080.071900
1100.272500
1200.288300
1300.288100
1400.298300
1500.287800100.063400
1600.295400120.057900
1700.309200140.065800
1800.293700160.068000
1900.308100180.085900
2000.299100200.057100
2100.296900220.056000
2200.301700240.051500

" @@ -2990,6 +11043,14 @@ " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m" ] }, @@ -2997,8 +11058,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", - "Calling local_model_validation\n" + "\u001b[94m[Portland] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" ] }, { @@ -3015,6 +11076,23 @@ " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", @@ -3028,8 +11106,8 @@ "\n", "

\n", " \n", - " \n", - " [12/12 00:11]\n", + " \n", + " [13/13 00:12]\n", "
\n", " " ], @@ -3044,36 +11122,37 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", + "\u001b[94m[Portland] Local evaluation loss: 0.5799501538276672\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Portland\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "==== Memory Usage Report for Portland (8bit) ====\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 75488.79 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 93552.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 92552.04 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40182.25 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60476.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "Memory Usage by Stage:\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 73023.56 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 74272.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 92551.30 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37825.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38820.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 75488.79 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 93552.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 92552.04 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40182.25 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60476.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 75466.38 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 82944.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 92552.04 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39911.18 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 42930.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "Performance Metrics:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Training Loss: 0.2914\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Evaluation Loss: 0.2939\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.5800\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", "\u001b[0mShould transfer from local_model_validation to join\n", "\n", "Calling aggregated_model_validation\n", - "\u001b[94mPerforming aggregated model validation for collaborator Seattle with 8bit\u001b[0m\u001b[94m\n", + "\u001b[94m[Round 4, Update 1] Performing aggregated model validation for collaborator Seattle with 8bit\u001b[0m\u001b[94m\n", "\u001b[0m" ] }, @@ -3081,7 +11160,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.28it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", + "Loading checkpoint shards: 100%|##########| 6/6 [00:04<00:00, 1.23it/s]\u001b[0m\u001b[94m\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", "\n", "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", @@ -3092,6 +11171,23 @@ " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94m[Seattle] Training with 50 steps\u001b[0m\u001b[94m\n", + "\u001b[0m" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", @@ -3117,140 +11213,107 @@ "metadata": {}, "output_type": "display_data" }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[94mSeattle value of 0.31116044521331787\u001b[0m\u001b[94m\n", - "\u001b[0m\n", - "Calling train\n" - ] - }, { "name": "stderr", "output_type": "stream", "text": [ - "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field, packing. Will not be supported from version '0.13.0'.\n", + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/huggingface_hub/utils/_deprecation.py:100: FutureWarning: Deprecated argument(s) used in '__init__': max_seq_length, dataset_text_field. Will not be supported from version '0.13.0'.\n", "\n", "Deprecated positional argument(s) used in SFTTrainer, please use the SFTConfig to set these arguments instead.\n", " warnings.warn(message, FutureWarning)\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:212: UserWarning: You passed a `packing` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", - " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:300: UserWarning: You passed a `max_seq_length` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", - " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", - "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", - " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[94mSeattle evaluation loss: 0.5621325373649597\u001b[0m\u001b[94m\n", + "\u001b[0m\n", + "Calling train\n", + "\u001b[94m[Seattle] Restoring optimizer state\u001b[0m\u001b[94m\n", "\u001b[0m" ] }, { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - " \n", - " [229/229 13:28, Epoch 0/1]\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [25/25 01:29, Epoch 0/1]\n", + "
\n", + "
StepTraining Loss
100.294400
200.284700
300.289000
400.282800
500.279500
600.277900
700.289600
800.294600
900.275700
1000.276200
\n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
StepTraining Loss
1100.28060020.038600
1200.28470040.032600
1300.29260060.056700
1400.29780080.066900
1500.281700100.062500
1600.305000120.060700
1700.288500140.078300
1800.301900160.075200
1900.292400180.063500
2000.303000200.071600
2100.317300220.064000
2200.305900240.045200

" @@ -3274,6 +11337,14 @@ " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", + "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", + " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m" ] }, @@ -3281,8 +11352,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", - "Calling local_model_validation\n" + "\u001b[94m[Seattle] Training completed, average loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m" ] }, { @@ -3299,6 +11370,23 @@ " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:328: UserWarning: You passed a `dataset_text_field` argument to the SFTTrainer, the value you passed will override the one in the `SFTConfig`.\n", " warnings.warn(\n", + "\u001b[0mmax_steps is given, it will override any value given in num_train_epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling local_model_validation\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/trl/trainer/sft_trainer.py:428: UserWarning: You passed `packing=True` to the SFTTrainer/SFTConfig, and you are training your model with `max_steps` strategy. The dataset will be iterated until the `max_steps` are reached.\n", + " warnings.warn(\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.float32 to float16 during quantization\n", " warnings.warn(f\"MatMul8bitLt: inputs will be cast from {A.dtype} to float16 during quantization\")\n", "\u001b[0m\u001b[94m/home/azureuser/env_name/lib/python3.10/site-packages/bitsandbytes/autograd/_functions.py:315: UserWarning: MatMul8bitLt: inputs will be cast from torch.bfloat16 to float16 during quantization\n", @@ -3328,195 +11416,526 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", + "\u001b[94m[Seattle] Local evaluation loss: 0.5817354321479797\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mDoing local model validation for collaborator Seattle\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "==== Memory Usage Report for Seattle (8bit) ====\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94mPeak Memory Usage:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 75529.57 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 93476.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 92767.32 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40191.22 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60688.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "Memory Usage by Stage:\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m model_load:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 73023.56 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 74242.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 92767.32 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 37878.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 38938.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m before_training:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 75388.56 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 93476.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 92767.32 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 40191.22 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 60688.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m after_training:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Allocated: 75529.57 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Reserved: 83044.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Max Allocated: 92767.32 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Allocated: 39944.87 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Reserved: 43002.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Max Allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "Performance Metrics:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Training Loss: 0.2912\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m Evaluation Loss: 0.3080\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Evaluation Loss: 0.5817\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", "\u001b[0mShould transfer from local_model_validation to join\n", "\n", "Calling join\n", - "\u001b[94mAverage aggregated model validation values = 0.30404751002788544\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94mAverage training loss = 0.29131152119699005\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94mAverage local model validation values = 0.3009362369775772\u001b[0m\u001b[94m\n", + "\u001b[94m[Round 4, Update 1] Average aggregated model validation loss = 0.556217223405838\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 4, Update 1] Average training loss = inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m[Round 4, Update 1] Average local model validation loss = 0.5808427929878235\u001b[0m\u001b[94m\n", "\u001b[0m\n", "Calling end\n", "\u001b[94mThis is the end of the flow for 8bit quantization\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "===== Final Metrics =====\n", "\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94mAverage Training Loss: 0.2913\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94mFinal Aggregated Model Loss: 0.3040\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94mFinal Local Model Loss: 0.3009\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mAverage Training Loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mFinal Aggregated Model Loss: 0.5562\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mFinal Local Model Loss: 0.5808\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "===== Metric History =====\n", + "\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94mTraining Loss History:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 0: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 1: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 2: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 3: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 4: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 5: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 6: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 7: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 8: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 9: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Aggregated Model Loss History:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 0: 0.5627\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 1: 0.3971\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 2: 0.3916\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 3: 0.3973\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 4: 0.4091\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 5: 0.4787\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 6: 0.5087\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 7: 0.5295\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 8: 0.5521\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 9: 0.5562\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m\n", + "Local Model Loss History:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 0: 0.3994\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 1: 0.3946\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 2: 0.4055\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 3: 0.4214\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 4: 0.4889\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 5: 0.5187\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 6: 0.5472\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 7: 0.5735\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 8: 0.5785\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m Update 9: 0.5808\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", "===== Memory Usage Summary Across All Rounds =====\n", "\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", - "==== Portland Memory Usage Across Rounds (8bit) ====\n", - "\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m round_0:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_allocated: 75278.13 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_reserved: 93310.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_max_allocated: 92214.55 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m training_loss: 0.3243\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m eval_loss: 0.2989\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_allocated: 72811.06 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_reserved: 91120.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_max_allocated: 91914.16 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_allocated: 75278.13 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_reserved: 93310.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_max_allocated: 92214.55 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_allocated: 75250.57 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_reserved: 83158.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_max_allocated: 92214.55 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m round_1:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_allocated: 75488.79 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_reserved: 93552.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_max_allocated: 92552.04 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m training_loss: 0.2914\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m eval_loss: 0.2939\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_allocated: 73023.56 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_reserved: 74272.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_max_allocated: 92551.30 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_allocated: 75488.79 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_reserved: 93552.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_max_allocated: 92552.04 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_allocated: 75466.38 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_reserved: 82944.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_max_allocated: 92552.04 MB\u001b[0m\u001b[94m\n", + "==== Portland Memory Usage Across Rounds/Updates (8bit) ====\n", + "\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_0_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 39210.98 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 59636.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 56253.51 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.3953\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 36814.91 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38196.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 55894.31 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 39210.98 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 59636.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 56253.51 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39008.34 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42136.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 56253.51 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_0_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40100.06 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 60872.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57164.02 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.3961\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37719.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38654.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 56518.59 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40100.06 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 60872.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57164.02 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39808.58 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42766.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57164.02 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_1_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40210.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 61118.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57272.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.4059\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37825.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38822.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57214.60 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40210.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 61118.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57272.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39916.32 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42894.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57272.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_1_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40210.16 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 60316.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.4210\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37825.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38794.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40210.16 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 60316.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39911.82 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42890.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_2_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40203.53 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 61136.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.5077\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37825.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38848.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40203.53 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 61136.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39909.20 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42830.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_2_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40192.70 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 61154.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.5100\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37825.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38856.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40192.70 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 61154.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39908.28 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42890.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_3_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40187.96 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 60596.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.5614\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37825.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38822.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40187.96 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 60596.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39911.37 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42870.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_3_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40185.57 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 60476.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.5784\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37825.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38820.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40185.57 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 60476.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39910.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42950.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_4_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40181.67 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 60874.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.5927\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37825.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38838.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40181.67 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 60874.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39912.48 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42850.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_4_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40182.25 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 60476.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.5800\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37825.69 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38820.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40182.25 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 60476.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39911.18 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42930.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m\n", - "==== Seattle Memory Usage Across Rounds (8bit) ====\n", - "\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m round_0:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_allocated: 58276.76 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_reserved: 83620.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_max_allocated: 92551.30 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m training_loss: 0.3242\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m eval_loss: 0.3134\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_allocated: 55775.01 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_reserved: 74152.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_max_allocated: 92551.30 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_allocated: 58145.08 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_reserved: 83620.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_max_allocated: 92551.30 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_allocated: 58276.76 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_reserved: 65726.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_max_allocated: 92551.30 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m round_1:\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_allocated: 75529.57 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_reserved: 93476.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m peak_max_allocated: 92767.32 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m training_loss: 0.2912\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m eval_loss: 0.3080\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_allocated: 73023.56 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_reserved: 74242.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m model_load_max_allocated: 92767.32 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_allocated: 75388.56 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_reserved: 93476.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m before_training_max_allocated: 92767.32 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_allocated: 75529.57 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_reserved: 83044.00 MB\u001b[0m\u001b[94m\n", - "\u001b[0m\u001b[94m after_training_max_allocated: 92767.32 MB\u001b[0m\u001b[94m\n", + "==== Seattle Memory Usage Across Rounds/Updates (8bit) ====\n", + "\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_0_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 39317.46 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 59596.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 56364.86 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.4035\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 36974.44 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38276.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 56364.86 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 39317.46 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 59596.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 56364.86 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39149.93 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42176.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 56364.86 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_0_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40105.33 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 60902.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57210.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.3932\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37772.41 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38798.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57164.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40105.33 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 60902.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57210.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39841.12 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42898.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57210.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_1_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40215.71 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 60930.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57319.97 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.4052\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37878.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38916.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57272.77 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40215.71 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 60930.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57319.97 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39949.17 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42986.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57319.97 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_1_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40218.59 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 61308.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.4217\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37878.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38902.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40218.59 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 61308.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39946.36 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42924.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_2_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40210.40 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 61008.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.4701\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37878.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38938.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40210.40 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 61008.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39941.88 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 43064.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_2_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40199.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 60928.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.5275\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37878.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38960.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40199.68 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 60928.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39946.38 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42922.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_3_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40194.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 61068.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.5329\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37878.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38914.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40194.72 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 61068.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39942.97 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42944.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_3_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40193.50 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 60808.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.5686\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37878.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38936.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40193.50 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 60808.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39946.86 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 42922.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_4_update_0:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40189.73 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 61506.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.5643\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37878.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38928.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40189.73 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 61506.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39944.91 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 43022.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m round_4_update_1:\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_allocated: 40191.22 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_reserved: 60688.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m peak_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m training_loss: inf\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m eval_loss: 0.5817\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_allocated: 37878.81 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_reserved: 38938.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m model_load_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_allocated: 40191.22 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_reserved: 60688.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m before_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_allocated: 39944.87 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_reserved: 43002.00 MB\u001b[0m\u001b[94m\n", + "\u001b[0m\u001b[94m after_training_max_allocated: 57321.08 MB\u001b[0m\u001b[94m\n", "\u001b[0m\u001b[94m--------------------------------------------------\u001b[0m\u001b[94m\n", "\u001b[0m" ] } ], "source": [ - "# Setup participants\n", - "aggregator = Aggregator()\n", - "collaborators = [\n", - " Collaborator(name=\"Portland\"),\n", - " Collaborator(name=\"Seattle\")\n", - "]\n", - "\n", - "# Assign data shards\n", - "for idx, colab in enumerate(collaborators):\n", - " colab.private_attributes = {\n", - " \"train_dataset\": train_dataset.shard(len(collaborators), idx),\n", - " \"eval_dataset\": eval_dataset.shard(len(collaborators), idx)\n", - " }\n", - "\n", - "# First run with 4-bit quantization\n", - "print(\"\\n=============== Running with 4-bit Quantization ===============\\n\")\n", - "bnb_config = bnb_config_4bit # Set active config to 4-bit\n", - "runtime = LocalRuntime(aggregator=aggregator, collaborators=collaborators)\n", - "flflow_4bit = FederatedFlow(model, rounds=2, quant_type=\"4bit\")\n", - "flflow_4bit.runtime = runtime\n", - "flflow_4bit.run()\n", - "\n", "# Clean up CUDA cache between runs\n", "if torch.cuda.is_available():\n", " torch.cuda.empty_cache()\n", " print(\"Cleared CUDA cache between runs\")\n", "\n", - "# Then run with 8-bit quantization\n", + "import gc\n", + "import time\n", + "\n", + "# Force garbage collection\n", + "gc.collect()\n", + "time.sleep(5) # Give system time to free memory\n", + "\n", + "# Run with 8-bit quantization\n", "print(\"\\n=============== Running with 8-bit Quantization ===============\\n\")\n", "bnb_config = bnb_config_8bit # Set active config to 8-bit\n", - "# Reload the model with 8-bit quantization\n", + "\n", + "# Force model to be loaded on CPU first for 8-bit quantization\n", + "print(\"Loading model with 8-bit quantization on CPU first...\")\n", "model_8bit = AutoModelForCausalLM.from_pretrained(\n", " model_name,\n", + " device_map=\"cpu\", # Start on CPU to avoid OOM\n", " quantization_config=bnb_config_8bit,\n", - " device_map=\"auto\",\n", - " trust_remote_code=True\n", + " trust_remote_code=True,\n", + " torch_dtype=torch.float32, # Use float32 for CPU\n", + " low_cpu_mem_usage=True\n", ")\n", "model_8bit = prepare_model_for_kbit_training(model_8bit)\n", "model_8bit = get_peft_model(model_8bit, peft_config)\n", "\n", + "# Use only one round and one collaborator for 8-bit to save memory\n", "runtime = LocalRuntime(aggregator=aggregator, collaborators=collaborators)\n", - "flflow_8bit = FederatedFlow(model_8bit, rounds=2, quant_type=\"8bit\")\n", + "flflow_8bit = FederatedFlow(model_8bit, rounds=5, quant_type=\"8bit\")\n", "flflow_8bit.runtime = runtime\n", "flflow_8bit.run()" ] }, { "cell_type": "markdown", - "id": "6e1268ae", + "id": "ebe541a4", + "metadata": {}, + "source": [ + "## Visualize Memory and Performance Metrics" + ] + }, + { + "cell_type": "markdown", + "id": "4718aa9f", "metadata": {}, "source": [ - "## Compare VRAM Usage and Training Loss Between 4-bit and 8-bit" + "Now that we've run our federated training with both 4-bit and 8-bit quantization, let's visualize the memory usage and performance metrics to understand the tradeoffs between these approaches." ] }, { "cell_type": "code", - "execution_count": 12, - "id": "6f5caae6", + "execution_count": 15, + "id": "d84d3daa-7520-4b3f-a1d6-ae7cebec58e7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "==== Memory Usage Comparison: 4-bit vs 8-bit ====\n", - "\n" + "Converting any CUDA tensors to CPU for visualization...\n", + "Conversion complete. Ready for visualization.\n" ] - }, + } + ], + "source": [ + "# Pre-process tensors to fix CUDA to CPU conversion issues\n", + "def tensor_to_float(val):\n", + " if val is None:\n", + " return None\n", + " if isinstance(val, torch.Tensor):\n", + " return val.detach().cpu().float().numpy().item()\n", + " return val\n", + "\n", + "# Convert all tensors in both flow objects\n", + "print(\"Converting any CUDA tensors to CPU for visualization...\")\n", + "\n", + "# Convert the history lists\n", + "flflow_4bit.average_loss_history = [tensor_to_float(x) for x in flflow_4bit.average_loss_history]\n", + "flflow_4bit.agg_model_loss_history = [tensor_to_float(x) for x in flflow_4bit.agg_model_loss_history]\n", + "flflow_4bit.local_model_loss_history = [tensor_to_float(x) for x in flflow_4bit.local_model_loss_history]\n", + "\n", + "flflow_8bit.average_loss_history = [tensor_to_float(x) for x in flflow_8bit.average_loss_history]\n", + "flflow_8bit.agg_model_loss_history = [tensor_to_float(x) for x in flflow_8bit.agg_model_loss_history]\n", + "flflow_8bit.local_model_loss_history = [tensor_to_float(x) for x in flflow_8bit.local_model_loss_history]\n", + "\n", + "# Convert current values\n", + "flflow_4bit.average_loss = tensor_to_float(flflow_4bit.average_loss)\n", + "flflow_4bit.aggregated_model_accuracy = tensor_to_float(flflow_4bit.aggregated_model_accuracy)\n", + "flflow_4bit.local_model_accuracy = tensor_to_float(flflow_4bit.local_model_accuracy)\n", + "\n", + "flflow_8bit.average_loss = tensor_to_float(flflow_8bit.average_loss)\n", + "flflow_8bit.aggregated_model_accuracy = tensor_to_float(flflow_8bit.aggregated_model_accuracy)\n", + "flflow_8bit.local_model_accuracy = tensor_to_float(flflow_8bit.local_model_accuracy)\n", + "\n", + "# Convert tensors in memory stats\n", + "for collab, rounds_data in flflow_4bit.all_memory_stats.items():\n", + " for round_name, stats in rounds_data.items():\n", + " if \"training_loss\" in stats and isinstance(stats[\"training_loss\"], torch.Tensor):\n", + " stats[\"training_loss\"] = tensor_to_float(stats[\"training_loss\"])\n", + " if \"eval_loss\" in stats and isinstance(stats[\"eval_loss\"], torch.Tensor):\n", + " stats[\"eval_loss\"] = tensor_to_float(stats[\"eval_loss\"])\n", + "\n", + "for collab, rounds_data in flflow_8bit.all_memory_stats.items():\n", + " for round_name, stats in rounds_data.items():\n", + " if \"training_loss\" in stats and isinstance(stats[\"training_loss\"], torch.Tensor):\n", + " stats[\"training_loss\"] = tensor_to_float(stats[\"training_loss\"])\n", + " if \"eval_loss\" in stats and isinstance(stats[\"eval_loss\"], torch.Tensor):\n", + " stats[\"eval_loss\"] = tensor_to_float(stats[\"eval_loss\"])\n", + "\n", + "print(\"Conversion complete. Ready for visualization.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "e6c8db6d", + "metadata": {}, + "outputs": [ { "data": { - "image/png": "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3nuP77//noMHD3Lu3DkaNWrE5cuX6datmyVeYo5zSrUZERERkVeVOjVERETktXfr1q1YH5obhmGZ13348OEYhmF50JZUP//8c6zh0Q8nK1SoYLXAblyiH3JHREQ8VT0garHoli1bYjabmTlzJr///jvXr1+nfPny5MmTJ1F5eHt7M3r0aADOnTsX59oMj3v8AXFcIxiiO43im7olPvv372f//v0xwg8ePMju3buxsbGhUqVKicrrWY511apVLYsRd+3aNd43yAcNGsTVq1dJmzat1cNR+P+HnocPH46R7sGDB7Gu43D79m0iIyPx8PCItXPg559/TvaRDM9yrJYuXUqPHj1wd3fnjz/+iHP6Hfj/zq7s2bPH2BYaGspvv/2WrPWzs7OjQoUKgPXIpsf99NNPQNQ5f9769euHvb09+/btY+zYsQnG37hxo+XfVapUAWDevHmxTgW1aNEibt68ibu7u2WkUUpIym9j9PnPlClTrL+XceX1PGTNmtWyePfjo8aij/PKlStjnX5uz5497N27N0m/RSIiIiJiTZ0aIiIiIilg165dlk6AaJs2beLbb78FoHfv3onKJ3qUwfHjxwkPD3/q+jw+BVX0Q9nYRmmcPXuWH3/8MdY56n///XcA0qZNG+fIi8c5ODjQsGFDIOpB/pOdD2vXrrU8qI2ehiqpDMOgc+fOVp0st2/fpnPnzhiGQdOmTcmaNWui8oo+1vHN3R+fn3/+GU9PT7Zt20b9+vVjLH7+8OFDPv74Y7766ivs7OyYP3++1boJANWrVwfg22+/tZp///79+3To0CHWBdUzZsxI2rRpuXXrlmW6r2hbt25lwIABT7U/8XnaY7V9+3befvttbGxsWLBgQayLvD8uerHkGTNmWI1eCQ0NpUuXLnG+9f8sfzcffvghAJMnT44x1dr06dNZunQp9vb29OzZM0n5Po18+fJZ1qLp06cPAwcOjHUUz7Fjx3j77bfp0aOHJax58+Zky5aNCxcu0KdPH6sOntOnT1v2s3v37rEu+P28JOW3MU+ePNja2nLgwAHLgtzRfv/9d7755ptkr9+ePXuYN28eDx8+jLEt+jfw8U62ChUqULp0aR4+fEjHjh158OCBZdu1a9fo2LEjELVge2J/i0RERETEmhYKFxEREUkBPXr0YMCAAcycOZPChQtz4cIFNm7ciNlspmfPntSt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rFesWMHhw4epV69eovOqU6cO6dOnZ9SoUfz111+Jnh82em7diRMnxtj27bffWsUBLOcwmpubG7ly5bLUP7ZzCzB27Fir77a2tlSvXp3Fixdz4cIFS/iJEydYsWKFVdzEtquERO9PtAkTJsTYP4D33nuPmzdv0rFjR+7du5foYxmXjz/+mPDwcMvIn7p16wIxj0n09sfPu7+/Pxs2bLCK9/3338f5JldCqlevjr29PRMmTLA6lk/WRURERERiiu1aNywsjEmTJqVWlawk5Rr7aSX2HubBgweEhoZapfX398fd3d2S7ubNmzGu74sWLQqQqCmoLly4wKJFiyzf79y5w8yZMylatCg+Pj6WcDs7O95++21+/fVXpk+fTqFChShcuHDSdvwxnp6edOzYkVWrVrF3714g6hp/+/bt/P3335Z49+/f5/vvv8fPz4/8+fMDWNZEefwaPzIyku+///6p61O3bl0uXLjAggULLGEPHjx4pjxF5PWmkRoi8lrx9/dnxIgRDBgwgDNnztC4cWPc3d05ffo0ixYtokOHDvTt25eAgAD8/f3p27cv//33Hx4eHvz2228Jvinu7OzMsmXLePPNN6lTpw5//fUXBQsWTFIde/bsmWCc9957j19//ZVOnToREhJC+fLliYyM5MiRI/z666+sWrUqycOMY2Nvb8+oUaMICgqicuXKvP3221y+fJlx48bh5+dH7969k5RXq1atmDhxIra2trz99tuJSle0aFHatWvHuHHjOH78ODVq1ACiRs0sX76cdu3aUaRIEUv8/PnzU6VKFUqUKEG6dOnYuXMnCxYsoFu3bkDU4nzR8+WGh4eTOXNm/vzzz1jfXgsODubPP/+kfPnydO7cmcjISCZOnEjBggUtNweQ+HaVkNOnT9OwYUNq167N33//zc8//0zr1q2t9g+i1l8pWLCgZcH44sWLJ+pYxiV//vzUrVuXH3/8kUGDBlGkSBHatm3L999/b5nCYPv27cyYMYPGjRtTtWpVS9p27drRqVMnmjZtSo0aNdi3bx+rVq0iffr0T1UXb29v+vbty8iRI6lfvz5169Zlz549rFix4qnzFBEREXldlCtXjrRp09K2bVt69OiByWRi1qxZL9RUQIm9xo5PeHg4I0aMiBGeLl06unTpkqh7mGPHjlGtWjVatGhB/vz5sbOzY9GiRVy+fJlWrVoBMGPGDCZNmsRbb72Fv78/d+/e5YcffsDDw8PyIlB88uTJwwcffMCOHTvImDEjP/30E5cvX2batGkx4rZp04bx48cTEhLCqFGjEnUc4tOzZ0/Gjh3LF198wdy5c+nfvz+//PILderUoUePHqRLl44ZM2Zw+vRpfvvtN8tUVwUKFKBMmTIMGDCAGzdukC5dOubOnUtERMRT16V9+/ZMnDiRNm3asGvXLnx9fZk1axYuLi7PvJ8i8poyREReEdOmTTMAY8eOHQnG/e2334wKFSoYrq6uhqurqxEQEGB07drVOHr0qCXOoUOHjOrVqxtubm5G+vTpjfbt2xv79u0zAGPatGmWeG3btjVcXV2t8r927ZqRP39+w8fHxzh+/Hic9RgyZIgBGFevXo23voDRtWtXq7CwsDBj1KhRRoECBQxHR0cjbdq0RokSJYyhQ4cat2/fjjft6dOnDcD48ssvrcJDQkIMwJg/f75V+Lx584xixYoZjo6ORrp06Yx33nnHOH/+vFWc2I7Dk7Zv324ARs2aNeON96TIyEhj3LhxRpEiRQwnJyfDycnJKFKkiDF+/HgjMjLSKu6IESOMUqVKGZ6enoazs7MREBBgfPbZZ0ZYWJglzvnz54233nrL8PT0NNKkSWM0b97cuHDhggEYQ4YMscpv7dq1RrFixQwHBwfD39/f+PHHH40PP/zQcHJyilHPxLSr2ES3g0OHDhnNmjUz3N3djbRp0xrdunUzHj58GGua0aNHG4Dx+eefJ/IoGkblypWNAgUKxLpt/fr1VvsfHh5uDB061MiRI4dhb29vZM2a1RgwYIARGhpqlS4yMtLo16+fkT59esPFxcWoVauWceLECSN79uxG27ZtLfHi+vuMbnMhISFWeQ4dOtTw9fU1nJ2djSpVqhj//PNPjDxFREREXgddu3Y1nnx8E9913ebNm40yZcoYzs7ORqZMmYyPP/7YWLVqVYxrrrZt2xrZs2e3fI/rHsEwjBjXydHXr0/GefK+wzCMWK/hknKN/aS2bdsaQKwff39/S7yE7mGuXbtmdO3a1QgICDBcXV2NNGnSGKVLlzZ+/fVXS5zdu3cbb7/9tpEtWzbD0dHRyJAhg1G/fn1j586dCdYze/bsRr169YxVq1YZhQsXNhwdHY2AgIAY91qPK1CggGFjYxPjXisu8Z0zwzCMwMBAw9bW1jhx4oRhGIZx8uRJo1mzZoanp6fh5ORklCpVyli2bFmMdCdPnjSqV69uODo6GhkzZjQGDhxorF69OkYbiqsdPtm2DMMwzp49azRs2NBwcXEx0qdPb/Ts2dNYuXJljDxFRBLDZBgvUHe9iIi80vbt20fRokWZOXPmM80Rm9oaN27MwYMHY6zDkZLGjRtH7969OXPmDNmyZUu1eoiIiIiIJIcX4Ro7tRUrVox06dKxdu3a1K6KiMgLTWtqiIhIivnhhx9wc3OjSZMmqV2VRHv48KHV9+PHj7N8+fKnWgg+uRiGwdSpU6lcubI6NERERETkpfMiXmOntp07d7J3717atGmT2lUREXnhaU0NERF57n7//XcOHTrE999/T7du3XB1dU3tKiVazpw5CQwMJGfOnJw9e5bJkyfj4ODAxx9/nOJ1uX//PkuXLiUkJIQDBw6wZMmSFK+DiIiIiMizepGusVPbP//8w65duxgzZgy+vr60bNkytaskIvLCU6eGiIg8d927d+fy5cvUrVuXoUOHpnZ1kqR27dr88ssvXLp0CUdHR8qWLcvnn39O7ty5U7wuV69epXXr1nh6ejJw4EAaNmyY4nUQEREREXlWL9I1dmpbsGABw4YNI2/evPzyyy84OTmldpVERF54WlNDREREREREREREREReClpTQ0REREREREREREREXgqafuopmc1mLly4gLu7OyaTKbWrIyIiIiKS4gzD4O7du2TKlAkbG70v9Sx0fyEiIiIir7vE3l+oU+MpXbhwgaxZs6Z2NUREREREUt2///5LlixZUrsaLzXdX4iIiIiIREno/kKdGk/J3d0diDrAHh4eKV6+2Wzm6tWreHt7662415TagKgNiNqAqA283l6E83/nzh2yZs1quTaWp5fa9xfwYrQpST06/6I2IGoDojYgqd0GEnt/oU6NpxQ9JNzDwyPVOjVCQ0Px8PDQj8xrSm1A1AZEbUDUBl5vL9L513RJzy617y/gxWpTkvJ0/kVtQNQGRG1AXpQ2kND9hVqniIiIiIiIiIiIiIi8FNSpISIiIiIiIiIiIiIiLwV1aoiIiIiIiIiIiIiIyEtBa2qIiIiIiIiIiIiICACRkZGEhYWldjUkFZjNZsLDwwkNDX0ua2rY29tja2v7zPmoU0NERERERERERETkNWcYBnfv3uXGjRsJLtQsrybDMDCbzdy9e/e5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bW1x//59/PPPP+jcuTOAnKSHnp6e0n6Dg4Px5MmTt+6XiIiIiIgKjiM1iIiIiIjogzFmzBgMGDAAPj4+qFevHhYtWoRXr15h0KBBAID+/fujXLlymDNnDgBg3rx5mDJlCjZt2gQ3NzfFOzBMTExgYmICANi+fTtsbW3h4uKCmzdv4ptvvkGXLl3Qpk0bADnJjsGDB2PMmDGwsrKCmZkZRo4ciYYNG6p9STgRERERERUekxpERERERPTB6NWrF6KjozFlyhRERESgVq1aOHz4sOLl4U+ePFGaqzcgIAAZGRno3r270namTp2KadOmAQBevHiBMWPGIDIyEo6Ojujfvz8mT56sVP+XX36BVCpFt27dkJ6eDj8/Pyxfvrx4D5aIiIiIqAySiPd5u10ZlpCQAAsLCzx9+hRmZmYa379cLkd0dLTW3kRP2sc2QGwDxDZAbANlW0m4/omJiXB2dkZ8fDzMzc21EsOHQtv9C6BktCnSHl5/YhsgtgFiGyBtt4H89i84UqOQkpKSAADOzs5ajoSIiIiISLuSkpKY1HhP7F8QEREREeV4V/+CIzUKSS6XIzw8HKamppBIJBrff27WSpvf5CLtYhsgtgFiGyC2gbKtJFx/IQSSkpLg5OTEb/O9J233L4CS0aZIe3j9iW2A2AaIbYC03Qby27/gSI1CkkqlKF++vLbDgJmZGX/JlHFsA8Q2QGwDxDZQtmn7+nOERtEoKf0LQPttirSL15/YBohtgNgGSJttID/9C36dioiIiIiIiIiIiIiISgUmNYiIiIiIiIiIiIiIqFRgUqOUkslkmDp1KmQymbZDIS1hGyC2AWIbILaBso3Xn4oa21TZxutPbAPENkBsA1Ra2gBfFE5ERERERERERERERKUCR2oQEREREREREREREVGpwKQGERERERERERERERGVCkxqEBERERERERERERFRqcCkBhERERERERERERERlQpMahARERERERERERERUanApEYJtmzZMri5ucHAwAD169fHpUuX3lp/+/bt8PLygoGBAapXr46DBw9qKFIqLgVpA7///juaNGkCS0tLWFpawtfX951thkq+gv4eyLVlyxZIJBJ06dKleAOkYlfQNhAfH4/hw4fD0dERMpkMlStX5v8HpVhBr/+iRYvg6ekJQ0NDODs749tvv0VaWpqGoqWi9tdff6FTp05w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7GOUXR9S/0IiBMcKERERERERERERERFRycd3ahARERERERERERERUanApAYREREREREREREREZUKTGoQEREREREREREREVGpwKQGERERERERERERERGVCkxqEBERERERERERERFRqcCkBhERERERERERERERlQpMahARERERERERERERUanApAYREREREREREREREZUKTGoQEREBaN68OUaPHq3tMIiIiIiI6APA/gURUfFhUoOIiDRm4MCBkEgkkEgk0NPTg7u7O8aNG4e0tDRth0ZERERERKUM+xdERGWTrrYDICKisqVt27ZYu3YtMjMzceXKFQwYMAASiQTz5s3TdmhERERERFTKsH9BRFT2cKQGERFplEwmg4ODA5ydndGlSxf4+vri2LFjAID09HSMGjUKdnZ2MDAwQOPGjXH58mXFuuvWrYOFhYXS9nbv3g2JRKL4PG3aNNSqVQsbNmyAm5sbzM3N0bt3byQlJSnqvHr1Cv3794eJiQkcHR3x888/F+9BExERERFRsWD/goio7GFSg4iItObWrVv4+++/oa+vDwAYN24c/vzzT6xfvx5Xr15FxYoV4efnh7i4uAJtNzQ0FLt378b+/fuxf/9+nD59GnPnzlUs/+6773D69Gns2bMHR48exalTp3D16tUiPTYiIiIiItIs9i+IiMoGJjWIiEij9u/fDxMTExgYGKB69eqIiorCd999h1evXiEgIAA//fQT2rVrB29vb/z+++8wNDTE6tWrC7QPuVyOdevWoVq1amjSpAn69euHEydOAACSk5OxevVqLFiwAK1atUL16tWxfv16ZGVlFcfhEhERERFRMWL/goio7OE7NYiISKNatGiBgIAAvHr1Cr/88gt0dXXRrVs33LhxA5mZmWjUqJGirp6eHurVq4e7d+8WaB9ubm4wNTVVfHZ0dERUVBSAnG9ZZWRkoH79+orlVlZW8PT0fM8jIyIiIiIiTWP/goio7GFSg4iINMrY2BgVK1YEAKxZswY1a9bE6tWrUbdu3XeuK5VKIYRQKsvMzFSpp6enp/RZIpFALpe/R9RERERERFQSsX9BRFT2cPopIiLSGqlUikmTJuGHH36Ah4cH9PX1ce7cOcXyzMxMXL58Gd7e3gAAW1tbJCUl4dWrV4o6169fL9A+PTw8oKenh4sXLyrKXr58iZCQkPc7GCIiIiIi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ouKUlZUFJycndOrUCatXr9Z2OERERET0AYmJiYGjoyOmTJmCyZMnazucQhs9ejRWrlyJ5OTkPF8aTUREBPCdGkRERMVu9+7diI6ORv/+/bUdChERERF9YNatW4fs7Gz069dP26HkW2pqqtLn2NhYbNiwAY0bN2ZCg4iI3onv1CAiIiomFy9exI0bNzBz5kx89NFHaNasmbZDIiIiIqIPxMmTJ3Hnzh38+OOP6NKlC9zc3LQdUr41bNgQzZs3R5UqVRAZGYnVq1cjMTGxVI80ISIizeH0U0RERMVk4MCB2LhxI2rVqoV169ahWrVq2g6JiIiIiD4QzZs3x99//41GjRph48aNKFeunLZDyrdJkyZhx44dePbsGSQSCWrXro2pU6fC19dX26EREVEpwKQGERERERERERERERGVCnynBhERERERERERERERlQp8p0YhyeVyhIeHw9TUFBKJRNvhEBERERFpnBACSUlJcHJyglTK70u9D/YviIiIiKisy2//gkmNQgoPD4ezs7O2wyAiIiIi0rqnT5+ifPny2g6jVGP/goiIiIgox7v6F0xqFJKpqSmAnBNsZmam8f3L5XJER0fD1taW34oro9gGiG2A2AaIbaBsKwnXPzExEc7Ozop7Yyo8bfcvSrOS8G+hrOC51hyea83i+dYcnmvN4bnWHJ7ropPf/gWTGoWUOyTczMxMa0mNtLQ0mJmZ8R9LGcU2QGwDxDZAbANlW0m6/pwu6f1pu39RmpWkfwsfOp5rzeG51iyeb83hudYcnmvN4bkueu/qX/AsExERERERERERERFRqcCkBhERERERERERERERlQpMahARERERERERERERUanAd2oQERERlWJCCKSlpXHu1jJILpcjMzOzWK+/np4edHR0imXb9GEYOHAg1q9fDwDQ1dVF+fLl0aNHD8yYMQMGBgYAgLi4OIwcORL79u2DVCpFt27dsHjxYpiYmGgzdCIiIiIqpZjUICIiIiqlMjIyEBsbi5cvX/JFzWWQEAJyuRxJSUnFev0tLCzg4ODANkZ5atu2LdauXYvMzExcuXIFAwYMgEQiwbx58wAAn332GV68eIFjx44hMzMTgwYNwpAhQ7Bp0yYtR05EREREpRGTGkRERESlkBACERER0NfXR7ly5fht+jJICIGsrCzo6uoWS8JBCIGUlBRERUUBABwdHYt8H/RhkMlkcHBwAAA4OzvD19cXx44dw7x583D37l0cPnwYly9fho+PDwBgyZIlaN++PRYsWAAnJydthk5EREREpRCTGkRERESlUFZWFlJSUuDg4AAjIyN+i74MKu6kBgAYGhoCAKKiomBnZ8fkGb3TrVu38Pfff8PV1RUAcP78eVhYWCgSGgDg6+sLqVSKixcvomvXrtoKlYiIiIhKKSY1iIiIiEqh7OxsADnvPCAqTkZGRgCAzMxMJjVIrf3798PExARZWVlIT0+HVCrF0qVLAQARERGws7NTqq+rqwsrKytERERoI1wiIiIiKuWY1CAiIiIiojxxFBC9S4sWLRAQEIBXr17hl19+ga6uLrp166btsIiIiIjoAyXVdgBERERERERUehkbG6NixYqoWbMm1qxZg4sXL2L16tUAAAcHB8V7WXJlZWUhLi5O8R4OIiIiIqKCYFKDiIiIiIiIioRUKsWkSZPwww8/IDU1FQ0bNkR8fDyuXLmiqHPy5EnI5XLUr19fi5ESERERUWnFpAYRERFRGZadDZw6BWzenPPn/7+q44Pw6NEjSCQSXL9+vdj35ebmhkWLFr21TkZGBipWrIi///77vfY1bdo01KpV6611Bg4ciC5dury1zp07d1C+fHm8evXqveKh0i88KRyhcaEF/glPCle7vR49ekBHRwfLli1DlSpV0LZtW/j7++PSpUs4d+4cRowYgd69e8PJyUnDR0pEREREHwK+U4OIiIiojNq5E/jmG+DZs//KypcHFi8GPv20ePY5cOBArF+/HkDOS85dXFzQv39/TJo0Cbq6hb81HThwIOLj47F79+4iirTorVixAu7u7vj4449VlqWnp6N+/fr4999/ce3atXcmLd5l8eLFEEIoPjdv3hy1atVSSrx4e3ujQYMGWLhwISZPnvxe+6PSKzwpHH3+7IOk9KQCr2sqM4V9pr1Kua6uLkaMGIH58+fj66+/RmBgIEaMGIFWrVpBKpWiW7du+PXXX4sifCIiIiIqg5jUICIiIiqDdu4EuncHXnvuDQB4/jynfMeO4ktstG3bFmvXrkV6ejoOHjyI4cOHQ09PDxMnTizwtrKzs0vFi6yFEFi6dClmzJihdvm4cePg5OSEf//9t0j2Z25unq96gwYNgr+/PyZOnPheSSUqvVIzU5GUngSZrgyGuob5Xy8rZ701S9bAw8pD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K6OSVSWYykw1cVhURs3c/3/s/XmYVOWd//+/TnX1vm/Ve9M7iCKgyOKKEcW4KxL96oziOJqYIYkSzbiBWwzRzCXGaHTmF43G5RMzGWOMaxBXFEFRVBR6oel9qd73ver3x7EbiqpuGuiu6uX5uK5zNZz1PjentU6/+n3f92nd39dJ0tDX6RZsZGRk6MYbb9SNN954ROd58skn9eKLL+qf//znuLfHMAy99NJLOu+884bd59Zbb1VHR4d+97vfHVF7JhPeLwAAAICpz+fDT61Zs0ZXX321FixYoIULF+rhhx9WR0eHrrnmGknSVVddpZSUFK1fv16SOfbsggULlJ2drZ6eHr3++ut69tln9fjjjw+ds7GxUWVlZaqqqpIk5efnS5ISExOVmJioPXv26IUXXtA555yj2NhYffXVV7rpppt06qmn6thjj/VyDwAAppKY4BgtTl2sxamLXdY7nA5VtFZ4DDxKmkvU2tOqz6o+02dVn7mdMzk82WN1x4yIGd66LUxR+wcag8Y72Kirq9O6dev02muvqba2VtHR0Zo7d67WrVunk046acyu4ykYePrpp3XjjTequbl5zK4zqLu7W2vXrtX//u//uqx/+OGH9fjjj6usrExxcXG69NJLtX79+iMetqm6ulpRUVGSpJKSEmVlZemLL77QvHnzhva5+eablZWVpZtuuklZWVlHdL3JhPcLAAAAYGrzeahx2WWXDb3c1tTUaN68eXrzzTeHJvcrKytzKTvp6OjQj3/8Y1VUVCg4OFizZs3Sc889p8suu2xon1deeWXopUWSLr/8cknSXXfdpbvvvlsBAQF6++23h15w0tLStGLFCt15551eumsAwHRjMSxKj0xXemS6lmUtc9nW09+jPU179oUd9fkqaDT/bO+wq6qtSlVtVXqv5D2X46wWq2aEz9As2yzNipvlUumRGJbIxNEYkacTUyf/AADeD0lEQVRAY9B4BhsrVqxQb2+vnnnmGWVlZam2tlabNm1SQ0PDmF/Lm/76178qIiLCJZh54YUXdOutt+qpp57SiSeeqIKCAq1atUqGYeihhx46ouslJibK6XSqv79/2H3i4uK0fPlyPf744/rNb35zRNebTHi/AAAAAKY2w+l0On3diMmotbVVkZGRamlp8dlE4Xa7XTabjbHapimeAfAMTA9NXU37JirfL+woaChQZ1/nsMeFBYR5HM4qLzZPEYFMQDsVdHd3q7i4WGlpaQoLC5MkdfYO/0zs79dv/Fq/fO2XB93vznPv1K3fv/Wg+4UEhIwqRGtublZ0dLTee+89nXbaaSPud/PNN+vvf/+7enp6tGDBAm3YsEFz586VJO3Zs0dr1qzRJ598oo6ODh111FFav369li0zA8OlS5fq/fffdznnu+++q9NPP91l3eAPpA+s6jjY9T0577zzdNRRR7mEB6tXr9auXbu0adOmoXU///nPtXXrVm3evHnYc2VkZOjaa6/Vt99+q1deeUVRUVG6/fbb9R//8R9D++w//FRAQIDL8aeddpree+89SdKf/vQn3XHHHSovLx/2egfT3d2tvXv3KjMz063CxNefiacS+vLw8ZnIe+hr76GvvYv+9h762nvoa++hr8fOaD8T+7xSAwAADC86OFoLUxZqYcpCl/VOp1PlLeXatmeb7A67ChsKhwKPvU171d7brs+rP9fn1Z+7nTMxLNEt7JgZO1OZ0ZkK8Atw2x+TQ2dvp8JWh43pOX/52i9HFX60P9qu0MDQg+4XFhamsLAwvfzyy1q8eLHHSZIlaeXKlQoODtYbb7yhyMhI/fd//7fOOOMMFRQUKCYmRu3t7TrnnHN0//33KzAwUH/60590/vnnKz8/X+np6XrppZc0d+5cXX/99bruuuskSTExMXr44Ye1bt26oaGDBsOgQ72+J5s3b9a//uu/uqw78cQT9dxzz2nbtm1auHChiouL9frrr7vt58lvfvMb3X777brnnnv01ltv6Wc/+5ny8vJ05plnuu27detWLVq0SG+//baOPvpol5Bj4cKFqqioUElJiTIyMg56XQAAAACY6Ag1AACYhAzDUGpEqgJSAtx+G6R3oFfFTcX7qjsaClTQaP65tqNWNe01qmmv0QelH7ic08/wU2Z0pltlx8zYmUoOT2Y4Kxwxq9Wqp59+Wtddd52eeOIJHXfccTrttNN0+eWXD807sHnzZm3btk12u30o9Piv//ovvfzyy/rrX/+q66+/XnPnznWpmrjvvvv0t7/9Ta+88opWr16tmJgY+fn5KTw8XImJiUP7RUZGyjAMl3UHGs31D9Tc3KyWlhYlJye7rL/iiitUX1+vk08+eWioqB/96Ee6/fbbD9pXJ510km691aySycvL00cffaQNGzZ4DDXi4+MlSbGxsW73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Zg0EAAAAMLWlpaVp06ZNbuvffvttpaWl+aBFAAAAACaqw67UuPDCC3XJJZfoRz/6kZqbm7Vo0SL5+/urvr5eDz30kG644YaxbCcAAACAKernP/+5fvrTn2rHjh068cQTJUkfffSRnn76af32t7/1cesAAAAATCSHXanx+eef65RTTpEk/fWvf1VCQoJKS0v1pz/9SY888siYNRAAAADA1HbDDTfoz3/+s77++mvdeOONuvHGG7Vz5069+OKL+uEPf+jr5gEAAACYQA67UqOzs1Ph4eGSpH/+85+65JJLZLFYtHjxYpWWlo5ZAwEAAABMfRdffLEuvvhiXzcDAAAAwAR32JUaOTk5evnll1VeXq633npLZ511liTJbrcrIiJizBoIAAAAAAAAAAAgHUGlxrp163TFFVfopptu0ve+9z0tWbJEklm1MX/+/DFrIAAAAICpJyYmRgUFBYqLi1N0dLQMwxh238bGRi+2DAAAAMBEdtihxqWXXqqTTz5Z1dXVmjt37tD6M844g7JxAAAAACPasGHD0HC2GzZsGDHUAAAAAIBBhx1qSFJiYqISExNVUVEhSUpNTdXChQvHpGEAAAAApq6rr7566M+rVq3yXUMAAAAATCqHPaeGw+HQvffeq8jISM2YMUMzZsxQVFSU7rvvPjkcjrFsIwAAAIApzM/PT3a73W19Q0OD/Pz8fNAiAAAAABPVYVdq3HHHHXryySf161//WieddJIkafPmzbr77rvV3d2t+++/f8waCQAAAGDqcjqdHtf39PQoICDAy60BAAAAMJEddqjxzDPP6A9/+IMuuOCCoXXHHnusUlJS9OMf/5hQAwAAAMCIHnnkEUmSYRj6wx/+oLCwsKFtAwMD+uCDDzRr1ixfNQ8AAADABHTYoUZjY6PHF4xZs2apsbHxiBoFAAAAYOrbsGGDJLNS44knnnAZaiogIEAZGRl64oknfNU8AAAAABPQYYcac+fO1aOPPjr021WDHn30UR177LFH3DAAAAAAU9vevXslSaeffrpeeuklRUdH+7hFAAAAACa6ww41HnzwQZ177rl6++23tWTJEknSli1bVF5ertdff33MGggAAABganv33Xd93QQAAAAAk8RhhxqnnXaaCgoK9Nhjj2n37t2SpEsuuUTXX3+9fvnLX+qUU04Zs0YCAAAAmNoqKir0yiuvqKysTL29vS7bHnroIR+1CgAAAMBEc9ihhiQlJye7TQj+5Zdf6sknn9T//M//HFHDAAAAAEwPmzZt0gUXXKCsrCzt3r1bxxxzjEpKSuR0OnXcccf5unkAAAAAJhCLrxsgSY899pgyMjIUFBSkRYsWadu2bcPu+9JLL2nBggWKiopSaGio5s2bp2effdZlH6fTqXXr1ikpKUnBwcFatmyZCgsLXfbJyMiQYRguy69//etxuT8AAAAAw7vtttt088036+uvv1ZQUJD+7//+T+Xl5TrttNO0cuXKQz4f7xcAAADA1OXzUOPFF1/UmjVrdNddd+nzzz/X3LlztXz5ctntdo/7x8TE6I477tCWLVv01Vdf6ZprrtE111yjt956a2ifBx98UI888oieeOIJbd26VaGhoVq+fLm6u7tdznXvvfequrp6aPnJT34yrvcKAAAAwN2uXbt01VVXSZKsVqu6uroUFhame++9Vw888MAhnYv3CwAAAGBqO6Lhp8bCQw89pOuuu07XXHONJOmJJ57Qa6+9pqeeekq33nqr2/5Lly51+fvPfvYzPfPMM9q8ebOWL18up9Ophx9+WHfeeacuvPBCSdKf/vQnJSQk6OWXX9bll18+dGx4eLgSExNH1c6enh719PQM/b21tVWS5HA45HA4Dumex4LD4ZDT6fTJtTEx8AyAZwA8A+AZmN4mwr//WF07NDR0aB6NpKQk7dmzR0cffbQkqb6+/pDOxfvF9DMRvhemC/rae+hr76K/vYe+9h762nvo67Ez2j485FDjkksuGXF7c3PzqM/V29ur7du367bbbhtaZ7FYtGzZMm3ZsuWgxzudTr3zzjvKz88f+g2uvXv3qqamRsuWLRvaLzIyUosWLdKWLVtcXjp+/etf67777lN6erquuOIK3XTTTbJaPXfJ+vXrdc8997itr6urc/sNLW9wOBxqaWmR0+mUxeLzghv4AM8AeAbAMwCegeltIvz7t7W1jcl5Fi9erM2bN+uoo47SOeeco5///Of6+uuv9dJLL2nx4sWjPg/vF9PTRPhemC7oa++hr72L/vYe+tp76Gvvoa/HzmjfLw451IiMjDzo9sHS8YOpr6/XwMCAEhISXNYnJCRo9+7dwx7X0tKilJQU9fT0yM/PT7///e915plnSpJqamqGznHgOQe3SdJPf/pTHXfccYqJidHHH3+s2267TdXV1XrooYc8XvO2227TmjVrhv7e2tqqtLQ0xcfHKyIiYlT3O5YcDocMw1B8fDzfLNMUzwB4BsAzAJ6B6W0i/PsHBQWNyXkeeughtbe3S5Luuecetbe368UXX1Rubu6wn8894f1iepoI3wvTBX3tPfS1d9Hf3kNfew997T309dgZ7fvFIYcaf/zjHw+5MWMtPDxcO3bsUHt7uzZt2qQ1a9YoKyvLrXR8JPu/QBx77LEKCAjQD3/4Q61fv16BgYFu+wcGBnpcb7FYfPawGobh0+vD93gGwDMAngHwDExvvv73H6vrZmVlDf05NDRUTzzxxJicd7R4v5j8fP29MJ3Q195DX3sX/e099LX30NfeQ1+PjdH2n0/n1IiLi5Ofn59qa2td1tfW1o44Fq3FYlFOTo4kad68edq1a5fWr1+vpUuXDh1XW1urpKQkl3POmzdv2HMuWrRI/f39Kikp0cyZM4/grgAAAAD4Au8XAAAAwNTn0+goICBAxx9/vDZt2jS0zuFwaNOmTVqyZMmoz+NwOIYm2cvMzFRiYqLLOVtbW7V169YRz7ljxw5ZLBbZbLbDuBMAAAAAh8tiscjPz2/YZbR4vwAAAACmPp9WakhmmfbVV1+tBQsWaOHChXr44YfV0dGha665RpJ01VVXKSUlRevXr5dkTqi3YMECZWdnq6enR6+//rqeffZZPf7445LMUp8bb7xRv/zlL5Wbm6vMzEytXbtWycnJuuiiiyRJW7Zs0datW3X66acrPDxcW7Zs0U033aR/+Zd/UXR0tE/6AQAAAJiu/va3v7n8va+vT1988YWeeeYZj5Npj4T3CwAAAGBq83mocdlll6murk7r1q1TTU2N5s2bpzfffHNoIr6ysjKXsbQ6Ojr04x//WBUVFQoODtasWbP03HPP6bLLLhva5xe/+IU6Ojp0/fXXq7m5WSeffLLefPPNoYlGAgMD9ec//1l33323enp6lJmZqZtuusllHFwAAAAA3nHhhRe6rbv00kt19NFH68UXX9S111476nPxfgEAAABMbYbT6XT6uhGTUWtrqyIjI9XS0qKIiAivX9/hcMhut8tmszEBzTTFMwCeAfAMgGdgepsI//7j/Zm4uLhYxx57rNrb28f83BONr98vJrOJ8L0wXdDX3kNfexf97T30tffQ195DX4+d0X4mppcBAAAATDhdXV165JFHlJKS4uumAAAAAJhAfD78FAAAAIDpLTo6WoZhDP3d6XSqra1NISEheu6553zYMgAAAAATDaEGAAAAAJ/asGGDS6hhsVgUHx+vRYsWMdE2AAAAABeEGgAAAAB8atWqVb5uAgAAAIBJglADAAAAgNd99dVXo9732GOPHceWAAAAAJhMCDUAAAAAeN28efNkGIacTueI+xmGoYGBAS+1CgAAAMBER6gBAAAAwOv27t3r6yYAAAAAmIQINQAAAAB43YwZM3zdBAAAAACTEKEGAAAAgAnh22+/VVlZmXp7e13WX3DBBT5qEQAAAICJhlADAAAAgE8VFxfr4osv1tdff+0yz4ZhGJLEnBoAAAAAhlh83QAAAAAA09vPfvYzZWZmym63KyQkRN98840++OADLViwQO+9956vmwcAAABgAqFSAwAAAIBPbdmyRe+8847i4uJksVhksVh08skna/369frpT3+qL774wtdNBAAAADBBUKkBAAAAwKcGBgYUHh4uSYqLi1NVVZUkczLx/Px8XzYNAAAAwARDpQYAAAAAnzrmmGP05ZdfKjMzU4sWLdKDDz6ogIAA/c///I+ysrJ83TwAAAAAEwihBgAAAACfuvPOO9XR0SFJuvfee3XeeefplFNOUWxsrF588UUftw4AAADARMLwUwAAAAB8avny5brkkkskSTk5Odq9e7fq6+tlt9v1ve99z8etw/5WrVolwzBkGIb8/f2VmZmpX/ziF+ru7h7ap7GxUVdeeaUiIiIUFRWla6+9Vu3t7T5sNQAAAKYSQg0AAAAAPvXcc88NVWoMiomJkWEYPmoRRnL22WerurpaxcXF2rBhg/77v/9bd91119D2K6+8Ut988402btyoV199VR988IGuv/56H7YYAAAAUwmhBgAAAACfuummm5SQkKArrrhCr7/+ugYGBnzdJIwgMDBQiYmJSktL00UXXaRly5Zp48aNkqRdu3bpzTff1B/+8ActWrRIJ598sn73u9/pz3/+89AE8AAAAMCRINQAAAAA4FPV1dX685//LMMw9IMf/EBJSUn6j//4D3388ce+bhoOYufOnfr4448VEBAgSdqyZYuioqK0YMGCoX2WLVsmi8WirVu3+qqZAAAAmEKYKBwAAACAT1mtVp133nk677zz1NnZqb/97W964YUXdPrppys1NVV79uzxdROxn1dffVVhYWHq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ba3L+traWiUmJg57nMViUU5OjiRp3rx52rVrl9avX6+lS5cOHVdbW6ukpCSXc86bN0+SlJiYKLvd7nLO/v5+NTY2jnhdAADgHSEh0qxZ5uJJT49UXj586FFRIfX2SkVF5uKJn585fNZwoUdqqhmMAJg8eL8AAAAApj6fhhoBAQE6/vjjtWnTJl100UWSzHKdTZs2afXq1aM+j8PhGJpkLzMzU4mJidq0adPQS0Zra6u2bt2qG264QZK0ZMkSNTc3a/v27Tr++OMlSe+8844cDocWLVo0djcIAADGRWCglJNjLp709UmVlcOHHuXl5j4lJeby/vvu5zAMKSVl+NAjPV2aYCPvANMe7xcAAADA1OfzQRfWrFmjq6++WgsWLNDChQv18MMPq6OjQ9dcc40k6aqrrlJKSorWr18vyZxQb8GCBcrOzlZPT49ef/11Pfvss3r88cclmaU+N954o375y18qNzdXmZmZWrt2rZKTk4debI466iidffbZuu666/TEE0+or69Pq1ev1uWXX67k5GSf9AMAABg7/v5m8JCRIZ12mvv2gQFzCKvhQo/SUrMapKLCXD76yPN1EhOHDz1mzJBCQ8fn/gAMj/cLAAAA4NCtWrVKzzzzjCRzfrjU1FStXLlS995779BcF42NjfrJT36if/zjH7JYLFqxYoV++9vfKiwszKtt9Xmocdlll6murk7r1q1TTU2N5s2bpzfffHNoIr6ysjKXsbQ6Ojr04x//WBUVFQoODtasWbP03HPP6bLLLhva5xe/+IU6Ojp0/fXXq7m5WSeffLLefPNNl4lGnn/+ea1evVpnnHHG0D/AI4884r0bBwAAPuPnZw4vlZoqnXSS+3aHQ7LbRw49Ojqkmhpz2brV83Xi4kYOPSIjx+sOgemL9wsAAADg8Jx99tn64x//qL6+Pm3fvl1XX321DMPQAw88IEm68sorVV1drY0bN6qvr0/XXHONrr/+er3wwgtebafhdDqdXr3iFNHa2qrIyEi1tLQoIiLC69d3OByy2+2y2WxMQDNN8QyAZwA8A77jdEoNDcOHHiUlUmvrwc8TFTVy6BETYw6DNRyegeltIvz7+/oz8VRCXx6+ifC9MF3Q195DX3sX/e099LX30NfeM1X6etWqVWpubtbLL788tG7FihXau3evPv/8c+3atUuzZ8/Wp59+qgULFkiS3nzz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NMaERn1asmQJfv/99/puhlJWVhbWr19f7YQGERERPTtOnrwPuVxAfr4ciYlZNapLKhUjISELf/+djA4dyh7Jqk18t0NERERERPSMqWpigwmNqnN1dcXUqVPruxlKr7/+en03gYiIiBqIoUNboFOn2ktA6OrqoGVLy1qrr6aY1CAiIiIiInoGVTaxwYQGERER0bNFJtNFu3Y29d2MOtMwJvkiIiIiIiKiclVnOcSKFg9nQoNK4pKbRERE1BgwqUFERERERNSA6erqAgCys7OrdXxZiQ0mNKi0/Px8AIBYXLeLgBIRERHVBKefIiIiIiIiasDEYjHMzMyQlJQEADAwMKhWAmJIuyEoKCjAyoiViEqMgkxXhpC+IRjSbgjy8vJqu9laIwgCCgsLIZFImJipAblcjsePH8PAwICLjRMREVGDxncqREREREREDZydnR0AKBMb1eVn6YdhPsOw49oOBPkEwc/SD3FxcbXQwvojCALkcjl0dHSY1KghHR0dODs7M45ERETUoDGpQURERERE1MCJRCLY29vDxsYGBQUFNarrPbf3MLTnUFgbWT8TH17L5XI8efIElpaW0NHhDMs1IZVKGUMiIiJq8JjUICIiIiIiaiTEYnGtrHfgLHOuhdY0DHK5HLq6utDX1+cH8kRERERNAN/xERERERERERERERFRo8CkBhERERERERERERERNQpMahARERERERERERERUaPANTWqSRAEAEB6enq9nF8ulyMjI4PzxjZh7APEPkDsA8Q+0LQ1hOdf8V5Y8d6Yqq++7y8as4bwb6GpYKy1h7HWLsZbexhr7WGstYexrj2Vvb9gUqOaMjIyAABOTk713BIiIiIiovqVkZEBU1PT+m5Go8b7CyIiIiKiYhXdX4gEfq2qWuRyOR4+fAhjY2OIRCKtnz89PR1OTk64d+8eTExMtH5+qn/sA8Q+QOwDxD7QtDWE518QBGRkZMDBwYHfSquh+r6/aMwawr+FpoKx1h7GWrsYb+1hrLWHsdYexrr2VPb+giM1qklHRwfNmjWr72bAxMSE/1iaOPYBYh8g9gFiH2ja6vv55wiN2tFQ7i8as/r+t9CUMNbaw1hrF+OtPYy19jDW2sNY147K3F/w61RERERERERERERERNQoMKlBRERERERERERERESNApMajZSenh7mz58PPT29+m4K1RP2AWIfIPYBYh9o2vj8ExXjvwXtYay1h7HWLsZbexhr7WGstYex1j4uFE5ERERERERERERERI0CR2oQEREREREREREREVGjwKQGERERERERERERERE1CkxqEBERERERERERERFRo8CkBhERERERET0zevfujZCQkPpuRpPAWGuXq6srVq5cWd/NaBIYa+3h64j2MNbaw1jXPSY1GrDVq1fD1dUV+vr68PPzw7lz58otv2PHDrRo0QL6+vrw8fHB/v37tdRSqitV6QNr1qxBjx49YG5uDnNzc/j7+1fYZ6jhq+rrgMLWrVshEokwePDgum0g1bmq9oHU1FRMnjwZ9vb20NPTQ/Pmzfn/QSNW1ed/5cqV8Pb2hkwmg5OTE95//33k5uZqqbVU2/7v//4PgYGBcHBwgEgkwq5duyo8JjIyEh07doSenh48PT2xYcOGOm8nUU08ePAAb7/9NiwtLSGTyeDj44MLFy4o9wuCgHnz5sHe3h4ymQz+/v6Ijo6u0TkXLFgAkUik/DE1NUWPHj1w4sSJml5Og1ZRrEePHq0SF5FIhAEDBtTonE011q6urmqxFIlEmDx5srJMbm4uJk+eDEtLSxgZGWHIkCF49OhRjc5b+jm0tLTEgAEDcPXq1ZpeUoNVmVj37t1bbf/EiRNrdN6mGOuioiKEhobCzc0NMpkMHh4e+OyzzyAIgrIMX7NrR2Vizdfs2pGRkYGQkBC4uLhAJpOhW7duOH/+vEoZ9uuGiUmNBmrbtm2YPn065s+fj7/++gvt2rVDQEAAkpKSNJY/c+YMhg4dinHjxuHSpUsYPHgwBg8ejOvXr2u55VRbqtoHIiMjMXToUBw/fhxnz56Fk5MT+vfvjwcPHmi55VRbqtoHFOLi4jBjxgz06NFDSy2lulLVPpCfn49+/fohLi4OO3fuRFRUFNasWQNHR0ctt5xqQ1Wf/82bN2PWrFmYP38+bt68ibVr12Lbtm2YM2eOlltOtSUrKwvt2rXD6tWrK1U+NjYWAwcORJ8+fXD58mWEhIRg/PjxOHToUB23lKh6UlJS0L17d+jq6uLAgQO4ceMGli1bBnNzc2WZxYsX43//+x++++47/PnnnzA0NERAQECNE7atW7dGQkICEhIScPbsWXh5eeHll19GWlpaTS+rQapMrAFgwIAByrgkJCRgy5YtNT53U4s1AJw/f14ljkeOHAEABAUFKcu8//77+P3337Fjxw6cOHECDx8+xGuvvVbjc5d8DiMiIiCRSPDyyy/XuN6GqjKxBoDg4GCVcosXL67xuZtarBctWoSwsDCsWrUKN2/exKJFi7B48WJ88803yjJ8za4dlYk1wNfs2jB+/HgcOXIEP/30E65du4b+/fvD399f5bM09usGSqAGqUuXLsLkyZOVj4uKigQHBwfhyy+/1Fj+jTfeEAYOHKiyzc/PT3jnnXfqtJ1Ud6raB0orLCwUjI2NhY0bN9ZVE6mOVacPFBYWCt26dRN+/PFHYdSoUcKgQYO00FKqK1XtA2FhYYK7u7uQn5+vrSZSHarq8z958mThhRdeUNk2ffp0oXv37nXaTtIOAMJvv/1WbpmPPvpIaN26tcq2N998UwgICKjDlhFV38yZM4Xnn3++zP1yuVyws7MTlixZotyWmpoq6OnpCVu2bCnzuF69egnTpk1TPt67d69gYmIi/Pzzz4IgCML8+fOFdu3aqRxz7949AYBw7ty56l1MA1dRrAVBqNZ7R8a6cqZNmyZ4eHgIcrlcEITifqyrqyvs2LFDWebmzZsCAOHs2bNl1uPi4iKsWLFC+XjNmjWCqampcPToUUEQND+HJ0+eFAAISUlJtXdBDVjpWAuCej+tDMZa3cCBA4WxY8eqbHvttdeE4cOHC4LA1+zaVFGsBYGv2bUhOztbEIvFwt69e1W2d+zYUZg7d64gCOzXDRlHajRA+fn5uHjxIvz9/ZXbdHR04O/vj7Nnz2o85uzZsyrlASAgIKDM8tSwVacPlJadnY2CggJYWFjUVTOpDlW3D3z66aewsbHBuHHjtNFMqkPV6QN79uxB165dMXnyZNja2qJNmzZYuHAhioqKtNVsqiXVef67deuGixcvKqeounPnDvbv34+XXnpJK22m+sf3g9TY7NmzB76+vggKCoKNjQ06dOiANWvWKPfHxsYiMTFRpV+bmprCz8+v0v168+bNGDp0KMLDwzF8+HCNZfLy8rB+/XqYmZnB29u7ZhfVQFUUa4XIyEjY2NjA29sb7777Lp48eVLpczDWmuXn5+Pnn3/G2LFjIRKJAAAXL15EQUGBSt9u0aIFnJ2dK923Fy9ejFmzZuHw4cPo27evxjKZmZn4+eef4enpCUtLy5pfTAOnKdYK4eHhsLKyQps2bTB79mxkZ2dXul7Guli3bt0QERGBW7duAQCuXLmCU6dO4cUXXwTA1+zaVFGsFfiaXTOFhYUoKiqCvr6+ynaZTIZTp04BYL9uyCT13QBSl5ycjKKiItja2qpst7W1xT///KPxmMTERI3lExMT66ydVHeq0wdKmzlzJhwcHNQ+3KDGoTp94NSpU1i7di0uX76shRZSXatOH7hz5w6OHTuG4cOHY//+/bh9+zYmTZqEgoICzJ8/XxvNplpSned/2LBhSE5OxvPPPw9BEFBYWIiJEydy+qkmpKz3g+np6cjJyYFMJqunlhFpdufOHYSFhWH69OmYM2cOzp8/j/feew9SqRSjRo1S3stU9z5n9erVmDt3Ln7//Xf06tVLZd+1a9dgZGQEoPjLQMbGxti2bRtMTExq6eoalopiDRRPY/Laa6/Bzc0NMTExmDNnDl588UWcPXsWYrG43PoZ67Lt2rULqampGD16tHJbYmIipFIpzMzMVMpWtm/PnDkTP/30E06cOIHWrVur7Nu7d68y3llZWbC3t8fevXuho/Psf6dVU6yB4vdILi4ucHBwwNWrVzFz5kxERUXh119/rbBOxvo/s2bNQnp6Olq0aAGxWIyioiJ88cUXyg9p+ZpdeyqKNcDX7NpgbGyMrl274rPPPkPLli1ha2uLLVu24OzZs/D09ATAft2QMalB9Az66quvsHXrVkRGRqplnOnZlJGRgREjRmDNmjWwsrKq7+ZQPZHL5bCxscEPP/wAsViMTp064cGDB1iyZAmTGk1AZGQkFi5ciG+//RZ+fn64ffs2pk2bhs8++wyhoaH13TwiIjVyuRy+vr5YuHAhAKBDhw64fv06vvvuO+UH7dW1c+dOJCUl4fTp0+jcubPafm9vb+zZswdA8fuobdu2ISgoCMePH4evr2+Nzt0QVSbWb731lrK8j48P2rZtCw8PD0RGRpb57XSAsa7I2rVr8eKLL8LBwaFW6lu2bBmysrJw4cIFuLu7q+3v06cPwsLCABSvpfLtt9/ixRdfxLlz5+Di4lIrbWioyor1hAkTlH/7+PjA3t4effv2RUxMDDw8PMqsj7FWtX37doSHh2Pz5s1o3bq1cv0uBwcHvmbXssrEmq/ZteOnn37C2LFj4ejoCLFYjI4dO2Lo0KG4ePFijetmrOvWs5k+buSsrKwgFovx6NEjle2PHj2CnZ2dxmPs7OyqVJ4atur0AYWlS5fiq6++wuHDh9G2bdu6bCbVoar2gZiYGMTFxSEwMBASiQQSiQSbNm3Cnj17IJFIEBMTo62mUy2pzuuAvb09mjdvrvLNnJYtWyIxMRH5+fl12l6qXdV5/kNDQzFixAiMHz8ePj4+ePXVV7Fw4UJ8+eWXkMvl2mg21bOy3g+amJhwlAY1SPb29mjVqpXKtpYtWyI+Ph4AlK931XlP3KFDB1hbW2PdunUQBEFtv1QqhaenJzw9PdGhQwd89dVXcHR0xMqVK2twRQ1XRbHWxN3dHVZWVrh9+3a5dTPWZbt79y6OHj2K8ePHq2y3s7NDfn4+UlNTVbZXpm/36NEDRUVF2L59u8b9hoaGynh37twZP/74I7KysjRON/YsKSvWmvj5+QFAhX2bsVb14YcfYtasWXjrrbfg4+ODESNG4P3338eXX34JgK/ZtamiWGvC1+zq8fDwwIkTJ5CZmYl79+7h3LlzKCgoUCYy2a8bLiY1GiCpVIpOnTohIiJCuU0ulyMiIgJdu3bVeEzXrl1VygPAkSNHyixPDVt1+gBQPNfnZ599hoMHDzKr28hVtQ+0aNEC165dw+XLl5U/r7zyCvr06YPLly/DyclJm82nWlCd14Hu3bvj9u3bKh9g37p1C/b29pBKpXXeZqo91Xn+s7Oz1aY7UCS4NL2JpmcP3w9SY9O9e3dERUWpbLt165byG85ubm6ws7NT6dfp6en4888/K+zXHh4eOH78OHbv3o2pU6dWqj1isRg5OTlVvIrGoaJYa3L//n08efIE9vb25dbNWJdt/fr1sLGxwcCBA1W2d+rUCbq6uip9OyoqCvHx8RX27S5duuDAgQNYuHAhli5dWmEbRCIRdHR0nvl4lxVrTRTT9VbUtxlrVWW911Tce/A1u/ZUFGtN+JpdM4aGhrC3t0dKSgoOHTqEQYMGAWC/bsg4/VQDNX36dIwaNQq+vr7o0qULVq5ciaysLIwZMwYAMHLkSDg6OiqztNOmTUOvXr2wbNkyDBw4EFu3bsWFCxfwww8/1OdlUA1UtQ8sWrQI8+bNw+bNm+Hq6qqc28/IyEg5Rx81LlXpA/r6+mjTpo3K8Yo5ektvp8ajqq8D7777LlatWoVp06Zh6tSpiI6OxsKFC/Hee+/V52VQNVX1+Q8MDMTy5cvRoUMH5fRToaGhCAwMrHBeXWqYMjMzVb5tFxsbi8uXL8PCwgLOzs6YPXs2Hjx4gE2bNgEAJk6ciFWrVuGjjz7C2LFjcezYMWzfvh379u2rr0sgKtf777+Pbt26YeHChXjjjTdw7tw5/PDDD8p7GJFIhJCQEHz++efw8vKCm5sbQkND4eDggMGDB1dYf/PmzXH8+HH07t0bEolE5ZuPhYWFyvfLiikfbty4gZkzZ9bFpda7imKdmZmJTz75BEOGDIGdnR1iYmLw0UcfwdPTEwEBARXWz1irk8vlWL9+PUaNGgWJRPWjF1NTU4wbNw7Tp0+HhYUFTExMMHXqVHTt2hXPPfdchXV369YN+/fvx4svvgiJRIKQkBDlvry8PGW8U1JSsGrVKmRmZiIwMLBWr68hKS/WMTEx2Lx5M1566SVYWlri6tWreP/999GzZ89KzWzAWP8nMDAQX3zxBZydndG6dWtcunQJy5cvx9ixYwHwNbs2VRRrvmbXnkOHDkEQBHh7e+P27dv48MMP0aJFC+U9F/t1AyZQg/XNN98Izs7OglQqFbp06SL88ccfyn29evUSRo0apVJ++/btQvPmzQWpVCq0bt1a2Ldvn5ZbTLWtKn3AxcVFAKD2M3/+fO03nGpNVV8HSho1apQwaNCgum8k1amq9oEzZ84Ifn5+gp6enuDu7i588cUXQmFhoZZbTbWlKs9/QUGBsGDBAsHDw0PQ19cXnJychEmTJgkpKSnabzjViuPHj2v8v13xvI8aNUro1auX2jHt27cXpFKp4O7uLqxfv17r7Saqit9//11o06aNoKenJ7Ro0UL44YcfVPbL5XIhNDRUsLW1FfT09IS+ffsKUVFR5dbZq1cvYdq0acrHN27cEGxsbITp06cLgiAI8+fPV/k3ZWBgIPj4+AhhYWG1fn0NSXmxzs7OFvr37y9YW1sLurq6gouLixAcHCwkJiaWWydjXbZDhw4JAMrsrzk5OcKkSZMEc3NzwcDAQHj11VeFhISEcut0cXERVqxYoXx84sQJwdDQUPjf//4nCELx/wsl421sbCx07txZ2LlzZ61dV0NUXqzj4+OFnj17ChYWFoKenp7g6ekpfPjhh0JaWlq5dTLW6tLT04Vp06YJzs7Ogr6+vuDu7i7MnTtXyMvLU5bha3btqCjWfM2uPdu2bRPc3d0FqVQq2NnZCZMnTxZSU1NVyrBfN0wiQeB8BERERERERERERERE1PBxTQ0iIiIiIiIiIiIiImoUmNQgIiIiIiIiIiIiIqJGgUkNIiIiIiIiIiIiIiJqFJjUICIiIiIiIiIiIiKiRoFJDSIiIiIiIiIiIiIiahSY1CAiIiIiIiIiIiIiokaBSQ0iIiIiIiIiIiIiImoUmNQgIiIiIiIiIiIiIqJGgUkNIiIiAL1790ZISEh9N4OIiIiI6JnG992VN2LECCxcuLBOz3Hjxg00a9YMWVlZdXoeIqLaxKQGERFpzejRoyESiSASiaCrqws3Nzd89NFHyM3Nre+mERERERE1eSXfr0ulUnh6euLTTz9FYWFhvbUpLi4OIpEIYrEYDx48UNmXkJAAiUQCkUiEuLi4+mlgHbly5Qr279+P9957T7mtd+/eEIlE+Oqrr9TKDxw4ECKRCAsWLFArr/ixtbVFUFAQ7t69qyzTqlUrPPfcc1i+fHmdXg8RUW1iUoOIiLRqwIABSEhIwJ07d7BixQp8//33mD9/fn03i4iIiIiI8N/79ejoaHzwwQdYsGABlixZUt/NgqOjIzZt2qSybePGjXB0dKynFlUsPz+/2sd+8803CAoKgpGRkcp2JycnbNiwQWXbgwcPEBERAXt7e7V6goODkZCQgIcPH2L37t24d+8e3n77bZUyY8aMQVhYWL0mr4iIqoJJDSIi0io9PT3Y2dnByckJgwcPhr+/P44cOQIAyMvLw3vvvQcbGxvo6+vj+eefx/nz55XHbtiwAWZmZir17dq1CyKRSPl4wYIFaN++PX766Se4urrC1NQUb731FjIyMpRlsrKyMHLkSBgZGcHe3h7Lli2r24smIiIiImokFO/XXVxc8O6778Lf3x979uwBUPx+fcaMGXB0dIShoSH8/PwQGRmpPPbJkycYOnQoHB0dYWBgAB8fH2zZsqXc8+3btw+mpqYIDw8vt9yoUaOwfv16lW3r16/HqFGj1Mpev34dL774IoyMjGBra4sRI0YgOTlZub93796YOnUqQkJCYG5uDltbW6xZswZZWVkYM2YMjI2N4enpiQMHDqjUe+LECXTp0gV6enqwt7fHrFmzVBIBvXv3xpQpUxASEgIrKysEBARg7NixePnll1XqKSgogI2NDdauXavxWouKirBz504EBgaq7Xv55ZeRnJyM06dPK7dt3LgR/fv3h42NjVp5AwMD2NnZwd7eHs899xymTJmCv/76S6VMv3798PTpU5w4cUJje4iIGhomNYiIqN5cv34dZ86cgVQqBQB89NFH+OWXX7Bx40b89ddf8PT0REBAAJ4+fVqlemNiYrBr1y7s3bsXe/fuxYkTJ1SGaH/44Yc4ceIEdu/ejcOHDyMyMlLtjT0REREREQEymUw54mDKlCk4e/Ystm7diqtXryIoKAgDBgxAdHQ0ACA3NxedOnXCvn37cP36dUyYMAEjRozAuXPnNNa9efNmDB06FOHh4Rg+fHi57XjllVeQkpKCU6dOAQBOnTqFlJQUtQ/+U1NT8cILL6BDhw64cOECDh48iEePHuGNN95QKbdx40ZYWVnh3LlzmDp1Kt59910EBQWhW7du+Ouvv9C/f3+MGDEC2dnZAIpHQ7z00kvo3Lkzrly5grCwMKxduxaff/65Wr1SqRSnT5/Gd999h/Hjx+PgwYNISEhQltm7dy+ys7Px5ptvarzWq1evIi0tDb6+vmr7pFIphg8frpLg2bBhA8aOHVtu/ADg6dOn2L59O/z8/NTqbN++PU6ePFlhHUREDQGTGkREpFV79+6FkZER9PX14ePjg6SkJHz44YfIyspCWFgYlixZghdffBGtWrXCmjVrIJPJyvwGU1nkcjk2bNiANm3aoEePHhgxYgQiIiIAAJmZmVi7di2WLl2Kvn37wsfHBxs3buRQayIiIiKiEgRBwNGjR3Ho0CG88MILiI+Px/r167Fjxw706NEDHh4emDFjBp5//nnlB+yOjo6YMWMG2rdvD3d3d0ydOhUDBgzA9u3b1epfvXo1Jk2ahN9//11tJIMmurq6ePvtt7Fu3ToAwLp16/D2229DV1dXpdyqVavQoUMHLFy4EC1atECHDh2wbt06HD9+HLdu3VKWa9euHT7++GN4eXlh9uzZ0NfXh5WVFYKDg+Hl5YV58+bhyZMnuHr1KgDg22+/hZOTE1atWoUWLVpg8ODB+OSTT7Bs2TLI5XJlvV5eXli8eDG8vb3h7e2Nbt26wdvbGz/99JOyzPr16zVOLaVw9+5diMVijSMvAGDs2LHYvn07srKy8H//939IS0srM4bffvstjIyMYGhoCEtLS0RFRSljWJKDg4PKWhtERA2ZpL4bQERETUufPn0QFhaGrKwsrFixAhKJBEOGDMHVq1dRUFCA7t27K8vq6uqiS5cuuHnzZpXO4erqCmNjY+Vje3t7JCUlASgexZGfn6/y7SQLCwt4e3vX8MqIiIiIiBo/xZeQCgoKIJfLMWzYMCxYsACRkZEoKipC8+bNVcrn5eXB0tISQPG0SQsXLsT27dvx4MED5OfnIy8vDwYGBirH7Ny5E0lJSTh9+jQ6d+5c6baNHTsW3bp1w8KFC7Fjxw6cPXtW7ctJV65cwfHjxzUmDGJiYpTtb9u2rXK7WCyGpaUlfHx8lNtsbW0BQHkfcfPmTXTt2lVl6tvu3bsjMzMT9+/fh7OzMwCgU6dOaucdP348fvjhB3z00Ud49OgRDhw4gGPHjpV5nTk5OdDT01M5V0nt2rWDl5cXdu7ciePHj2PEiBGQSDR/xDd8+HDMnTsXAPDo0SMsXLgQ/fv3x8WLF1XumWQymXJUChFRQ8ekBhERaZWhoSE8PT0BFH+7ql27dli7dm2lbmZ0dHQgCILKtoKCArVypb+tJRKJVL49RUREREREmim+hCSVSuHg4KD8sDwzMxNisRgXL16EWCxWOUaRQFiyZAm+/vprrFy5Ej4+PjA0NERISIjagtkdOnTAX3/9hXXr1sHX17fMD+9L8/HxQYsWLTB06FC0bNkSbdq0weXLl1XKZGZmIjAwEIsWLVI7vuRC2pruGUpuU7SpqvcRhoaGattGjhyJWbNm4ezZszhz5gzc3NzQo0ePMuuwsrJCdnY28vPzlVP1ljZ27FisXr0aN27cKHN6LwAwNTVV3n95enpi7dq1sLe3x7Zt2zB+/HhluadPn8LDw6Oyl0lEVK84/RQREdUbHR0dzJkzBx9//DE8PDyUc88qFBQU4Pz582jVqhUAwNraGhkZGcjKylKWKX0TUxEPDw/o6urizz//VG5LSUlRGYpORERERNRUKb6E5OzsrPLt/w4dOqCoqAhJSUnw9PRU+bGzswMAnD59GoMGDcLbb7+Ndu3awd3dXeP7bA8PDxw/fhy7d+/G1KlTq9S+sWPHIjIyssw1JDp27Ii///4brq6uau3UlHCorJYtW+Ls2bMqX7I6ffo0jI2N0axZs3KPtbS0xODBg7F+/Xps2LABY8aMKbd8+/btAQA3btwos8ywYcNw7do1tGnTRnm/VBmKhFROTo7K9uvXr6NDhw6VroeIqD4xqUFERPUqKCgIYrEYYWFhePfdd/Hhhx/i4MGDuHHjBoKDg5GdnY1x48YBAPz8/GBgYIA5c+YgJiYGmzdvxoYNG6p0PiMjI4wbNw4ffvghjh07huvXr2P06NHQ0eF/iUREREREZWnevDmGDx+OkSNH4tdff0VsbCzOnTuHL7/8Evv27QNQvJ7EkSNHcObMGdy8eRPvvPMOHj16VGZ9x48fxy+//IKQkJBKtyM4OBiPHz9WGWVQ0uTJk/H06VMMHToU58+fR0xMDA4dOoQxY8agqKioytetMGnSJNy7dw9Tp07FP//8g927d2P+/PmYPn16pe4lxo8fj40bN+LmzZsYNWpUuWWtra3RsWNH5aLompibmyMhIUG5dmBZsrOzkZiYiMTERFy5cgXvvvsu9PX10b9/f2WZuLg4PHjwAP7+/hVeBxFRQ8BPcIiIqF5JJBJMmTIFixcvxhdffIEhQ4ZgxIgR6NixI27fvo1Dhw7B3NwcQPHaFz///DP2798PHx8fbNmyBQsWLKjyOZcsWYIePXogMDAQ/v7+eP755zXOfUtERERERP9Zv349Ro4ciQ8++ADe3t4YPHgwzp8/r1xP4uOPP0bHjh0REBCA3r17w87ODoMHDy6zPm9vbxw7dgxbtmzBBx98UKk2SCQSWFlZlbmGhIODA06fPo2ioiL0798fPj4+CAkJgZmZWY2+yOTo6Ij9+/fj3LlzaNeuHSZOnIhx48bh448/rtTx/v7+sLe3R0BAABwcHCosP378eISHh5dbxszMrMLRJ2vWrIG9vT3s7e3Rp08fJCcnY//+/SprCm7ZsgX9+/eHi4tLpa6FiKi+iYTSk5MTERERERERERFRrcnMzISjoyPWr1+P1157rcLyOTk58Pb2xrZt29C1a9c6a1d+fj68vLywefNmdO/evc7OQ0RUm7hQOBERERERERERUR2Qy+VITk7GsmXLYGZmhldeeaVSx8lkMmzatAnJycl12r74+HjMmTOHCQ0ialQ4UoOIiIiIiIiIiKgOxMXFwc3NDc2aNcOGDRvQt2/f+m4SEVGjx6QGERERERERERERERE1ClwonIiIiIiIiIiIiIiIGgUmNYiIiIiIiIiIiIiIqFFgUoOIiIiIiIiIiIiIiBoFJjWIiIiIiIiIiIiIiKhRYFKDiIiIiIiIiIiIiIgaBSY1iIiIiIiIiIiIiIioUWBSg4iIiIiIiIiIiIiIGgUmNYiIiIiIiIiIiIiIqFH4f44fDEq7f26MAAAAAElFTkSuQmCC", + "image/png": "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hYWhU6dOePXqFYYPHy6V0ybO7+qaISIiIvpQMalBREREH73o6GiND82FENK87rNnz4YQQnrQll+//PKLxu3Kh5P169dXWWA3J8qH3Onp6QXqB5C5WHSvXr2gUCiwadMm/PHHH4iMjES9evVQpkwZrepwcnLCggULAABhYWE5rs2QVdYHxDmNYFAmjXKbuiU3N27cwI0bN9S237p1C1euXIGBgQEaNmyoVV26xLpJkybSYsTDhg3L9Rvk06ZNQ0REBOzs7FQejgL/PfS8c+eO2nGJiYka13GIiYlBRkYGrK2tNSYHfvnll0IfyaBLrPbt24eRI0fCysoKf/75Z47T7wD/JbtKliypti85ORm///57ofbPyMgI9evXB6A6simrn3/+GUDm7/xtmzhxIoyNjXH9+nUsXbo0z/KnTp2S/rtx48YAgG3btmmcCmr37t148+YNrKyspJFG70J+/jYqf/9ubm4a/17mVNfb4O7uLi3enXXUmDLOhw4d0jj93NWrV3Ht2rV8/S0iIiIiIlVMahARERG9A5cvX5aSAErBwcH44YcfAABjxozRqh7lKIOQkBCkpaUVuD9Zp6BSPpTVNErj8ePH+OmnnzTOUf/HH38AAOzs7HIceZGViYkJOnbsCCDzQX725MPx48elB7XKaajySwiBr776SiXJEhMTg6+++gpCCHTr1g3u7u5a1aWMdW5z9+fml19+ga2tLc6fP4/27durLX6elJSECRMmYNGiRTAyMsKOHTtU1k0AgObNmwMAfvjhB5X59xMSEjB48GCNC6oXK1YMdnZ2iI6Olqb7Ujp37hwmT55coPPJTUFjdeHCBfTp0wcGBgbYuXOnxkXes1Iulrxx40aV0SvJyckYOnRojt/61+V9M27cOADAqlWr1KZa27BhA/bt2wdjY2OMGjUqX/UWRLly5aS1aMaOHYspU6ZoHMVz//599OnTByNHjpS29ejRAx4eHnj+/DnGjh2rkuB59OiRdJ4jRozQuOD325Kfv41lypSBoaEh/vnnH2lBbqU//vgD3333XaH37+rVq9i2bRuSkpLU9in/BmZNstWvXx+1atVCUlIShgwZgsTERGnf69evMWTIEACZC7Zr+7eIiIiIiFRxoXAiIiKid2DkyJGYPHkyNm3ahEqVKuH58+c4deoUFAoFRo0ahbZt22pVj4eHB2rUqIFLly6hYsWKqFGjBszMzODo6Ihvv/1W6/7Url0b5cqVw507d/DgwQNYWFigV69eauXevHmDQYMGYejQoahSpYo0giIkJARXr16FTCbDwoUL1dbhyMl3332Hy5cv499//0W1atVQu3ZtFC9eHP/++y8uXboEAGjatCnGjx+v9blk1bFjR9y8eROlSpVCkyZNIJPJcPLkSURFRaF06dJYsWKF1nV169YNQUFB+Oyzz9CyZUtpQe2vv/5aq0Wavb29ERwcjE6dOuHYsWMoVaoUateuDXd3d0RHR+P06dOIjY2Fi4sLVq1ahWbNmqnV0bNnTyxduhSXLl1C+fLlUb9+fSgUCly6dAkmJib44osvpKSUkqGhIaZPn44xY8agX79++OGHH1CqVCmEhYXhzJkz+Oyzz/D3339rnLqqoDp37oyZM2fi+++/x82bN+Hu7g4DAwN07NhRSmRpMnnyZCQmJsLLywu//vqrNA1adspREgEBAVi2bBmuXr0KLy8vNGjQAIaGhjh16hSSkpIwatQoLFu2TO14Xd43bdq0wdSpUzFnzhy0aNEC9erVg4eHB+7evYsrV67A0NAQq1evRvny5bUPmA6GDx8OCwsLjBgxAvPmzcN3332HmjVronjx4khOTsbdu3elkT1Z1wAyNTXFzp070bp1a6xatQoHDhxA7dq1ERcXhxMnTiA5ORmtWrXCjBkz3sl5KOXnb6OjoyOGDx+OZcuWoVmzZmjQoAHc3Nxw7949XLlyRfo9FabHjx+jd+/ekMvlqFatGtzd3ZGeno5//vkH9+7dg4mJiVpS5tdff0XTpk2xd+9eeHl5oWHDhkhLS0NQUBBiY2NRrVq1fP0tIiIiIqJsBBERERHlqH///gKAmD17doGOb9SokQAggoKCxPHjx0WzZs2EjY2NkMvlokaNGmLDhg0aj5sxY4YAIGbMmKG27/Hjx6Jv377C1dVVGBkZCQCiZMmS+e7bggULBAABQPTv319jmdjYWLF06VLRpUsXUbp0aWFpaSksLCxEmTJlRL9+/cSlS5fy3W5sbKyYM2eO+OSTT4S1tbUwNDQU9vb2olGjRmLNmjUiPT0933WuX79eOo/w8HAxZMgQUaJECWFiYiLc3d3FyJEjRWRkpNpxjx49yjF+GRkZYt68eaJ8+fLCzMxMilVQUFC++paSkiJWr14tWrRoIYoVKyb9zgAIV1dXjf3K6s2bN2L48OGiRIkSwtjYWBQvXlwMHjxYvHr1KtfrZM+ePaJu3brC1tZWWFpaiho1aoiVK1cKhUIhSpYsKQCIR48eqRyT03Yl5fth/fr1avt2794t6tWrJ6ysrIRMJlPrl6a6le+PvH6yioiIEEOHDhXe3t7C1NRUuLm5ic8++0yEhISoXAfZ5fW+yS2WQghx8OBB0bZtW+Hg4CCMjIyEi4uL6NGjhzh//rzG8lnf+5rk1V5eIiIixJw5c0SDBg2Ek5OTMDIyEpaWlqJChQpi8ODB4q+//tJ4XFhYmBg2bJgoVaqUMDExEVZWVqJOnTpi1apVIi0tTa18bjHV5jxyumYK+rdRoVCIdevWierVqwtLS0thY2Mj6tevL7Zu3SqEEBqvmdy259XXFy9eiG+//Va0bdtWeHl5CXNzc2FtbS38/PzEsGHDxN27dzXWFRkZKSZPnizKlSsnzMzMhLm5uahatar49ttvRWJiolr5oKAgAUA0atQox/5pcw5EREREHwOZEIU8oS4REREREeXqyZMnqF+/PsLCwhAQEIB169ZJi10TfQwaN26Mv/76C0FBQdI6FERERERE2uCaGkRERERE75i7uzuOHz8OFxcXrF+/Xm2BcCIiIiIiItKMa2oQERERERUBHx8fHD9+HNu3bwcA3Lt3T6u1OoiIiIiIiD5mTGoQERERERURPz8/BAYGFnU3iIiIiIiI9AbX1CAiIiIiIiIiIiIiIr3ANTWIiIiIiIiIiIiIiEgvMKlBRERERERERERERER6gUkNIiIiIiIiIiIiIiLSC0xqEBERERERERERERGRXmBSg4iIiIiIiIiIiIiI9AKTGkREREREREREREREpBeY1CAiIiIiIiIiIiIiIr3ApAYREREREREREREREekFJjWIiIiIiIiIiIiIiEgvMKlBRERERERERERERER6gUkNIiIiIiIiIiIiIiLSC0xqEBERERERERERERGRXmBSg4iIiIiIiIiIiIiI9AKTGkREREREREREREREpBeY1CAiIiIiIiIiIiIiIr3ApAYREREREREREREREekFJjWIiIiIiIiIiIiIiEgvMKlBRERERERERERERER6gUkNIiIiIiIiIiIiIiLSC0xqEBERERERERERERGRXmBSg4iIiIiIiIiIiIiI9AKTGkREREREREREREREpBeY1CAi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hrIryiI5PTnHMmZGZrg3/B48bDzeYc+IiIioKCUmApaWutcjROYIDhsb7crHxwMWFgVvz8zMDFFRUQAyH8CHhIRg3759sLa2xsSJE9G2bVvcvn0bxsbGAIDExETMnz8fP/30ExwcHODq6oqkpCTExsZi/fr1AAB7e3s8f/5cpR2FQoESJUpgx44dcHBwwJkzZzB48GC4urqiZ8+eUrmgoCC4uroiKCgIDx48QK9evVClShUMGjRI6uPz588RFBQEY2NjjBw5EuHh4bme46lTp1CmTBlYWVmpbH/16hUGDRqEPXv2wNzcXOuYPXjwANu3b8e+ffvw5s0bDBkyBEOHDtWYYFm2bBnu37+PChUqYNasWQAAJycnAICJiQmqVKmCU6dOoVmzt/dlKo7UIKK3StPDFCXlQxWit4XXHxU1XoNUlHj9kbZeJ77ONaEBAMnpyXid+Pod9YiIiIgo/4QQOHbsGI4ePYomTZpIyYyffvoJDRo0QOXKlbFlyxY8e/YMe/bskY5LS0vDypUrUbduXZQtWxbW1taQy+XSCBAXFxeYmJiotWdsbIyZM2eiRo0a8PLywqeffoqAgABs375dpZydnR1WrFgBX19ftG/fHu3atcPx45lfMLp//z4OHjyIH3/8EbVr10b16tWxbt06JCUl5Xqujx8/VpteSggBf39/fPnll6hRo0a+YpecnIxNmzahSpUqaNCgAb7//nts3boVL1++VCtrY2MDExMTmJubS/ExNDSU9ru5ueHx48f5aj+/OFKDiN6a3B6mKJ24ewJ159bHlv473lGv9JdCocDryEgkpGXAwIA56bx8urEHzj46nWsZXn/5w2swf3gNFi5ef/mj7fXHERtERERElBNz88xRE3n5+2+gbdu8yx04ADRsqF27+bF//35YWloiLS0NCoUCvXv3RmBgIE6cOAEjIyPUqlVLKuvg4ICyZcvizp070jYTExNUqlQpf43+vx9++AE///wzwsLCkJSUhNTUVFSpUkWlTPny5VUe+ru6uuKff/4BANy5cwdGRkaoXr26tN/X1zfP9SuSkpJgZmamsm358uWIi4vD5MmTczzOMsvQm88++wyrV68GAHh4eKB48eIQ/z/3V506daBQKHDv3j24uLjk2pfs5HI5EhMT83VMfjGpQUSFKiElAU+inqDPj31w7ck1rY45++g0SgUW3uJF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+vfvjxo1aqBmzZpYunQpEhISEBAQAADo168fihcvjnnz5gHIXPuiRo0a8Pb2RkpKCg4cOIDNmzdj1apVADK/1TZ69GjMmTMHpUuXhpeXF6ZNmwY3Nzd07ty5qE6TiIiIiOiDwqQGERERERF9lHr16oWIiAhMnz4dL1++RJUqVXDo0CFpoe+wsDCVIfAJCQkYOnQonj59CrlcDl9fX/zyyy/o1auXVGbChAlISEjA4MGDER0djfr16+PQoUNazw9MRERERES5Y1KDiIiIiIg+WsOHD8fw4cM17jt58qTK6zlz5mDOnDm51ieTyTBr1izMmjWrsLpIRERERERZcE0NIiIiIiIiIiIiIiLSC0xqEBERERERERERERGRXmBSg4iIiIiIiIiIiIiI9AKTGkREREREREREREREpBeY1CAiIiIiIiIiIiIiIr3ApAYREREREREREREREekFJjWIiIiIiIiIiIiIiEgvMKlBRERERERERERERER6gUkNIiIiIiIiIiIiIiLSC0xqEBERERERERERERGRXmBSg4iIiIiIiIiIiIiI9AKTGkREREREREREREREpBeY1CAiIiIiIiIiIiIiIr3ApAYREREREREREREREekFJjWIiIiIiIiIiIiIiEgvMKlBRERERERERERERER6gUkNIiIiIiIiIiIiIiLSC0xqEBERERERERERERGRXmBSg4iIiIiIiIiIiIiI9AKTGkREREREREREREREpBeY1CAiIiIiIiIiIiIiIr3ApAYREREREREREREREekFJjWIiIiIiIiIiIiIiEgvMKlBRERERERERERERER6gUkNIiIiIiIiIiIiIiLSC0xqEBERERERERERERGRXmBSg4iIiIiIiIiIiIiI9AKTGkREREREREREREREpBeY1CAiIiIiIiIiIiIiIr3ApAYREREREREREREREekFJjWIiIiIiIiIiIiIiEgvMKlBRERERERERERERER6gUkNIiIiIiIiIiIiIiLSC0xqEBERERERERERERGRXmBSg4iIiIiIiIiIiIiI9AKTGkREREREREREREREpBeY1CAiIiIiIiIiIiIiIr3ApMb/8/f3R+fOnYu6G0RERERERERERERElIMiTWoEBgZCJpOp/Pj6+qqVO3v2LJo2bQoLCwtYW1ujYcOGSEpK0rne/NiwYYNKfZaWlqhe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Dg7G29ube++9l/fee4/AwEAA8vLybNppxoaIiIiIiIiIVMS10d7w54XbtW9f/WMRERGRK0OFQ43jx49z/PhxnnvuOZ5//vkyz5vNZgwGAyUlJVU6QBERERERERGpmYzGqm0nIiIiNV+FQ42VK1dW5zhERERERERERERERETOq8KhRo8ePapzHCIiIiIiIiIiIiIiIudVoYXC/75uRlW3FxEREREREZGrj7+nP+7O7udt4+7sjr+nVgoXERERiwqFGk2bNuWll17i6NGj52xjNptZunQpAwYM4K233qqyAYqIiIiIiIhIzRTmG0bCmAQ237+Zzfdvxj2nBQD3N3jDui9hTAJhvmEOHqmIiIhcLip0+6lVq1bx3//+l0mTJtG2bVuio6MJCQnB3d2d48ePs2PHDjZs2ICzszMTJkzggQceqO5xi4iIiIiIiEgNEOYbZg0tnEpqARDs3pQOwR0cOSwRERG5TFUo1IiIiOCbb74hKSmJr7/+mjVr1rB+/XpOnjyJv78/7du358MPP2TAgAEYjcbqHrOIiIiIiIiIiIiIiFyFKrxQOEBYWBiPPfYYjz32WHWNR0REREREREREREREpFwVWlNDRERERERERERERETE0RRqiIiIiIiIiIiIiIjIFUGhhoiIiIiIXFEOHTpEcnKy9fGmTZsYO3YsH3zwgQNHJSIiIiIil4JCDRERERERuaLcddddrFy5EoCUlBT69OnDpk2beOqpp5gyZYqDRyciIiIiItVJoYaIiIiIiFxR4uLi6Ny5MwDz5s2jVatWrF+/ns8//5w5c+Y4dnAiIiIiIlKtKh1qhIeHM2XKFJKSkqpjPCIiIiIiIud16tQp3NzcAFi2bBk333wzAJGRkRw9etSRQxMRERERkWpW6VBj7NixLFiwgMaNG9OnTx+++uorCgsLq2NsIiIiIiIiZURFRTFz5kzWrFnD0qVL6d+/PwBHjhzBz8/PwaMTEREREZHqdFGhxrZt29i0aRMtWrTg4YcfJjg4mDFjxrBly5bqGKOIiIiIiIjVyy+/zPvvv0/Pnj0ZNmwYbdu2BeD777+33pZKRERERERqpoteU6NDhw689dZbHDlyhGeffZaPPvqITp060a5dO2bNmoXZbK7KcYqIiIiIiADQs2dP0tPTSU9PZ9asWdb9999/PzNnznTgyEREREREpLo5X+wLT506xbfffsvs2bNZunQp11xzDaNGjSI5OZn//ve/LFu2jC+++KIqxyoiIiIiIsLJkycxm83UqVMHgIMHD/Ltt9/SokUL+vXr5+DRiYiIiIhIdap0qLFlyxZmz57Nl19+iZOTE8OHD+eNN94gMjLS2mbw4MF06tSpSgcqIiIiIiICMGjQIIYMGcKDDz7IiRMn6NKlCy4uLqSnp/P666/zr3/9y9FDFBERERGRalLp20916tSJPXv2MGPGDA4fPsy0adNsAg2ARo0aceedd1bZIEVEREREREpt2bKF2NhYAObPn0+9evU4ePAgn376KW+99ZaDRyciIiIiItWpUjM1SkpKmDVrFjfffLN1qnd5atWqxezZs+0enIiIiIiIyN/l5+fj7e0NwJIlSxgyZAhOTk5cc801HDx40MGjExERERGR6lSpmRpGo5EHHniAEydOVNNwREREREREzq9p06YsXLiQQ4cOsXjxYvr27QtAWloaPj4+Dh6diIiIiIhUp0rffqpVq1bs37+/OsbiUD179mTs2LGOHoaIiIiIiFzAM888w/jx4wkPD6dz58507doVsMzaaN++vYNHJyIiIiIi1anSocbzzz/P+PHj+fHHHzl69CjZ2dk2W3WbNGkSBoPBZvv7mh4AGzZs4Prrr6dWrVr4+PjQvXt3Tp48WWXH9fX1JTY2ltWrV9tzOiIiIiIiUkm33XYbSUlJ/PHHHyxevNi6v1evXrzxxhsOHJmIiIiIiFS3Sq2pAXDDDTcAcPPNN2MwGKz7zWYzBoOBkpKSqhvdOURFRbFs2TLrY2dn29PYsGED/fv3Z8KECbz99ts4Ozvz559/4uRU6QznnMfNzMxk2rRp3HTTTSQnJ+Pr62tX3yIiIiIiUnFBQUEEBQWRnJwMQIMGDejcubODRyUiIiIiItWt0qHGypUrq2McleLs7ExQUNA5n3/00Uf5z3/+w5NPPmndFxERUalj/PTTT9x1112899573H333WWOGxQUxJQpU5g9eza7d++mU6dOZfooLCyksLDQ+rh0JovJZMJkMlVqPFXBZDJhNpsdcuyaQjW0j+pnH9XPPqqf/VRD+6h+9lH97HM51K8qj20ymXj++ed57bXXyM3NBcDb25vHHnuMp556yu4PM4mIiIiIyOWr0qFGjx49qmMclbJnzx5CQkJwd3ena9euTJ06lbCwMMCyOOBvv/3G3XffTbdu3di3bx+RkZG88MILxMTEVKj/L774ggcffJAvvviCm266qdw2hYWFzJ49m9q1a58zMJk6dSqTJ08us//YsWMUFBRU8GyrjslkIisrC7PZrD/0LpJqaB/Vzz6qn31UP/uphvZR/eyj+tnncqhfTk5OlfX11FNP8fHHH/PSSy9x7bXXArB27VomTZpEQUEBL7zwQpUdS0RERERELi+VDjUATpw4wccff8zOnTsBy22Z7rvvvktyC6YuXbowZ84cIiIiOHr0KJMnTyY2Npa4uDi8vb2ti5hPmjSJadOm0a5dOz799FN69epFXFwczZo1O2//7777Lk899RQ//PBDmQBn+/bteHl5AZCfn4+3tzdz587Fx8en3L4mTJjAuHHjrI+zs7MJDQ0lICDgnK+pTiaTCYPBQEBAgN4MuEiqoX1UP/uofvZR/eynGtpH9bOP6mefy6F+7u7uVdbXJ598wkcffcTNN99s3demTRvq16/PQw89pFBDRERERKQGq3So8ccff9CvXz88PDys96x9/fXXeeGFF1iyZAkdOnSo8kGebcCAAdbv27RpQ5cuXWjYsCHz5s1j1KhR1mntDzzwACNHjgSgffv2LF++nFmzZjF16tRz9j1//nzS0tJYt25dubeTioiI4PvvvwcsnzSbO3cut99+OytXriQ6OrpMezc3N9zc3Mrsd3JyctgfkwaDwaHHrwlUQ/uofvZR/eyj+tlPNbSP6mcf1c8+jq5fVR43MzOTyMjIMvsjIyPJzMyssuOIiIiIiMjlp9J/WTz66KPcfPPNJCYmsmDBAhYsWMCBAwe46aabGDt2bDUM8fxq165N8+bN2bt3LwDBwcEAtGzZ0qZdixYtSEpKOm9f7du3JyAggFmzZmE2m8s87+rqStOmTWnatCnt27fnpZdeon79+kyfPr1qTkZERERERC6obdu2vPPOO2X2v/POO7Rp08YBIxIRERERkUvlomZqfPjhhzg7n3mps7Mz//d//1fubIXqlpuby759+7jnnnsACA8PJyQkhISEBJt2u3fvtpnlUZ4mTZrw2muv0bNnT4xGY7l/KP2d0Wjk5MmTF38CIiIiIiJSKa+88go33ngjy5Yto2vXrgBs2LCBQ4cO8fPPPzt4dCIiIiIiUp0qPVPDx8en3BkPhw4dwtvbu0oGdT7jx49n9erVJCYmsn79egYPHozRaGTYsGGAZVr9448/zltvvcX8+fPZu3cvEydOZNeuXYwaNeqC/Tdv3pyVK1fyzTfflJl5UlxcTEpKCikpKezZs4fnn3+eHTt2MGjQoOo4VRERERERKUePHj3YvXs3gwcP5sSJE5w4cYIhQ4YQHx/PZ5995ujhiYiIiIhINar0TI077riDUaNGMW3aNLp16wbAunXrePzxx63BQnVKTk5m2LBhZGRkEBAQQExMDBs3biQgIMDaZuzYsRQUFPDoo4+SmZlJ27ZtWbp0KU2aNKnQMSIiIlixYoV1xsZrr70GQHx8vPX2Vp6enjRp0oQZM2YwfPjwqj9RERERERE5p5CQkDILgv/55598/PHHfPDBBw4alYiIiIiIVLdKhxrTpk3DYDAwfPhwiouLAXBxceFf//oXL730UpUP8O+++uqrCrV78sknefLJJyvc76pVq2wet2jRgtTUVOvjSZMmMWnSpAr3JyIiIiIiIiIiIiIiVavSoYarqytvvvkmU6dOZd++fYBlLQpPT88qH5yIiIiIiIiIiIiIiEipSocapTw9PWndunVVjkVEREREREREREREROScKh1qFBQU8Pbbb7Ny5UrS0tIwmUw2z2/ZsqXKBiciIiIiIlJqyJAh533+xIkTl2YgIiIiIiLiMJUONUaNGsWSJUu47bbb6Ny5MwaDoTrGJSIiIiIiYsPX1/eCzw8fPvwSjUZERERERByh0qHGjz/+yM8//8y1115bHeMREREREREp1+zZsx09BBERERERcbBKhxr169fH29u7OsYiIjXQhkMb2H9iP8WnYMlSM4cOFREa6krfPgacXaBx7cZ0De3q6GFKDaXrTxxN16A4kq4/ERERERGpiSodarz22ms88cQTzJw5k4YNG1bHmESkhthwaAPdZnWz3RkAFMAXP5zZtf6+9XpTRaqcrj9xNF2D4ki6/kREREREpKZyquwLoqOjKSgooHHjxnh7e1O3bl2bTUSk1P4T+6u0nUhl6PoTR9M1KI6k609ErkQlJZYNIDHxzPciIiIiZ6t0qDFs2DAOHz7Miy++yNtvv80bb7xhs4mIlCo+VbXtRCpD1584mq5BcSRdfxX37rvvEh4ejru7O126dGHTpk3nbPvhhx8SGxtLnTp1qFOnDr179y7T3mw288wzzxAcHIyHhwe9e/dmz5491X0aIle8BQsg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/z26deuGOXPmYOzYsaU65rx585CZmYl+/frB3t4e//3vf5GWllYRp0dERERERGZizEBEVLNJxOMTBxIREREREREREREREVVBHAdHRERERERERERERETVApMaRERERERERERERERULTCpQURERERERERERERE1QKTGkREREREREREREREVC0wqUFERERERERERERERNUCkxpERERERERERERERFQtMKlBRERERERERERERETVApMaRERERERERERERERULTCpQURERERERERERERE1QKTGkREREREREREREREVC0wqUFERERERERERERERNUCkxpERERERERERERERFQtMKlBRERERERERERERETVApMaRERERERERERERERULTCpQURERERERERERERE1QKTGkRENYBEIsGcOXMscux9+/ZBIpFg3759Fjl+dSCRSPD6669buhlV2sqVKyGRSBAXF2fpphARERERVVtdunRBly5dLHZ8S8amRFR7MKlBRFROtH+ULer1999/W7qJZlm8eDFWrlxp6Wbo6dKlC5o1a2bpZlQJ2uSS9iWTyeDu7o5Bgwbh0qVLlm4eERERUaV79P780KFDBp8LIeDj4wOJRIK+fftaoIWWN2fOHEgkEiQnJxv9vFmzZhb9A3l1FRcXV2xs+Mknn1i6iWbZtm1blUtclHQtE1HNIrd0A4iIapr33nsPAQEBBuUNGjSwQGvKz+LFi+Hq6opRo0bplT/11FPIzs6GQqGwTMNIz6RJk9C2bVvk5+fj7Nmz+Pbbb7Fv3z6cP38eHh4elm4eERERUaWztrbGTz/9hI4dO+qV79+/Hzdv3oRSqbRQy6ime+GFF9C7d2+D8latWlmgNeVn27Zt+Oabb4wmNrKzsyGX88+NRFSx+FuGiKic9erVC23atLF0MyqNVCqFtbW1pZtB/9OpUycMGjRI9z4oKAivvvoqVq9ejbffftuCLSMiIiKyjN69e2PDhg34+uuv9f7Y+tNPPyE0NLTaPtn94MED2NraWroZVIzWrVvjpZdesnQzKhVjQyKqDJx+ioioEuXn58PZ2RmjR482+Cw9PR3W1taYOnUqACAvLw+zZs1CaGgoHB0dYWtri06dOmHv3r0lHmfUqFHw9/c3KNcOyX3UihUr8PTTT8Pd3R1KpRLBwcFYsmSJXh1/f39cuHAB+/fv1w2Z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RowcORJffPEFBg0ahB49eqBjx44G95R+fn64evWqwXEfLwsMDAQAuLu7G/0+unTpUuJ5DhkyBAUFBfj111+xfft2pKenY+jQoQb1PD098dprryEyMhKxsbFwcXHR3UdXFFtbW/Tt2xcbNmyAWq3G+vXr0alTJ3h5eenqlCZue5yp9/Tnzp3D5cuX8cUXX+Cdd95B//790b17d712aJkaG5Ym9qhopf15M+VaKCl+JKKKw6QGEZEFSKVSDBo0CL///jvWrFmDgoICgz9ca59QefSJlKNHj+qGJRcnMDAQaWlpOHv2rK7s9u3b+O2330o8RlpaGlasWGGwT1tbW6OJkse1adMG7u7u+Pbbb3XTawHA9u3bcenSJfTp06fEfZSX7t27Q6FQ4Ouvv9Y7x+XLlyMtLU3XlvT0dBQUFOht27x5c0ilUt053Lt3z2D/2vl/Hz3Pohw5ckRvDuEbN25g8+bN6Nmzp97TSK6urujVqxd+/PFHrF27Fs888wxcXV1NP+nHBAYGYuDAgVi5ciXu3LkDmUyGnj17YvPmzYiLi9PVu3v3Ln766Sd07NhRNxxeG0AeOHBAV+/BgwdYtWpVmdvTu3dv/P333zh27JiuLCkpSW/KLSIiIqKKYGdnhyVLlmDOnDno169fkfWef/55FBYW4v333zf4rKCgwKR7YlN4enqiZcuWWLVqld4+z58/j507d6J3794m76tFixZo0aIFli1bhl9//RVDhw7VG4VQlG7dukGhUGDJkiUGT+J/9913KCgoQK9evXRlKSkpenUUCgWCg4MhhEB+fj4ATYzx+FP1CxcuNBgZEB4ejiNHjuD06dO6snv37hncF4aHh8PBwQEfffSR7hiP0k7lWpwmTZqgefPmWL9+PdavXw9PT0889dRTus8LCwsNpg5yd3eHl5eX3r1+cnIy/v3333JfR2HIkCFISEjAsmXLcObMGZNiw6LitscZu6cvLCzEd999V+IxhBD46quvDPap/eN/ST8LpYk9KpqpP2+mXAumxI9EVLFK/heOiIhKZfv27fj3338Nyp988km9xdGGDBmChQsXYvbs2WjevDmaNGmiV79v377YtGkTnn32WfTp0wexsbH49ttvERwcjMzMzGLbMHToULzzzjt49tlnMWnSJGRlZWHJkiVo1KiR3h/We/bsCYVCgX79+mHcuHHIzMzE999/D3d3d9y+fVtvn6GhoViyZAk++OADNGjQAO7u7npz0GpZWVnh008/xejRo9G5c2e88MILuHv3Lr766iv4+/vrhkiXl6SkJHzwwQcG5QEBAXjxxRcxffp0zJ07F8888wz+85//IDo6GosXL0bbtm11Q/L37NmD119/HYMHD0ajRo1QUFCANWvWQCaT6RZXfO+993DgwAH06dMHfn5+SExMxOLFi+Ht7Y2OHTuW2M5mzZohPDwckyZNglKpxOLFiwEAc+fONag7YsQI3RzPxoLp0nrrrbfwyy+/YMGCBfjkk0/wwQcfICoqCh07dsRrr70GuVyOpUuXIjc3F5999pluu549e8LX1xdjxozBW2+9BZlMhh9++AFubm64fv16mdry9ttvY82aNXjmmWcwefJk2Nra4rvvvoOfn59eEo6IiIioIowcObLEOp07d8a4cePw8ccf4/Tp0+jZsyesrKxw5coVbNiwAV999VWR63GU1rx589CrVy+EhYVhzJgxyM7OxsKFC+Ho6Ig5c+aUal8jRozA1KlTAcDk6Uvd3d0xa9YsvPvuu3jqqafwn//8BzY2Nvjrr7/w888/o2fPnnoJoJ49e8LDwwMdOnRA3bp1cenSJSxatAh9+vTRrd/Rt29frFmzBo6OjggODsaRI0ewa9cuuLi46B377bffxo8//ogePXpg4sSJsLW1xbJly+Dr64t79+7pRgM4ODhgyZIlGD58OFq3bo2hQ4fq7kf/+OMPdOjQAYsWLSrxXIcMGYJZs2bB2toaY8aM0Vt3LiMjA97e3hg0aBBCQkJgZ2eHXbt24fjx4/jiiy909RYtWoS5c+di7969Jo0QOXnyJH788UeD8sDAQL3F5Xv37g17e3tMnTpVLwZ5tN9Njdse17RpUzzxxBOYPn067t27B2dnZ6xbt87gj/KNGzdGYGAgpk6dilu3bsHBwQG//vqr0bUsQkNDAQCTJk1CeHg4ZDKZ0ZEvAEyOPcrL/PnzYWNjo1cmlUoxY8YMk37eTLkWTIkfiaiCCSIiKhcrVqwQAIp8rVixQq++Wq0WPj4+AoD44IMPDPanVqvFRx99JPz8/IRSqRStWrUSW7duFSNHjhR+fn56dQGI2bNn65Xt3LlTNGvWTCgUChEUFCR+/PFHMXv2bPH4r/4tW7aIFi1aCGtra+Hv7y8+/fRT8cMPPwgAIjY2Vlfvzp07ok+fPsLe3l4AEJ07dxZCCLF3714BQOzdu1dvv+vXrxetWrUSSqVSODs7ixdffFHcvHlTr87IkSOFra2twbkba6cxnTt3LrK/u3Xrpqu3aNEi0bhxY2FlZSXq1q0rXn31VXH//n3d59euXRMvv/yyCAwMFNbW1sLZ2Vl07dpV7Nq1S1dn9+7don///sLLy0soFArh5eUlXnjhBXH58uUS2wlATJgwQfz444+iYcOGuu/z8T7Tys3NFXXq1BGOjo4iOzu7xP0L8fB72LBhg9HPu3TpIhwcHERqaqoQQoiTJ0+K8PBwYWdnJ2xsbETXrl3FX3/9ZbDdiRMnRPv27YVCoRC+vr5i/vz5umv90evDz89P9OnTx2D7zp07664VrbNnz4rOnTsLa2trUa9ePfH++++L5cuXG+yTiIiIyBzae5bjx48XW6+o+5jvvvtOhIaGCpVKJezt7UXz5s3F22+/LRISEkrcVnv/96jY2FgBQMybN0+vfNeuXaJDhw5CpVIJBwcH0a9fP3Hx4kW9Otr746SkpCLP4/bt20Imk4lGjRoVe77G/Pjjj+KJJ54Qtra2QqlUisaNG4u5c+eKnJwcvXpLly4VTz31lHBxcRFKpVIEBgaKt956S6Slpenq3L9/X4wePVq4uroKOzs7ER4eLv7991/h5+cnRo4cqbe/U6dOiU6dOgmlUim8vb3Fxx9/LL7++msBQNy5c0ev7t69e0V4eLhwdHQU1tbWIjAwUIwaNUr8888/Jp3jlStXdLHCoUOH9D7Lzc0Vb731lggJCRH29vbC1tZWhISEiMWLF+vV034PRd3Ha2m/66Jej/eDEEK8+OKLAoDo3r270X2aGrcZu/+OiYkR3bt3F0qlUtStW1fMmDFDREVFGZzLxYsXRffu3YWdnZ1wdXUVERER4syZMwbxbEFBgZg4caJwc3MTEolEL3YzFpuaEnsU9fNaVLz5OO13Y+wlk8l09Ur6eTPlWjAlfiSiiiURgqt3EhERVSUFBQXw8vJCv379sHz5cks3h4iIiIiqgeTkZHh6emLWrFmYOXOmpZtTZlOmTMHSpUuRmZlZ5KLRRERUu3FNDSIioiomMjISSUlJGDFihKWbQkRERETVxMqVK1FYWIjhw4dbuikmy87O1nufkpKCNWvWoGPHjkxoEBFRkbimBhERURVx9OhRnD17Fu+//z5atWqFzp07W7pJRERERFTF7dmzBxcvXsSHH36IAQMGwN/f39JNMllYWBi6dOmCJk2a4O7du1i+fDnS09Or9UgTIiKqeJx+ioiIqIoYNWoUfvzxR7Rs2RIrV65Es2bNLN0kIiIiIqriunTpgr/++gsdOnTAjz/+iHr16lm6SSabMWMGNm7ciJs3b0IikaB169aYPXs2unfvbummERFRFcakBhERERERERERERERVQtcU4OIiIiIiIiIiIiIiKoFrqlRidRqNRISEmBvbw+JRGLp5hARERERVRohBDIyMuDl5QWplM9WFYdxAxERERHVRqbGDExqVKKEhAT4+PhYuhlERERERBZz48YNeHt7W7oZVRrjBiIiIiKqzUqKGZjUqET29vYANF+Kg4NDpR9frVYjKSkJbm5ufDqujNiH5mH/mYf9Zx72n/nYh+Zh/5mH/WeeqtB/6enp8PHx0d0TU9EsHTfUZlXhZ4UqF7/z2offee3C77v24XdevZkaMzCpUYm0Q8cdHBwsltTIycmBg4MDf6jLiH1oHvafedh/5mH/mY99aB72n3nYf+apSv3H6ZRKZum4oTarSj8rVDn4ndc+/M5rF37ftQ+/85qhpJiB3ywREREREREREREREVULTGoQEREREREREREREVG1wKQGERERERERERERERFVC1xTowoqLCxEfn5+ue9XrVYjPz8fOTk5nFOujKp7H1pZWUEmk1m6GURERERkJrVajby8PEs3o8ap7vf75YVxA5VVQkYCsvOzK2z/b094G5vWbQIAyOVyeHh5oFf/XpgybQqc7J3gZe+lq5ubm4v27dvjzJkzOHXqFFq2bFlh7SIiosrFpEYVIoTAnTt3kJqaWmH7V6vVyMjI4AKNZVQT+tDJyQkeHh7Vtv1EREREtV1eXh5iY2OhVqvLvI/cXAkSE+UoKJBALhdwdy+AUinKsZXVU0243y8vjBuotBIyEvDCry8gIzejwo4RHxcP+6b28BvhB1EokHU9C8u/X47N0ZvR+IXG+Hngz7rExttvvw0vLy+cOXOmwtpDRESWwaRGFaJNaLi7u8PGxqbcbx6FECgoKIBcLueNaRlV5z4UQiArKwuJiYkAAE9PTwu3iIiIiIhKSwiB27dvQyaTwcfHp1SjCW7cAHbulOHIEQmuXZMgO1sCIQCJBFCpBOrXFwgLE+jZsxA+PhV4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JDDQzrRp1/LYY63VnSEi4iYDBw6kS5cuHD9+nFatWmUv7969O/379/dgZSIiIiIiJZev3ZfxN4/3dBn5olBDRETEDfbsieHBB5ezZs1RAK6/vhbvvhtO/frlPFuYiEgpFBYWRlhYGADx8fH8+OOPNG7cmCZNmni4MhERERERKWoWTxcgIiJSkjkcTmbM2EjLlu+xZs1RgoLszJ3bg5Ur/6VAQ0SkCPzrX/9i9uzZAKSkpNCuXTv+9a9/0bJlS7788ksPVyciIiIiIkVNoYaIiMhl+uef03Tt+gnPPPMzqamZ9OhRh7//foBHH9VwUyIiRWX16tV07doVgK+++grTNImNjeWNN97ghRde8HB1IiIiIiKl2wMPPIBhGBiGgd1up169eowePZrU1FQADh48yEMPPUS9evXw9/enQYMGTJo0ifT0dLfVoOGnRERECiirO2PChN9IS3MQHOzDf/7TjSFDWnj1RFoiIqVBXFwcFSpUAGD58uXcdtttBAQEcPPNNzNq1CgPVyciIiIiUvr17t2bhQsXkpGRwaZNm7j//vsxDINp06axa9cunE4nb7/9Ng0bNmTbtm0MHTqUpKQkpk+f7pb9K9QQEREpgJ07TzF48HL++OM4AL161eW//+1F7dohHq5MRKRsqFWrFuvWraNChQosX76cTz75BICYmBj8/Pw8XJ2IiIiISMmVkJCOv78Nmy3vAZ58fX2z57irVasWPXr04IcffmDatGn07t2b3r17Z69bv359/vnnH+bOneu2UEPDT4mIiORDZqaTV175g6uuep8//jhOSIgP8+eHs3z5bQo0RESK0dNPP83dd99NzZo1qV69Ot26dQNcw1K1aNHCs8WJiIiIiJRQGRkOHnlkBdOmrS/Q87Zt28batWvx8fG56Drndlu7gzo1RERELmHbtmgGD17Oxo0nALjxxnq8804vatYM9nBlIiJlz+OPP84111zD4cOH6dmzJxaL6z6t+vXra04NEREREZHLtHJlBFu3RrNvXyx33dWE+vXL5bremjVr2LdvX47htw3DYMaMGYBrTo2pU6fy448/EhkZSeXKlYmKimLmzJluq1WdGiIiIheRkeHgxRd/p23bD9m48QShob4sWtSbb78doEBDRMSD2rVrR//+/QkMDMQ0TQBuvvlmOnfu7OHKRERERERKnowMB4sWbcc0TWJj0/jwwx15rl+xYkXWrl3L8uXLuf7667HZbGzZsgUgx5waq1atIiMjA8Mw2Ldvn9vqVaghIiKSi7/+iqZDh//x3HNrSE93cMst9dm+/QHuv7+5JgMXEfGw999/nxYtWuDv74+/vz8tW7bkgw8+8HRZIiIiIiIl0sqVEWzbdpLq1YOoUMGPb7/dz/79sRdd326307FjR8LDw1m5ciX+/v7Zc91lTSLevHlzHnjgAXr27Mnzzz/P4sWL3VavQg0REZFzZGQ4mDJlLe3afcCff56gfHk/PvjgJr7+uj81aqg7Q0TE02bMmMFjjz3GTTfdxGeffcZnn31G7969efTRR93a0i4iIiIiUhZkdWkApKU58Pe35qtbI8uOHTswDIPjx4+TkpICwNGjR+nWrRtt27Zl4cKFJCQkaE4NERGRorBlSxSDBy9ny5YoAPr2bcjcuT2oVi3Iw5WJiEiWN998k7lz53LfffdlL+vTpw/NmjXj+eefZ/jw4R6sTkRERESkZMnq0qhUyZ/t20/i72+jRo1gvv12P/fc0zTXuTUiIyMJCgoiMzOTtLQ0DMOgfPnyzJkzh7vuuotu3bpRp04dpk+fzvr163n99deZNGmS22pWqCEiImVeerpr7oyXXvqDzEwnFSr4MXt2d+68s4mGmhIR8TLHjx+nU6dOFyzv1KkTx48f90BFIiIiIiIl07ldGjExqaSmZpKe7qBmzWBiYlzdGhMnXvjeu3Llyqxdu5akpCRmzpyJzWajYcOGvPrqq/j7+7N371727t1LzZo1s58zatQoRo4c6Za6NfyUiIiUaX/+eYKrr/6QKVPWkZnpZMCARuzYMZi77rpSgYaIiBdq2LAhn3322QXLP/30Uxo1auSBikRERERESqZzuzSOHk3EarVgmnDkSALly+c+t0aXLl3o1KkTDRs2pFWrVixYsIA//viDypUrExUVxb///W9M0+To0aM0atSIe++9F4fDgWmabqtbnRoiIlImREe5xnXctes0dIO0tEymTv2dV175A4fDpFIlf+bM6c7ttzdWmCEi4sUmT57MHXfcwerVq+ncuTMAv/32G6tWrco17BARERERkQud36WRluYgIMCG02kSF5d2yW6NLBaLhXHjxjFixAgGDRqEv78/R48e5frrr8+eU8NicW9vhTo1RESk1DNNkx07TgGwZMleNmw4Ttu2H/Dii7/jcJjcfvsVbN/+AP/6l4abEhHxdrfddht//PEHlSpVYsmSJSxZsoRKlSqxfv16+vfv7+nyRERERERKhAu7NAwMw8hXt8b5br/9dqxWK3PmzMmeJLx27dpMnz6d6OhoIiMjiYyMdFvt6tQQEZFSb8WKg8TGpkI5iDgYT4cOH+F0QuXK/rz1Vg8GDmzs6RJFRKQA2rZty4cffphjWVRUFC+99BLjxo3zUFUiIiIiIiXDxbo0svj6WgvUrWGz2XjiiSfynFMDcNsQVOrUEBGRUs00TSZMWAPndGA4nXDHHY3ZsWOwAg0RkVLi+PHjTJgwwdNliIiIiIh4vYt1aWTJq1tj0aJFLFmy5IJtjhkzJsecGrl9uYtCDRERKdVWrDjIhg0n4Lz/PAcPbk6lSgEeqkpEREREREREpPjl1qXh62u9YL2sbg3DgNhYV7eGt1CoISIipVZWl4bVmnOeDKvVYMKENW69S0BERERERERExNtdqksjy+XMrVFcFGqIiEipldWl4XDkDC8cDpMNG06wYsVBzxQmIiIiIiIiIlLM8tulkcVbuzU0UbiIiJRKWV0aFotrDo3zWSwwYcIaevWqm+sdCSIi4l1GjBiR5+PR0dHFVImIiIiISMl0bpfGtm0nL9qlkcXVreHgyJEEatQI5ttv93PPPU2pX79c8RWdC4UaIiJSKqWnOzh0KCHXQANcQcfhwwmkpzvw9dV/hyIi3m7z5s2XXOfaa68thkpEREREREqe3Lo0AgIu/XlIVrdGzZrBxMS4ujUmTuxU1OXmSZ/iiIhIqeTra2PDhntYunQvTz754wWPv/nmDfTr10iBhohICfHTTz95ugQRERERkRKroF0aWbyxW0NzaoiISKlVs2Ywb7554Z29VqvB++9vp0aNIA9UJSIiIiIiIiJSfAo6l8b5vG1uDYUaIiJSas2Zs4Xdu2MuWK6JwkVERERERESkrDi3S+Po0cR8d2lkcXVrwJEjCZQv78e33+5n//7Yoiv4EhRqiIhIqbRvXwzDh1847FSWrInCTdMsxqpERERERERERIpPYbs0snhTt4ZCDRERKXWiopIID/+CzMyLBxbnThQuIiIiIiIiIlIaFbZLI4s3dWso1BARkVIlMTGdW275in374qhZM4jly29j06Z76datFgBjx7Vn06Z72bTpXjZsuFcThYuIiIiIiIhIqeSuLo0s3tKtoU9yRESk1MjIcPCvf/0fGzZEUrGiPytX/ovGjSsAELrOF4DatYNp06aqJ8sUEZFCio2NZf369URFReF0OnM8dt9993moKhERERER75LVpREYaGf37tMYBjidJnD5Q3E7HCYHD8ZRtWog3367n3vuaUr9+uXcVnN+KNQQEZFSwTRNHn54BcuWHcDf38a33w7IDjRERKT0+L//+z/uvvtuEhMTCQkJydE6bxiGQg0RERERkTN+++0ovr5Wjh9PJDU1Ex8fKxkZzks/MQ+GYRAbm0ZQkA++vlbWrTumUENERORyPPfcGhYt2o7VavDZZ7fSvn01T5ckIiJF4JlnnuHBBx/kpZdeIiAgwNPliIiIiIh4rWefbU+fPg154omVhIT4UKVKoFu2e/hwPC1bVuKll66lQYNybtlmQSjUEBGREu+ttzbz0kt/APD227245ZYGHq5IRESKytGjRxk2bJgCDRERERGRSwgO9mHz5iji49OpXz8Uq9U9U2zXqhXCnj2xREYmeWSUDE0ULiIiJdrixbt54olVAEyZ0pmHHmrh4YpERKQohYeHs3HjRk+XISIiIiLi9U6dSuHjj3cSGGh3W6ABEBRkJzPTyaJF287M0VG81KkhIiIl1q+/HmHQoG8xTXjkkVY891wHT5ckIiJF7Oabb2bUqFHs2LGDFi1aYLfbczzep08fD1UmIiIiIuJdvvxyN4cOJRAUZOfIkQS3bts0TTZtOsGaNUe49tpabt32pXhVqHH48GEMw6BmzZoArF+/nv/97380bdqUhx9+2MPViYiIN9m2LZo+fb4iLc1Bv34NmTOne47JYkVEpHQaOnQoAFOmTLngMcMwcDgcxV2SiIiIiIhXMgxo27ZqkW3fYjFwOMp4p8agQYN4+OGHuffee4mMjKRnz540a9aMjz76iMjISCZOnFig7c2ZM4fXXnuNyMhIWrVqxZtvvsk111yT67qLFi1i8ODBOZb5+vqSmpqa/b1pmkyaNIn//ve/xMbG0rlzZ+bOnUujRo0KfrAiInLZDh+Op3fvL4mNTaNz5xr87383u7WNUkREvJfT6XTr9nTNICIiIiKl1dChrRg6tJWny3A7r/oEaNu2bdkXEJ999hnNmzdn7dq1fPTRRyxatKhA2/r0008ZMWIEkyZN4s8//6RVq1aEh4cTFRV10eeEhIRw/Pjx7K+IiIgcj7/66qu88cYbzJs3jz/++IPAwEDCw8NzXMSIiEjRiolJpXfvLzl6NJErr6zA11/3w9/ffuknioiInEfXDCIiIiIiJY9XdWpkZGTg6+sLwMqVK7PHw23SpAnHjx8v0LZmzJjB0KFDs++kmjdvHt9++y0LFixgzJgxuT7HMAzCwsJyfcw0TWbNmsVzzz1H3759AXj//fepWrUqS5Ys4c4777zgOWlpaaSlpWV/Hx8fD7juLnP3HWb54XQ6MU3TI/suLXQOC0fnr3B0/iAlJYO+fb9ix45TVK8eyHffDaBcOd/8nZMz3ZBl/RwWhn4GL595zjnT+bs8+vkrHG84f+7c9y+//ML06dPZuXMnAE2bNmXUqFF07dq1QNvxhmsG8L7rhrLMG35XpHjpNS979JqXLXq9yx695iVbfl83rwo1mjVrxrx587j55pv54YcfmDp1KgDHjh2jYsWK+d5Oeno6mzZtYuzYsdnLLBYLPXr0YN26dRd9XmJiInXq1MHpdNKmTRteeuklmjVrBsCBAweIjIykR48e2euHhobSvn171q1bl+sFyssvv8zkyZMvWB4dHe2RO7WcTidxcXGYponF4lVNOiWGzmHh6PwVTlk/fw6Hk6FDf+XXX48SEmLnww+74eeXSlRU/v49zfqwKCEhIc87cOXiyvrPYGHExMZk/z0qKkrn7zLo569wvOH8JSS4Z2LCDz/8kMGDBzNgwACGDRsGwG+//Ub37t1ZtGgRgwYNytd2vOWaAbzvuqEs84bfFSlees3LHr3mZYte77JHr3nJlt9rBq8KNaZNm0b//v157bXXuP/++2nVyjXe19dff33RcW1zc/LkSRwOB1Wr5pwEpWrVquzatSvX5zRu3JgFCxbQsmVL4uLimD59Op06dWL79u3UrFmTyMjI7G2cv82sx843duxYRowYkf19fHw8tWrVonLlyoSEhOT7eNzF6XRiGAaVK1fWL/Vl0jksHJ2/winL5880TZ588keWLTuMj4+Vr77qx3XX1SrQNrI6AYODg6lSpUpRlFnqleWfwcIqf+zsG7MqVaro/F0G/fwVjjecPz8/P7ds58UXX+TVV19l+PDh2cuGDRvGjBkzmDp1ar5DDW+5ZgDvu24oy7zhd0WKl17zskevedmi17vs0WtesuX3msGrQo1u3bpx8uRJ4uPjKV++fPbyhx9+mICAgCLdd8eOHenYsWP29506deLKK6/k7bffzu4YKShfX9/sD9HOZbFYPPZLZRiGR/dfGugcFo7OX+GU1fP30ku/M3fuVgwDPvzwJm64oU7BN2Kc+ePMOZTLU1Z/BgvLOOd86fxdPv38FY6nz5+79rt//35uvfXWC5b36dOHcePGuWUfF1MU1wzgndcNZZmnf1ek+Ok1L3v0mpcter3LHr3mJVd+XzOvemVTUlJIS0vLDjQiIiKYNWsW//zzT4Huqq1UqRJWq5UTJ07kWH7ixImLjn97PrvdzlVXXcXevXsBsp9XmG2KiEjBLVz4N+PHrwHg9ddv4PbbG3u4IhER8aRatWqxatWqC5avXLmSWrXy38WnawYRERERkZLJq0KNvn378v777wMQGxtL+/bt+c9//kO/fv2YO3duvrfj4+ND27Ztc1zsOJ1OVq1alePOqrw4HA7+/vtvqlWrBkC9evUICwvLsc34+Hj++OOPfG9TREQK5rvv9jN06AoAnn32Gp58so2HKxIREU975plnGDZsGI899hgffPABH3zwAY8++ihPP/00I0eOzPd2dM0gIiIiIlIyedXwU3/++SczZ84E4IsvvqBq1aps3ryZL7/8kokTJ/LYY4/le1sjRozg/vvvp127dlxzzTXMmjWLpKQkBg8eDMB9991HjRo1ePnllwGYMmUKHTp0oGHDhsTGxvLaa68RERHBkCFDAFfb0tNPP80LL7xAo0aNqFevHhMmTKB69er069fPvSdCRERYv/44t9/+NQ6HyX33NeXll7t6uiQREfECjz32GGFhYfznP//hs88+A+DKK6/k008/pW/fvgXalq4ZRERERERKHq8KNZKTkwkODgZgxYoVDBgwAIvFQocOHYiIiCjQtu644w6io6OZOHEikZGRtG7dmuXLl2dP2nfo0KEcY3TFxMQwdOhQIiMjKV++PG3btmXt2rU1Vl+RAAC0jklEQVQ0bdo0e53Ro0eTlJTEww8/TGxsLF26dGH58uVum/RQRERcdu8+zc03LyY5OZPw8Lq8+244hmF4uiwREfES/fv3p3///oXejq4ZRERERERKHsM0TdPTRWRp2bIlQ4YMoX///jRv3pzly5fTsWNHNm3axM0330xkZKSnSyyU+Ph4QkNDiYuLIyQkpNj373Q6iYqKokqVKpoo5zLpHBaOzl/hlJXzFxmZRKdO/+PAgTjatq3Kzz/fQVCQT6G3229OP5ZuWcrcu+fyaLdH3VBp2VNWfgaLwo9b9tF9aUNIC8bxQqzO32XQz1/heMP58/R74ZJE58pzvOF3RYqXXvOyR6952aLXu+zRa16y5fd9sFd1akycOJFBgwYxfPhwbrjhhuxxZ1esWMFVV13l4epERKSoJSSkc9NNX3LgQBwNGpTj228HuCXQEBGRkq1ChQrs3r2bSpUqUb58+Ty7906fPl2MlYmIiIiISHHzqlBj4MCBdOnShePHj9OqVavs5d27d3dLe7mIiHiv9HQHAwYsZfPmKCpX9uf77wdStWqgp8sSEREvMHPmzOxhamfOnKkhCUVEREREyjCvCjUAwsLCCAsL48iRIwDUrFmTa665xsNViYhIUXI6TR58cDkrV0YQGGjnu+9uo0GDcp4uS0REvMT999+f/fcHHnjAc4WIiIiIiIjHedXAYk6nkylTphAaGkqdOnWoU6cO5cqVY+rUqTidTk+XJyIiRWTMmNV89NFObDYLX3zRh3btwjxdkoiIeCmr1UpUVNQFy0+dOoXVavVARSIiIiIiUpy8qlNj/PjxzJ8/n1deeYXOnTsDsGbNGp5//nlSU1N58cUXPVyhiIi426xZm3jttQ0AzJ8fTu/e9TxckYiIeDPTNHNdnpaWho+P5mESERERESntvCrUeO+993j33Xfp06dP9rKWLVtSo0YNHn/8cYUaIiKlzKef7mL48J8AeOWVrtx3XzMPVyQiIt7qjTfeAMAwDN59912CgoKyH3M4HKxevZomTZp4qjwRERERESkmXhVqnD59OtcLkSZNmnD69GkPVCQiIkXlxx8Pcd99ywB48smrGD1a8yeJiMjFzZw5E3B1asybNy/HUFM+Pj7UrVuXefPmeao8EREREREpJl4VarRq1YrZs2dn34WVZfbs2bRs2dJDVYmIiLtt3RpFv35LSE93MHDgFcyceT2GYXi6LBER8WIHDhwA4Prrr2fx4sWUL1/ewxWJiIiIiIgneFWo8eqrr3LzzTezcuVKOnbsCMC6des4fPgw3333nYerExERdzh4MI4bb/yShIR0rruuJh98cBNWq8XTZYmISAnx008/eboEERERERHxIK8KNa677jp2797NnDlz2LVrFwADBgzg4Ycf5oUXXqBr164erlBERArj1KkUevf+kuPHk2jRohJLlvTDz8+r/isSEZES4MiRI3z99dccOnSI9PT0HI/NmDHDQ1WJiIiIiEhx8LpPkqpXr37BhOBbt25l/vz5vPPOOx6qSkRECis5OYNbblnMP/+cplatYJYtu41y5fw8XZaIiJQwq1atok+fPtSvX59du3bRvHlzDh48iGmatGnTxtPliYiIiIhIEdN4HyIiUuQyM53ceec3/P77ccqX92P58tuoUSPY02WJiEgJNHbsWEaOHMnff/+Nn58fX375JYcPH+a6667j9ttv93R5IiIiIiJSxBRqiIhIkTJNk8cfX8n//d8+/Pxs/N//9adp00qeLktEREqonTt3ct999wFgs9lISUkhKCiIKVOmMG3aNA9XJyIiIiIiRU2hhoiIFKnJk9fy3//+hcVi8PHHN9O5cw1PlyQiIiVYYGBg9jwa1apVY9++fdmPnTx50lNliYiIiIhIMfGKOTUGDBiQ5+OxsbHFU4iIiLjVO+9sZfLkdQDMmdOdfv0aebgiEREp6Tp06MCaNWu48soruemmm3jmmWf4+++/Wbx4MR06dPB0eSIiIiIiUsS8ItQIDQ295ONZLeYiIlIyfP31Xh57bCUAEyZ04NFHW3u2IBERKRVmzJhBYmIiAJMnTyYxMZFPP/2URo0aMWPGDA9XJyIiIiIiRc0rQo2FCxd6ugQREXGjtWuPcscd3+B0mjz0UAsmT+7s6ZJERKSUqF+/fvbfAwMDmTdvngerERERERGR4qY5NURExK127TrFrbd+RWpqJrfcUp9583piGIanyxIRERERERERkVLAKzo1RESkdDh2LJHw8C84fTqV9u2r8cknt2CzKT8XERH3sVgseYblDoejGKsREREREZHiplBDRETcIi4ujRtv/JJDhxK44oryfPNNfwIDfTxdloiIlDJfffVVju8zMjLYvHkz7733HpMnT/ZQVSIiIiIiUlwUaoiISKGlpWXSr98S/vormrCwQJYvv41KlQI8XZaIiJRCffv2vWDZwIEDadasGZ9++ikPPfSQB6oSEZGi9sADD/Dee+8BYLPZqFmzJrfffjtTpkzBz88PgD59+rBlyxaioqIoX748PXr0YNq0aVSvXt2TpYuIiJsp1BARkUJxOk3uu28ZP/98mOBgH5Ytu4169cp5uiwRESljOnTowMMPP+zpMkREyrxjCcdIyUhx+3YT0hK4tvu1THtzGhmZGWzfsp1R/x5FUkYSc2bOAeD6669n3LhxVKtWjaNHjzJy5EgGDhzI2rVr3V6PiIh4jkINERG5bKZpMmLET3z22T/Y7Ra++qovrVtX8XRZIiJSxqSkpPDGG29Qo0YNT5ciIlKmHUs4xl1f3kVCWoLbtx1xMAJHioPHVz+evcza0Mr7i99n/JTxVA+uzvDhw7Mfq1OnDmPGjKFfv35kZGRgt9vdXpOIiHiGQg0REbls06dv4PXX/wTgvfdupHv3Ov/P3n3HR1GubRz/bUnvIQkhpFBCEUVRUCyooCgRLEhRREU4vIgeERQbKorYOHBQqgKeI2BBPRZEKYKIYkMRURQEgtRQEkII6XV35/1jSUJIAoGUTbm+fvJJdnZm9p5dEnf2mue5XVyRiIg0dEFBQaUahRuGQWZmJt7e3rz77rsurExERHILc8nMz8TD6oGX1ata951oScRmthHoGQhA1oEscnbn4BbsVu7IkNTUVBYtWsTll1+uQENEpIFRqCEiImflnXf+4vHHvwPglVe6c8cd57i4IhERaQymTZtWKtQwm82EhobStWtXgoKCXFiZiIgU8bJ64ePuU637tFqsHP7jMN+N/A7DYeAodIAJIm+PLLXeE088wezZs8nJyeHSSy9l2bJl1VqHiIi4nkINERE5Y19+uZd//GMVAGPHdmbs2C4urkhERBqLoUOHuroEERFxkSYdmtDxHx2x59vZ/cVu7NgJvCiw1DqPPfYYw4cPZ9++fUycOJEhQ4awbNmyUoG4iIjUbwo1RETkjGzcmET//p9hszm44472/Pvf3V1dkoiINHB//vlnpdc9//zza7ASERFxJYuHBZ9w5wiQC+69gLXj1uL2oxsMLFknJCSEkJAQ2rZtyznnnENUVBQ///wzl112mYuqFhGR6qZQQ0REKm3XrjR6915MVlYh114bzcKFN2A264onERGpWZ06dcJkMmEYxinXM5lM2O32WqpKRERcyWQ2EXNjDDve20HepLxy13E4HADk5+fXZmkiIlLDFGqIiEilJCdnExf3McnJOXTqFMbixbfg7m5xdVkiItII7Nmzx9UliIhIHRR6cSh/f/A37775Ln179WXDhg1069aNoKAgdu3axTPPPEPr1q01SkNEpIFRqCEiIqeVlVXAjTd+ys6dabRo4c+KFf3w9/dwdVkiItJIxMTEuLoEERGpg8wWMyHdQ3hj1hsMumUQixcvZsKECWRnZ9OsWTPi4uIYP348Hh46dxERaUgUaoiIyCkVFtoZOPBzNmxIokkTL1atGkCzZr6uLktERBq5rVu3kpCQQEFBQanlN998s4sqEhGRmtTpvk7lLg+PC+ejNz+idXBrvv7669otSkREXEKhhoiIVMgwDEaM+JKVK/fi5WVl+fJ+tG0b7OqyROqNhPQEUnJS2JG237nAZOe3xN8wm80AhHiHEB0Q7cIKReqf3bt3c+utt7J58+ZSfTZMJmePJ/XUEBERERFp2BRqiIhIhcaP/4G33voLi8XEhx/eRNeuzVxdkki9kZCeQLvZ7cizndC40j2Hi/97cfFNT6sn8aPiFWyInIExY8bQsmVL1qxZQ8uWLfnll184evQojzzyCFOnTnV1eSIiIiIiUsMUaoiISLlmz/6Nl19eD8Abb1zPjTe2dnFFIvVLSk5K6UCjHHm2PFJyUhRqiJyBn376ia+//pqQkBDMZjNms5lu3boxadIkRo8eze+//+7qEkVEpAZsmruJA98dAMBkMeEZ7ElIlxCCe5eMJL/55pvZtGkTycnJBAUF0bNnTyZPnkxERISryhYRkRpgdnUBIiJS93zyyQ5Gj3bOR/vCC1fwj390dHFFIiIiTna7HT8/PwBCQkI4dOgQ4GwmHh8f78rSRETkDBkG5OZARgZkpENWFpxqFsHQC0Lp+XpPrpl+DefedS6H1h4icWli8f09evTgww8/JD4+nk8++YRdu3YxYMCAWjgSERGpTRqpISIipXz33X7uvHM5hgH33XcBTz99qatLEhERKXbeeefxxx9/0LJlS7p27cqUKVNwd3fnjTfeoFWrVq4uT0RETqOwAI4cgdRjkJkJtkJwONsjYTKBxQLe3hAYAKFh4OsDONsmYbaa8Qz0BMCriRfB3wWTuS2zeN8PP/xw8c8xMTGMGzeOvn37UlhYiJubW20dooiI1DCFGiIiUmzLliPcfPMS8vPt9O0by+zZ1xY3XhWRM+MwHK4uQaRBGj9+PNnZ2QA8//zz3HjjjVx55ZU0adKE//3vfy6uTkREKlJQAAkJkHwY8gucOYXF6vxyOz6PiGE4R2pkZEBaGhw4AIGBEF3OTJ0Z+zNI35mONbj8j7ZSU1NZtGgRl19+uQINEZFKyC/M59XVrxIdHM3groPr9OdBCjVERASA/fsziIv7hPT0fK64ojnvvdcHi0WzFIqcqayCLN7a9BZT1k1xdSkiDVKvXr2Kf46NjWX79u2kpqYSFBRUp0+8REQaLQNSUmD3bsjOAavVORKjoj/ZFkvJz4WFkHIU0tLBlAnpfyTzxbAvMBwGjkIHmKD57c1Lbf/EE08we/ZscnJyuPTSS1m2bFkNHpyISMOQX5jPc0ufY/Fvi/F08yTfls+wK4bV2ffX+rRKREQ4diyPuLhPOHgwi3POCebzz/vi5aWrmUTOxN60vTz65aNEvhrJqC9GkZCe4OqSRBqkd999t3ikRpHg4OA6e8IlItKYGQbs3Qtbt0FOrjPM8PCoONA4mZsb+Pg4R3VkZYF7VBMue/4quj3fjcirIml2ZTMCLwostc1jjz3G77//zpdffonFYmHIkCEYhlHdhyYi0mAUBRqf/v4p4QHheFg9mLFmBgt+XFDu38+hQ4diMpkwmUy4ubnRsmVLHn/8cfLy8gDYu3cvw4cPp2XLlnh5edG6dWsmTJhAQUFBtdWsUENEpJHLzS3k5ps/ZevWozRv7svKlQMIDvZydVki9YJhGHy37zv6f9if1jNb88pPr5Cen05scCyPXfaYq8sTaZAefvhhmjZtyuDBg1mxYgX2U3WUFRER1zkeaOzdB2bzqUdnnI67h3OaKhsW9qT44NXMnwvuvYCM3Rkc/fFoqXVDQkJo27Yt1113HR988AErVqzg559/rvrxiIg0QCcGGk39m+Lv6U9T/6anDTbi4uJITExk9+7dTJs2jXnz5jFhwgQAtm/fjsPhYN68efz1119MmzaNuXPn8tRTT1Vb3Qo1REQaMbvdwZ13ruCHHw4SEODBF1/0Jzra39VlidR5+bZ83tr0Fp3f6MzVC69m8bbFOAwHPVv1ZOkdS4kfFc+orqPwtHqecj+eVk9CvENqqWqRhiExMZEPPvgAk8nEbbfdRrNmzXjggQdYt26dq0sTEZETHD7s7KFhtYK7e9X3Z8I5NVVaGuz4GzCZiLkxhkOfHSIvN6/cbRwOZ4+z/Pz8qhcgItLAlBdoFDldsOHh4UF4eDhRUVH07duXnj17snr1asAZeCxYsIDrr7+eVq1acfPNN/Poo4+yePHiaqtdPTVERBopwzAYPfprPv30b9zdLXz2WV86dgx1dVkidVpSVhJzf53LnF/nkJydDDiDibvPv5vRXUdzXth5xetGB0QTPyqelJwU9u+Hvn3By8vBd9+B2ey8riTEO4TogHI6X4pIhaxWKzfeeCM33ngjOTk5fPrpp7z33nv06NGDyMhIdu3a5eoSRUQavfx82LPX+XN1BBon8vCAlCPO0CT04lD+/uBv3n3zXfr26suGDRvo1q0bQUFB7Nq1i2eeeYbWrVtz2WWXVW8RIiL13KkCjSJN/ZtyOOMwM9bMAKiwx8aWLVtYt24dMTExFT5eeno6wcHB1Va/Qg0RkUbq5ZfX8/rrmzCZYNGi3lx9dZSrSxKps35L/I0Z62fwwZYPKLA75wFt7tecUZeMYsRFI2ji3aTc7aIDookOiCYgB0gEi6+Di5qVhBoiUjXe3t706tWLY8eOsW/fPrZt2+bqkkREBDh4EHJzwNun+vdttTobiO/ZA+ecbyakewhvzHqDQbcMYvHixUyYMIHs7GyaNWtGXFwc48ePx8PDo/oLERGppyoTaBQpL9gAWLZsGb6+vthsNvLz8zGbzcyePbvcfezcuZNZs2YxderUajsGhRoiIo3QggWbGT/+BwBmzLiGAQPaubgikbrH5rDx2fbPmL5+Oj8k/FC8/NLIS3mo60P0O6cfbhY3F1Yo0ngVjdBYtGgRa9asISoqijvuuIOPP/7Y1aWJiDR6BQWQmgpu7mffQ6M8/r06Ff/s6Qk5OZB6FMLjwvnozY9oHdyar7/+uvoeUESkATqTQKPIycEGQI8ePZgzZw7Z2dlMmzYNq9VK//79y2x78OBB4uLiGDhwICNGjKi241CoISLSyKxYsZsRI74EYNy4S3jwwYtcXJFI3XIs9xhv/v4ms36ZRUJ6AgBWs5WBHQYypusYukZ2PeN9FvUxLiyEtWvh6qudc0KLyJkbNGgQy5Ytw9vbm9tuu41nnnlG04qIiNQhGRlgs4FXDQ6OMJnAbILkIxAZUHOPIyLSkJxNoFHkxGDD97AvoT6hxMbGAjB//nwuuOAC3nzzTYYPH168zaFDh+jRoweXX345b7zxRrUei0INEZFG5JdfEhk48HPsdoMhQzrw8stXurokkTojPiWemetnsvCPheQU5gDQxKsJIzuP5J8X/5Pm/s3Par+LF8MDDzh/zs83c+21EBkJM2ZAv37VVb1I42GxWPjwww/p1asXFqWDIiJ1TmYmmM04O3vXIHd3yMtzfomIyKlVJdAoUhRsbEvcRo5fDoZhYDKZMJvNPPXUU4wdO5bBgwfj5eXFwYMH6dGjB507d2bBggXVPgWzJnQWEWkkduxIpU+fxeTk2OjVqwX//W+vchs8iTQmhmGwaucqei/qTfvX2vP6r6+TU5jDeWHn8d+b/sv+h/fz0rUvVSnQGDAAkpJKLz940Ll88eJqOAiRRmbRokX07t1bgYaISB2UkeGcfqo2/kRbrM7RsPkFNf9YIiL1WXUEGkWa+jfFbDaz+8huFvy4AMMwABg4cCAWi4XXXnuNgwcP0r17d6Kjo5k6dSpHjhwhKSmJpJNPjKtAIzVERBqBpKRs4uI+ISUlly5dmvLxxzfj5qYPg6Txyi7I5p0/32Hm+plsS3E2FjZh4qZ2NzGm6xh6tOhR5dDPbocxY+D4e7xSDMM5bcJDD8Ett2gqKpHK6N27N++//z4BAc55Rv71r39x3333ERgYCMDRo0e58sor2bp1qwurFBFp3PbtA4ejdt/b5OfX3mOJiNQ31RloFPFy88JutpdqHm61Whk1ahRTpkzBy8uLnTt3snPnTiIjI0tta5R3gnwWNFJDRKSBy8jIp3fvT9izJ53WrQNZvrwfvr7uri6r1sUnxQOwYvMKF1cirpSQnsATq58galoU9y+/n20p2/Bz92NM1zHseHAHnw36jGtaXlMto5i+/x4OHKj4fsOA/fud64nI6a1atYr8Ez65evnll0lNTS2+bbPZiI+Pd0VpIiJyXHrG8Ys3avHTJrut9h5LRKQ+qYlAA6DTXZ3odn83PKwezFgzo3jExrhx40hOTuaBBx7AMIxyv6qLRmqIiDRgBQV2+vf/nN9/TyYszJtVqwYQFubj6rJq3QvLXmB70nYAlv65lBeWvcAzNz7j4qqkthiGwbr965i+fjqfbvsUu+Hs2t0qqBWjLxnNsAuH4e9RPW/uwHl14saNMHt25dZPTKy2hxZp0E4+CarOkyIREakedufbLBzmXGojazAsueWOihURaexqKtA40YnNw8E5YqO2pjlXqCEi0kA5HAbDhq3kq6/24ePjxvLl/WjdOtDVZdW6F5a9wLOfPVtqWdFtBRsNW4G9gA//+pDpP09nY+LG4uU9WvTgoUsfok+bPljM1TM3wrFjsHo1LF8OX3wBR45UfttmzaqlBBERERGX8/Xwwmzzw+GRicNS8/NCGRbwNPnh5eZV448lIlJf1EagUcRVwYZCDRGRBuqJJ77lvfe2YbWa+eSTm+nSJdzVJdW68gKNIgo2Gq7k7GTm/TqP1399naQsZyMyD4sHd51/F6O7jub8pudX+TEMAzZvhhUrnF/r1pVcmQjg5wc9e8LatZCWVn5fDZMJIiPhyiurXI5Io2AymcqcINXWlWAiIlI5F7SKoPXv7+MTkIt3LQwQ37cPRv7Diwi/iJp/MBGReqA2A40irgg2FGqIiDRA06b9ytSpvwIwf34vevVq6eKKat+pAo0iCjYalj+S/mDG+hm8t/k98u3OKwOb+TbjgYsf4N7O9xLqE1ql/WdlwZo1JUHGyf0yzjkH+vSB3r3hiivA3R0WL4YBA5wBxonBRtH7u+nT1SRcpLIMw2Do0KF4eHgAkJeXx3333YePj/NTs3x1ihURcbmWLSHIGkF+KvjU8CdONht4ZEOXdjX7OCIi9YUrAo0itR1sKNQQEWlgPvhgO2PHrgXgX/+6krvvPte1BblAZQKNIgo26je7w87SHUuZsX4Ga/euLV5+ccTFPHTpQwzoMAB3i/tZ7dsw4O+/S0KMb7+FgoKS+7284JprnCHGDTc4T+JP1q8ffPwxjBlTOgSJjHQGGv36nVVpIo3SPffcU+r2XXfdVWadIUOG1FY5IiJSDnd36NgRvvkGwsJq9rEyMpyjY9sp1BARAeC1b17jk42f0CywWa0GGkWa+jclKT2JmWtmEh4QTu+OvWvssRRqiIg0IF9/ncCQISsAePDBC3n88UtcXJFrTPhswhmvr1CjfknPS2f+7/OZ9css9qTtAcBisjCgwwDGdB3DpZGXntVVIXl5zvBi+XJnkLFrV+n7W7YsGY3Rvbsz2Didfv3gllvg228dxMdn0K6dP1dfbdYIDZEztGDBAleXICIildCnjzPUKChwhhw1JTUV4uKgefOaewwRkfqkfbP2+Hv5k5GbgZ+HX61P1epwOMjKzyIiMIKWITU7Y4hCDRGRBmLTpmT69l1CYaGDgQPbMm1aj0Y71/hzNz/HhM8rH2xMvGViDVYj1envo38zc/1MFv6xkKyCLACCPIMY2Xkk/7z4n0QFRJ3xPvftKxmNsWYN5OaW3OfmBldd5Qwx+vSBtm1Lpo46ExaLMwTp0CGPsDB/zOYz34eIiIhIfdC9u3NU6uHDEHXmb80qJTsbrFbo27dm9i8iUh/17tibAlsBLy5/kYNpB2ke2LzWPhdyOBzsTtlNRGAEr972Kuc0O6dGH0+hhohIA7B3bzo33PAJmZkFXH11JG+/3RuLpXF+arojaQff7vi20us/f8vzGqVRxxmGwZo9a5j+83RW/L0CA2dzig6hHRjTdQx3nX8X3m7eld5fYSH8+KMzxFi+HLZuLX1/8+bOEKN3b7j2Wue0BiIiIiJSOd7ecM898NJLkJPjvF2dHA44eBC6dXP2MRMRkRJ9L+wLUKvBxsmBxgVRF9To44FCDRGReu/o0Vzi4j4hKSmbjh1DWLKkL56eje/Pe35hPv/64l+8/MXLFNgK8HTzpFtsN77a9lWF2yjQqNtyCnNY9OciZqyfwV9H/ipe3qdNH8Z0HUPPVj0r/eYsMRFWrnSGGKtXO+dgLmI2w+WXlwQZ559/dqMxRERERMTp9tudU3p++y3ExlKto1QTEyEkBMaNc47WEBGR0moz2HBFoAEKNURE6rWcnEJuvHEx8fGpREX58cUX/QkM9HR1WbVubfxaRr4zkh2HdwDQ69xevH7n67QKbVVh03AFGnXXgYwDvL7hdeZtnEdqbioAPm4+DOs0jAe7PkjbJm1Puw+7HX75pWRaqd9+K31/SIizuXfv3nD99RAcXBNHIiIiItI4Wa3O0GH3btizx9mXrDqCjZQU56jbRx6BNm2qvj8RkYaqNoINVwUaoFBDRKTestkc3H77Un7+OZGgIE9WrRpA8+aNa56clMwUHv3oUd766S0Amvo3ZcagGdzW5bbi/1kXBRcnBhsKNOqmnw/8zPSfp/Px1o+xG3YAWgS24MFLHuQfF/6DQM/AU25/9CisWuUMMVaudN4+UZcuJU2+O3dGjbpFREREalCrVjB5Mjz6KOzaBS1aOPuVnQ3DgKQkyM+HkSNh8OBqLVVEpEGqyWDDlYEGKNQQEamXDMPg/vtXs2zZbjw9rSxdeivnnNPE1WXVGsMwWLhuIY9+9Cip2amYTCZGXjWSSf0mEegdWGb9Z258BsMweO7z53ju5ucUaNQhBfYCPt76MTPWz+CXg78UL7865mrGdB3Dze1uxmIuP30wDNi0qWQ0xs8/O+dYLhIQAL16OUOMuDho2rSGD0ZERERESuncGWbMgPHjIT7eOVo2KOjMpvrMy4P9+53v7R59FIYM0VShIiKVVRPBhqsDDVCoISJSL02cuI7//nczZrOJ99/vwxVXNHd1SbVmW+I27nv3Pr7b8R0A50eez7y75nFp60tPud34PuO59+J7CQsLq40y5TRSclKY9+s8Xv/1dQ5lHgLA3eLO4I6DGdN1DJ3CO5W7XUYGfPWVszfGF18451Q+UceOJb0xLrvs7K8GFBEREZHqcf758M47MHs2LF4Mf//tDDaCgyseOWsYkJkJR444A4wuXZzTWZ13Xu3WLiLSEFRnsFEXAg1QqCEiUu/Mm/cnEyf+BMDrr/ekb9/GMZlsXmEeL694mX998S8K7YV4uXsx8eaJPHTtQ7hZ9cl1fbH58GZmrJ/Bos2LyLPlARDuG879Xe5nZOeRNPUtPZzCMGDbtpLRGN9/DzZbyf3e3tCzZ0mQERVVm0cjIiIiIpUREABPPeXsafbZZ7B6tbPXBjiDjaILUex2Z88MAC8vuOQS6NfP2QPNs/G1DhQRqTbVEWzUlUADFGqIiNQrK1fuZ9Qo5wiFZ565lJEjXfc/kNr01davuH/R/exM3glA7469eW3wa7QIaeHawqRSHIaD5TuWM339dL7e83Xx8s7NOjOm6xhuO/c2PKwexctzcuCbb0qCjL17S++vTZuS3hhXXQUeHoiIiIhIHWcywUUXOb8eeAA2boSdO+Gvv+DYMWeg4e0N7dtDbCx06ADnnquppkREqktVgo26FGiAQg0RkXpj3bpD3H//DzgcBsOHd2TixCtcXVKNS85I5pGPHuHdn98FoFlAM2beMZP+F/WvtuZWUnMy8jNYuGkhM9fPZNexXQCYTWb6ndOPh7o+xOVRlxe/jrt3OwOM5cudgUZ+fsl+PDyge3dniHHDDc5QQ0RERETqr7Aw5/s6ERGpXWcTbNS1QAMUaoiI1Avbth3l5ps/JS/PTp8+rZg797oG/aG+w+Fg/o/zefzjxzmWcwyTycQD3R/gxb4vEuAd4Ory5DR2pe5i1i+zmP/7fDILMgEI9AxkxEUjeODiB4gJjCE/H9asKRmNER9feh/R0SVTSl1zDfj4uOBARERERERERBqYMwk26mKgAQo1RETqvEOHsoiL+5hjx/Lp3DmEDz7og9VqdnVZNeavg38x8t2R/LjzRwA6RXVi3t3zuKTlJS6uTE7FMAy+2fsNM9bPYGn8UgwMANqHtGf0JaMZcsEQjiX78MVHzhDjq68gK6tke4sFunUrmVaqQwdNNSAiIiIiIiJSEyoTbNTVQAMUaoiI1GlpaXnExX1MQkImbdsG8dZb3fH2bphNsXMLcnlx+YtMWTUFm92Gt7s3L9zyAqOvHY3Vov9d1VW5hbm8t/k9ZqyfwebkzcXL42LjeLDLQ/gmX8fKT81cMQL++KP0tk2blozGuO46ZwNJEREREREREal5pwo26nKgAQo1RETqrPx8G7fe+hmbN6cQHu7DF1/0w9s7//Qb1kOrtqzin+/9k91HdgNw0wU3MfuO2UQ3iXZxZVKRQ5mHeH3D68zbOI+UnBQAvN28ua3tPbRLG82mpe25cxSkpZVsYzJB164lQcaFF4K54Q46EhEREREREanTygs2DMOo04EGKNQQEamTHA6DIUO+YO3a/fj5ufPFF/1p0SKA5ORkV5dWrZLSkxj74Vje/+V9AJoHNmfWHbPoe2HfBt0zpD77Pfl33vnxHT7a+hE2hw2AcM9oOuY9yNHlw3lrfBCGUbJ+UBDExTlDjLg4CAlxUeEiIiIiIiIiUsaJwcaBYwfIt+XX6UADFGqIiNQ5hmHw8MPf8OGH8bi5mVmypC+dOoXhcDhcXVq1cTgcvPHdG4xbPI703HTMJjMPXvMgL/R9AT9PP1eXJycptBeyeNtiZqyfwU8HfipeHpbXjby1D5H0yy0kOUreUnTqVNIb45JLwKp3GyIiIiIiIiJ1VlGw8dLyl2ji26ROBxqgUENEpM759783MHPmbwC8/XZvrrmmYU3BtPnAZka+O5Kfdjk/HL8o+iLeGPIGnWM6u7gyOdnRnKP857f/8NqG1ziQcQAAk8MNtgzC+GkMyYnO18zPz9kTo2g0RvPmrqxaRERERERERM5U3wv7EuIbQqhfKO3C27m6nFNSqCEiUoe8885fPPHEdwC8+mp3Bg1q7+KKqk92fjbPL32eV796FZvdhq+HLy/2fZEHejygRuB1zF/Jf/HKjzNZtPkdCoxc58KsMPj1foxf74OscM45B3oPdgYZ3bqBu7traxYRERERERGRqunWppurS6gUfYokIlJHfPnlXv7xj1UAPPJIFx5+uIuLK6o+Kzav4IFFD7D36F4Abr3wVmYOmklkcKRrC5NiDsPBf9d+wSvrZrDDtrrkjsRO8PNDeOwcxDVXuXPV0xkMHOigdWt1+BYRERERERGR2qdQQ0SkDti4MYl+/T7DZnMwePA5TJlytatLqhaH0g7x0AcP8dHGjwCICo5i9h2zubnTzS6uTADy8mDl11lMX7uQdfaZFPr/7bzDYYbtfQlPGEP/LlfSZ5KJ7t3Bw8NBcnIuYWHqeyIiIiIiIiIirqFQQ0TExXbtSqN378VkZxfSs2cMCxbEYTabXF1WldgdduZ+O5enPn2KjNwMzCYzD/V8iIk3T8TX09fV5TVq+/bBihXw8Vd7+C5/NraOb4JPuvPOvACiU/6Pu9uN4q6JLWjXDkwn/FNsQL3qRURERERERKSeUqghIuJCycnZxMV9THJyDp06hfHJJzfj7m5xdVlVsilhEyPfHckve34B4OIWFzPv7nlcGH2hiytrnAoL4ccfnUHG8hUGW7O+g0tnwHmfgdmZUgQUtuW2FqOZeOs9NGui0ElERERERERE6i6FGiIiLpKVVUCfPovZuTONFi38+eKL/vj7e7i6rLOWlZfFc0ufY/pX07E77Ph5+vHyrS9zf/f7sZjrd1BT3yQmwsqVziDjyy8hIycPzvsAus2AZpuK17ss7HqevnYMN7SJw2xSjwwRERERERERqfsUaoiIuEBhoZ2BAz/n118PExLixapVAwgP93F1WWdt6R9LGfXeKBJSEwAY0HkAMwbNICIwwsWVNQ52O2zYcHw0xnL47bfjd/gmQZc5mC6Zg+F9BAAvqxdDLhjC6K6j6RDawXVFi4iIiIiIiIicBYUaIiK1zDAMRoz4kpUr9+LtbWXZsn60bRvs6rLOysFjBxn9wWgW/7YYgJgmMbw2+DX6nN/HxZU1fEePwqpVziBj5Urn7WLNNtKkzwyONf8Ah6kQA4j0j2TUxaMY0XkEwV7189+biIiIiIiIiIhCDRGRWvb00z/w1lt/YbGY+PDDm+jatZmrSzpjdoed1755jfFLxpOZl4nFbGHsdWOZcNMEfDzq74iTuswwYNMmZ4ixYgX8/HPpxt3+gTbO7b+Eo7Ez2JH/A0UZx+VRlzOm6xhubX8rbhY3V5QuIiIiIlJlQ4cO5a233gLAarUSGRnJwIEDef755/H09GTv3r288MILfP311yQlJREREcFdd93F008/jbu7u4urFxGR6qRQQ0SkFs2e/RuTJq0H4I03rqdPn9YurujM/bbvN0a+M5Jf9/0KQNeWXZl39zwuiLrAxZU1PBkZ8NVXJUFGYmLp+zt2hGt6HyP/vP+y4shsfspIgHywmq3cfu7tjOk6houbX+ya4kVEREREqllcXBwLFiygsLCQjRs3cs8992AymZg8eTLbt2/H4XAwb948YmNj2bJlCyNGjCA7O5upU6e6unQREalGCjVERGrJxx/HM3r01wC88MIV/OMfHV1c0ZnJzMvk2c+eZeaamTgMBwFeAfyr37+496p7MZvVZLo6GAZs3+7si7FiBXz/PdhsJfd7e0PPntC7N7S5bDsf75/Jf/54i5xdOQCEeIdwX+f7uP/i+4nwUz8TEREREWlYPDw8CA8PByAqKoqePXuyevVqJk+eTFxcHHFxccXrtmrVivj4eObMmaNQQ0SkgVGoISJSC777bj933bUCw4D77ruAp5++1NUlnZElvy/hwfcf5MCxAwDcfvHtTLttGs0C69/UWXVNTg58803JaIy9e0vf36aNM8To0weu6Obgu4NfMmP9DFZ+urJ4nfObns+YrmMY3HEwnlbP2j0AEREREZEzVFAAGzY4L+jZvt05Itluh4AAaN/e+R740kuhSZOK97FlyxbWrVtHTExMheukp6cTHKx+ciIiDY1CDRGRGrZ58xFuvnkJ+fl2+vaNZfbsazGZTK4uq1L2p+7nwfcf5LNNnwHQMqQlr9/5OnHnxZ1mSzmV3btLQoxvvoG8vJL73N2he3dniHHDDc4TuuyCbN7+420efHMG8UfjATBh4uZ2NzOm6xi6t+heb/5NiYiIiEjjlZ0Nn3zi/Nq9u2RUsrs7mEzO299+6/y5SROIi4M77oBWrZzrLVu2DF9fX2w2G/n5+ZjNZmbPnl3uY+3cuZNZs2ZplIaISAOkUENEpAbt35/BDTd8Qnp6Pldc0Zz33uuDxVL3p2qy2W3M+noWz3z2DNn52VgtVh67/jHG9xmPt4e3q8urdwoKnFNJFU0rFR9f+v6oKGeI0bs3XHMN+Bzvtb4vbR+Pr36N//z2H9Ly0gDwc/dj+IXDGXXJKFoH17+eLCIiIiLSOG3cCFOmwJ9/gpsbNG0KXl7lr2u3Q0oKvP02fPEF3HcfOBzQo0cP5syZQ3Z2NtOmTcNqtdK/f/8y2x88eJC4uDgGDhzIiBEjavjIRESktinUEBGpIampucTFfcLBg1mcc04wn3/eFy8vN1eXdVob9mxg5Lsj+T3hdwAub3058+6ex3nNz3NxZfXLwYMlozG++gqyskrus1igW7eSaaU6dHBejQZgGAY/JPzIjPUzWLxtMQ7DAUDroNaM6TqGoZ2G4ufh54IjEhERERE5O0uWwKRJkJ4O0dHg4XHq9S0WZ+gRGuqcmmrSJOf75ZYtfYiNjQVg/vz5XHDBBbz55psMHz68eNtDhw7Ro0cPLr/8ct54440aPCoREXEVhRoiIjUgN7eQW25ZwtatR2ne3JeVKwcQHFzBZUh1REZuBuOXjGf2N7MxDINA70Cm9J/C8G7D1Qi8Emw2+PnnkiDjjz9K39+0qTPE6N3b2ew7MLD0/fm2fD7860Omr5/Ob4m/FS+/tuW1PHTpQ/Ru0xuzSa+DiIiIiNQvy5bBiy86R1/ExpZczFMZZjM0bw6ZmfD775CfD4WFzpEeZrOZp556irFjxzJ48GC8vLw4ePAgPXr0oHPnzixYsEDnMSIiDZRCDRGRama3Oxg8eDk//HCQgAAPVq7sT3S0v6vLqpBhGCz+bTGjPxjNobRDANzZ9U5eue0Vmvo3dXF1dduRI7BypXNaqVWrIC2t5D6TCbp2LQkyLrzQeVJ2suTsZOb+OpfXN7zO4ezDAHhaPbmr412M7jqajk071s7BiIiIiIhUs927nVNOFRQ4R2icbRs4Pz/nVFWHD8MHH8DddzuXDxw4kMcee4zXXnuNO+64g+7duxMTE8PUqVM5cuRI8fbh4eHVcDQiIlJXKNQQEalGhmHw4INrWLJkJ+7uFj77rC/nnRfq6rIqtO/oPka9N4plfy4DoHVoa+bcNYfrOlzn4srqJofDORdw0WiMDRvAMEruDwpyNjPs3Rt69XIOl6/I74m/M2P9DN7f8j4F9gIAIvwieODiB7i3872EeIfU8NGIiIiIiNQcmw3+9S9ITobWrc8+0CjiHJ0B8+bBZZc5R31YrVZGjRrFlClT8PLyYufOnezcuZPIyMhS2xonvmkXEZF6T6GGiEg1evnl9cyZ8wcmEyxa1Jurr45ydUnlKrQVMmPNDCZ8PoGcghzcLG48EfcET/V+Ci/3uj1NVm1LS4Mvv3SGGF984TwpO1GnTiW9MS65BKyn+D+r3WHn8/jPmb5+Ot/t+654edfmXRnTdQwDOgzAzVL3+66IiIiIiJzOTz85v5o1K3/E8tlIT/+MH3800a6dlejoSAYOHMjzzz/PuHHj2Lt3L7/99htff/01SUlJREREcNddd/H0009Xz4OLiEidoVBDRKSazJ+/mfHjfwBg5sxrGDCgnYsrKt/Pu35m5Lsj+fPAnwBc2eZK5t09j3OanePiymqO3Q7ffgvx8Z60awdXX+1sPlgew4AtW0pGY/z4o3P7In5+cN11ziAjLs45x+/ppOWlMf/3+cz6ZRZ70/YCYDVbGdBhAGO6juHSyEurfpAiIiIiInXI5587+1/4+lbfPkND42jefAEWSyEPPriR0aPvwWQyMXnyZLZv347D4WDevHnExsayZcsWRowYQXZ2NlOnTq2+IkRExOUadMek1157jRYtWuDp6UnXrl355ZdfKrXdBx98gMlkom/fvqWWDx06FJPJVOorLi6uBioXkfpm+fJd3HvvlwCMG3cJo0Zd5OKKykrPSeeBRQ9w+eTL+fPAnwT7BPPmPW+y9tG1DTrQWLwYWrSAa681889/BnLttWZatHAuL5KV5TzpGjnSOdfv+efDuHHw3XfOQOOcc+CRR2DNGkhJgU8+geHDTx9o7Di6gwdXPEjkq5E88uUj7E3bSxOvJjzV7Sn2jtnL+/3fV6AhIuJiOmcQEal+aWnwww/O6Vmrk9nsQbNm4eTkRBEY2JeePXuyevVqAOLi4liwYAHXX389rVq14uabb+bRRx9l8Ylv/EVEpEFosCM1/ve//zF27Fjmzp1L165dmT59Or169SI+Pp6wsLAKt9u7dy+PPvooV155Zbn3F/1PsoiHh0e11y4i9cv69YncdttS7HaDIUM68PLL5f/9cBXDMPjo148Y878xJKUnATDksiFMHTiVUL+62++jOixeDAMGlO57AXDwoHP50KFw4IBzFEdBQcn9np5wzTUlTb5btqz8YxqGwVe7v2L6+ums+HtF8fJzQ8/loUsf4s6Od+Llpim+RETqAp0ziIjUjL//hmO2Q4Q0yyXbvXr2abNkYrdnk+e9i3wf+OK7faxbt46YmJgKt0lPTyc4OLh6ChARkTqjwYYar776KiNGjGDYsGEAzJ07l+XLlzN//nzGjRtX7jZ2u50777yTiRMn8v3335OWllZmHQ8PD8LDwytVQ35+Pvn5+cW3MzIyAHA4HDgcjjM8oqpzOBwYhuGSx24o9BxWTUN8/nbsOEafPp+Qk2OjV68WvPHGdRiGUSON6M7m+duTsocH3nuAVX+tAqBNWBtev/N1rml/TfE+Gyq7HcaMMR0PNEp3JSx6eU74vImWLQ1694YbbjDo3h28TsgdKvM05RTm8O7md5m1fhZbU7bifFQTvdv0ZkzXMVzT4hpMx7sj1tfnvSH+DtcmPX9Vo+evaurC81cXX7u6cM4Ade+8oTGrC78rUrv0mteMjTsSOdD1Tg57Z1bbPrO376VwayrffN4WHAbzfjUwm83MnDmz3Ndv586dzJo1iylTppS6X69546LXu/HRa16/VfZ1a5ChRkFBARs3buTJJ58sXmY2m+nZsyc//fRThds9//zzhIWFMXz4cL7//vty11m7di1hYWEEBQVxzTXX8OKLL9KkSZNy1500aRITJ04ss/zIkSPk5eWd4VFVncPhID09HcNw/o9fzpyew6ppaM9fcnIuN964kqNH87jggmBee60rx44drbHHO5Pnr9BeyLwf5/HK2lfIK8zD3eLOg1c9yKgrR+Hp5knyyd2uG6B169w5cOD0V2Xdc082w4fnEBtr53jmQGam86syDmYdZOFfC1m0bRHH8o8B4OPmw6B2gxh+3nBaBjiHeRw5cuSsjqMuaWi/w7VNz1/V6Pmrmrrw/GVW9g9rLakr5wxQ984bGrO68LsitUuvec2w25I5PywcD7coTI7qGaqxzT2D/FaetL35cvLzcklc/xeXterElVdeWeb8JjExkX79+nHjjTdyyy23lLpfr3njote78dFrXr9V9pyhQYYaKSkp2O12mjZtWmp506ZN2b59e7nb/PDDD7z55pts2rSpwv3GxcXRr18/WrZsya5du3jqqae44YYb+Omnn7CU03H2ySefZOzYscW3MzIyiIqKIjQ0FH9//7M7uCpwOByYTCZCQ0P1S32W9BxWTUN6/jIy8hk69Ev278+mdesAVq68jbAw7xp9zMo+f+t2reP+d+9ny6EtAHRv253X73ydduF1s3F5TcnNrdx6113nxRVXnNl0UIZh8PPBn5mxfgaLty3Gbjg7ibcMbMmDlzzI0AuGEuAZcKYl13kN6XfYFfT8VY2ev6qpC8+fp6enSx63InXlnAHq3nlDY1YXflekduk1rxk5hVlsSv0bH0sgVsOnWvaZlp+HgZ195JNjycXSM4itS7eydOlShg8fXrzeoUOHuP322+nWrRsLFiwo87rqNW9c9Ho3PnrN67fKnjM0yFDjTGVmZnL33Xfzn//8h5CQkArXGzRoUPHPHTt25Pzzz6d169asXbuWa6+9tsz6Hh4e5c6fazabXfZLZTKZXPr4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", "text/plain": [ "

" ] @@ -3532,614 +11951,125 @@ "==== Performance Summary ====\n", "\n", "Memory Usage Comparison:\n", - " 4-bit Avg: 57698.24 MB\n", - " 8-bit Avg: 92521.30 MB\n", - " Difference: 60.4% more memory with 8-bit\n", + " 4-bit Avg: 55770.34 MB\n", + " 8-bit Avg: 57204.05 MB\n", + " Difference: 2.6% more memory with 8-bit\n", "\n", "Evaluation Loss Comparison:\n", - " 4-bit Avg: 0.3080\n", - " 8-bit Avg: 0.3035\n", - " Difference: 1.4% lower loss with 8-bit\n", + " 4-bit Avg: 0.4618\n", + " 8-bit Avg: 0.4909\n", + " Difference: 6.3% higher loss with 8-bit\n", "\n", - "Efficiency Analysis: 4-bit provides better memory efficiency with lower loss\n" + "Efficiency Analysis: 8-bit provides more efficiency memory usage relative to loss\n" ] } ], "source": [ - "# Plot memory metrics comparison between 4-bit and 8-bit\n", - "print(\"\\n==== Memory Usage Comparison: 4-bit vs 8-bit ====\\n\")\n", + "# Visualize memory usage across quantization methods\n", "plot_memory_metrics(flflow_4bit, flflow_8bit)" ] }, - { - "cell_type": "markdown", - "id": "19dfbe72", - "metadata": {}, - "source": [ - "## Analysis and Conclusions" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "5da1c53e", - "metadata": {}, - "outputs": [], - "source": [ - "# Utility functions to monitor GPU memory usage\n", - "def get_gpu_memory_info():\n", - " \"\"\"Get current GPU memory usage in MB\"\"\"\n", - " if torch.cuda.is_available():\n", - " # Get the current device\n", - " device = torch.cuda.current_device()\n", - " # Get memory information\n", - " total_memory = torch.cuda.get_device_properties(device).total_memory / 1024**2 # MB\n", - " allocated_memory = torch.cuda.memory_allocated(device) / 1024**2 # MB\n", - " reserved_memory = torch.cuda.memory_reserved(device) / 1024**2 # MB\n", - " free_memory = total_memory - allocated_memory\n", - " \n", - " return {\n", - " \"device\": device,\n", - " \"total_memory_mb\": total_memory,\n", - " \"allocated_memory_mb\": allocated_memory,\n", - " \"reserved_memory_mb\": reserved_memory,\n", - " \"free_memory_mb\": free_memory\n", - " }\n", - " else:\n", - " return {\"device\": \"cpu\", \"error\": \"CUDA not available\"}\n", - "\n", - "class MemoryTracker:\n", - " \"\"\"Track memory usage across training phases\"\"\"\n", - " def __init__(self, collaborator_name, quant_type=\"4bit\"):\n", - " self.collaborator_name = collaborator_name\n", - " self.quant_type = quant_type # Track whether this is 4bit or 8bit\n", - " self.memory_log = {\n", - " \"model_load\": None,\n", - " \"after_trainer_init\": None,\n", - " \"before_training\": None,\n", - " \"after_training\": None,\n", - " \"peak_memory\": None\n", - " }\n", - " self.peak_memory = 0\n", - " self.reset_peak()\n", - " \n", - " def update_peak(self):\n", - " \"\"\"Update peak memory usage\"\"\"\n", - " if torch.cuda.is_available():\n", - " self.peak_memory = torch.cuda.max_memory_allocated() / 1024**2 # MB\n", - " self.memory_log[\"peak_memory\"] = self.peak_memory\n", - " \n", - " def log_memory(self, phase):\n", - " \"\"\"Log memory usage at a specific phase\"\"\"\n", - " if phase in self.memory_log:\n", - " self.memory_log[phase] = get_gpu_memory_info()[\"allocated_memory_mb\"] if torch.cuda.is_available() else 0\n", - " self.update_peak()\n", - " \n", - " def reset_peak(self):\n", - " \"\"\"Reset peak memory stats\"\"\"\n", - " if torch.cuda.is_available():\n", - " torch.cuda.reset_peak_memory_stats()\n", - " \n", - " def report(self):\n", - " \"\"\"Print memory usage report\"\"\"\n", - " print(f\"\\n==== Memory Usage Report for {self.collaborator_name} ====\")\n", - " for phase, memory in self.memory_log.items():\n", - " if memory is not None:\n", - " print(f\"{phase}: {memory:.2f} MB\")\n", - " else:\n", - " print(f\"{phase}: Not measured\")\n", - " print(f\"Quantization type: {self.quant_type}\")\n", - " print(\"=\"*50)\n", - " \n", - " def get_stats(self):\n", - " \"\"\"Get all stats in a dictionary format for aggregation\"\"\"\n", - " stats = {k: v for k, v in self.memory_log.items()}\n", - " stats[\"training_loss\"] = self.training_loss\n", - " stats[\"eval_loss\"] = self.eval_loss\n", - " stats[\"quant_type\"] = self.quant_type\n", - " return stats" - ] - }, - { - "cell_type": "markdown", - "id": "78f47784", - "metadata": {}, - "source": [ - "## Memory and Loss Monitoring Utilities" - ] - }, - { - "cell_type": "markdown", - "id": "805feb3c", - "metadata": {}, - "source": [ - "## Visualization Functions" - ] - }, { "cell_type": "code", "execution_count": 17, - "id": "cf20ad92", - "metadata": {}, - "outputs": [], - "source": [ - "def plot_loss_metrics(flow_4bit, flow_8bit):\n", - " \"\"\"Plot and compare loss metrics between 4-bit and 8-bit quantization.\"\"\"\n", - " try:\n", - " import matplotlib.pyplot as plt\n", - " import pandas as pd\n", - " \n", - " # Create figure with two subplots\n", - " fig, axs = plt.subplots(1, 2, figsize=(16, 6))\n", - " fig.suptitle('Training and Evaluation Loss: 4-bit vs 8-bit Quantization', fontsize=16)\n", - " \n", - " # Prepare data\n", - " rounds = list(range(1, len(flow_4bit.average_loss_history) + 1))\n", - " \n", - " # Plot training loss\n", - " axs[0].set_title('Training Loss by Round')\n", - " axs[0].plot(rounds, flow_4bit.average_loss_history, 'o-', label='4-bit', color='blue')\n", - " axs[0].plot(rounds, flow_8bit.average_loss_history, 's-', label='8-bit', color='red')\n", - " axs[0].set_xlabel('Round')\n", - " axs[0].set_ylabel('Average Training Loss')\n", - " axs[0].legend()\n", - " axs[0].grid(True, alpha=0.3)\n", - " \n", - " # Plot evaluation loss\n", - " axs[1].set_title('Evaluation Loss by Round')\n", - " axs[1].plot(rounds, flow_4bit.local_model_loss_history, 'o-', label='4-bit (Local)', color='blue')\n", - " axs[1].plot(rounds, flow_8bit.local_model_loss_history, 's-', label='8-bit (Local)', color='red')\n", - " axs[1].plot(rounds, flow_4bit.agg_model_loss_history, 'o--', label='4-bit (Agg)', color='lightblue')\n", - " axs[1].plot(rounds, flow_8bit.agg_model_loss_history, 's--', label='8-bit (Agg)', color='salmon')\n", - " axs[1].set_xlabel('Round')\n", - " axs[1].set_ylabel('Evaluation Loss')\n", - " axs[1].legend()\n", - " axs[1].grid(True, alpha=0.3)\n", - " \n", - " plt.tight_layout()\n", - " plt.subplots_adjust(top=0.88)\n", - " plt.show()\n", - " \n", - " # Print textual summary\n", - " print(\"\\nLoss Metrics Summary:\")\n", - " print(f\"Final Training Loss: 4-bit = {flow_4bit.average_loss_history[-1]:.4f}, 8-bit = {flow_8bit.average_loss_history[-1]:.4f}\")\n", - " print(f\"Training Loss Difference: {abs(flow_4bit.average_loss_history[-1] - flow_8bit.average_loss_history[-1]):.4f}\")\n", - " \n", - " print(f\"\\nFinal Local Eval Loss: 4-bit = {flow_4bit.local_model_loss_history[-1]:.4f}, 8-bit = {flow_8bit.local_model_loss_history[-1]:.4f}\")\n", - " print(f\"Local Eval Loss Difference: {abs(flow_4bit.local_model_loss_history[-1] - flow_8bit.local_model_loss_history[-1]):.4f}\")\n", - " \n", - " print(f\"\\nFinal Aggregated Eval Loss: 4-bit = {flow_4bit.agg_model_loss_history[-1]:.4f}, 8-bit = {flow_8bit.agg_model_loss_history[-1]:.4f}\")\n", - " print(f\"Aggregated Eval Loss Difference: {abs(flow_4bit.agg_model_loss_history[-1] - flow_8bit.agg_model_loss_history[-1]):.4f}\")\n", - " \n", - " better_training = \"4-bit\" if flow_4bit.average_loss_history[-1] < flow_8bit.average_loss_history[-1] else \"8-bit\"\n", - " better_local = \"4-bit\" if flow_4bit.local_model_loss_history[-1] < flow_8bit.local_model_loss_history[-1] else \"8-bit\"\n", - " better_agg = \"4-bit\" if flow_4bit.agg_model_loss_history[-1] < flow_8bit.agg_model_loss_history[-1] else \"8-bit\"\n", - " \n", - " print(f\"\\nBest Training Performance: {better_training}\")\n", - " print(f\"Best Local Evaluation Performance: {better_local}\")\n", - " print(f\"Best Aggregated Evaluation Performance: {better_agg}\")\n", - " \n", - " except ImportError:\n", - " print(\"Plotting requires matplotlib and pandas. Install with: pip install matplotlib pandas\")\n", - " except Exception as e:\n", - " print(f\"Error plotting metrics: {str(e)}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "2668f39a-537e-4b4e-abfa-6b297e3aaa36", + "id": "63f3d4e1", "metadata": {}, "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdUAAASmCAYAAADI7kK9AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Xl4VOXd//HPmX0PWQmBkIQgirggggi4YEVFrdW674rdrHWrtWpr3arWpdUqVWvrr4pb3X1says+ikUFZREREFER2bOQdSaTyezz+yMyD5EgAZNMMnm/ritXmTn3OfOdyeT4PJ9zn+9tpFKplAAAAAAAAAAAwE6ZMl0AAAAAAAAAAAD9BaE6AAAAAAAAAABdRKgOAAAAAAAAAEAXEaoDAAAAAAAAANBFhOoAAAAAAAAAAHQRoToAAAAAAAAAAF1EqA4AAAAAAAAAQBcRqgMAAAAAAAAA0EWE6gAAAAAAAAAAdBGhOgAAGLBmzZolwzDSP92hvLw8fbybb765W44JoHdsez6YNWtWpssBAABAH0WoDgAAetW2oXNXf+bOnZvpsrPKhRde2O0XE/qqSy+9dLvv08cff5zpsvqsr19o2vpjsViUn5+vgw8+WLfddpv8fn+mSwUAAAAyxpLpAgAAADJlwoQJ+v3vf9+tx7z++uvTgePkyZO79djYNZFIRM8888x2z8+aNUt/+MMfMlBR/5VIJNTY2KiFCxdq4cKFevrpp7Vo0SJ5vd5MlwYAAAD0OkJ1AADQq7YNnSWpqalJv/vd79KPjzrqKB199NEd9qmsrNzh8QKBgHw+327VMmbMGI0ZM2a39t2RH/3oR916POy+f/7zn2psbNzu+aefflp33nmnLJae/T+Fv813s6+4+OKLVVlZqYaGBj377LNat26dJOnTTz/VY489pssvvzyzBQIAAAAZQPsXAADQq370ox/p6quvTv98PYSePHlyh+2nnnqqhg8f3qEVzN/+9jeNGzdOTqdThx12mCRp7dq1uvLKK3XooYeqtLRUbrdbdrtdQ4cO1QknnKB//etf29XyTT3Vp06dmn7+wgsv1OrVq3XWWWepoKBADodD48aN0z/+8Y/tjrmjnupz587t8FpffvmlHnroIe23335yOBwqKirSD3/4QzU1NW13zFAopF/96lcaPny4HA6HxowZo4cfflhr167t1TY5c+bM0amnnqphw4bJbrfL5/Np3LhxuummmzoNr9evX6+f/OQn2mOPPeR0OuVwODR06FBNmTJFV111lVatWtVh/KxZszR16lQVFBTIarUqNzdXe+65p8444ww99NBDu1zvtj2xR40alf53TU2NZs+evcP9GhoadOutt+rggw9Wbm5u+nt0zDHH6Lnnnutw/G0//1AopOuvv14jRoyQ1WrVjTfemB7b1tamP/7xj5oyZYpyc3Nls9k0ePBgHXfccXr++ec7reOf//ynpk+frsGDB8tqtcrn86myslInnXSS7rjjDiWTyfTY+vp6XX311RozZozcbrdsNpuKi4t10EEH6dJLL9WCBQt2+fOTpDPOOENXX3217rjjDr322msdtn3yySed7vPSSy/p+OOPV3FxsWw2m3JzczV58mTdc889CoVCHcauW7fuG7/DX/87/Kb9nn32WU2cOFEul0u5ubk67bTTtHHjxu3qi8fjuvPOO7XHHnvIbrersrJSt912m2Kx2Dd+Ft39/QQAAEA/lgIAAMigtWvXpiSlf2666aZv3H7ooYd2eLz//vunUqlU6l//+leH5zv7ueWWWzoc+7HHHuuwfVuHH354+vn99tsv5fV6tzueYRipN998s8N+ZWVlnb6X//73vx32PeSQQzqt8bDDDutwvGg0ut173vpzwgkndHj83//+t0uf+QUXXLDD970jV1111Td+tkOHDk19/PHH6fG1tbWpwsLCb9znz3/+c3r8TTfd9I1jBw8e3KU6t6qqqkqZzeb0/n/9619TBxxwQPrxySef3Ol+ixYtShUXF++wjhNPPDE99uvfn6//nq644opUKpVKVVdXp8aMGfON7++UU05JxWKxHR67s5+2trZUKpVKtbW1pfbcc89vHHvttdd26XP7+utu+50KBAIdtl1//fUd9o3H46nTTz/9G+sYPXp0qqqqKr3P1/++v/4d3vbv8IILLtjhfjv6e9pjjz3Sn9NWZ555Zqdjjz/++A6PH3vssfQ+3f39BAAAQP9G+xcAANCvvPvuuyorK9Mpp5wil8ulLVu2SJIsFovGjh2r8ePHq7CwUD6fT62trZo/f77++9//SpJuvfVW/eAHP9DQoUN36TWXL1+u3Nxc/fznP1dbW5seeeQRJRIJpVIp/f73v9eRRx65y+9j3rx5OvLIIzV58mS98sorWrFihSTpnXfe0YIFC3TwwQdLku6//369++676f32228/nXjiiVq2bJn++c9/7vLr7o4nn3xS9957b/rxmDFj9P3vf19VVVV6/PHHlUgktHnzZp188slauXKlLBaLXnrpJdXV1UmScnNzNWPGDOXn56uqqkqffvpph/ckSX/+85/T/542bZqmTp2q1tZWbdy4UfPmzVNbW9su15xIJCRJVqtVp5xyipqamrR06VJJ0quvvqqGhgbl5+en92lpadH3vvc91dTUpJ/7zne+oylTpigQCGjevHnf+JrvvvuuJk6cqKOOOkqtra0aPny4JOmcc87RypUr0+NOPfVU7b333nrjjTf0/vvvS2qf3f273/0uPbt9289jwoQJ+u53v6t4PK6NGzdq4cKFHWb5//e//9Vnn30mSXI4HOnveE1Njb744gu9/fbbu/TZdaaxsVF33XVX+rFhGDrttNM6jPnd737XYdb9wQcfrKOPPlqrVq3SCy+8IElatWqVzjnnHL311lvfuqZtzZs3TxMmTNAxxxyj//73v5o/f74kafXq1XrllVd05plnSpJefPFFPfvss+n9Ro4cqdNPP12bN2/Wk08+ucPjd/f3EwAAAP0boToAAOhXKioq9OGHH2rQoEEdnp8+fbqmT5+uzz//XEuXLlVdXZ2sVquOO+44LVy4UKFQSPF4XG+99ZbOO++8XXpNwzA0Z84cHXDAAZLag8v77rtPkrR48eLdeh/f//739dJLL8kwDF155ZUqKipKh8CLFy9Oh+r/7//9v/Q+5eXlWrBggZxOpyTpwgsv1OOPP75br78r7rnnng41LF68OF3D+PHjdckll0iSPv/8c7366qs66aSTFA6H0/ucfvrpHY4hSa2trQoGg+nH245/8sknVVxc3GH8l19+uUs1b/u5HH300crLy9OZZ56p6667TqlUStFoVH//+9912WWXpcfNmjWrQ6B+++2369e//nWX6zj55JP1wgsvyGT6vw6LH330UYcA+ZprrkmH0zfeeKMOPfTQdLB+//336ze/+Y1MJlOHz2PmzJnp78NW69atk81mk9Txszv88MP1wAMPdBgbiURUX1+/w7q/yRFHHLHdc7m5ufrTn/6k/fffP/1cMplM/01I0qRJk/Tuu+/KbDZLkq699lrdfffdktovAnz00UcaO3bsbtXUmYMOOkjz5s2T1WpVLBbTsGHD0hfcFi9enA7Vt/17ysnJ0cKFC5WXlyepvUXQ9ddf3+nxu/v7CQAAgP6NnuoAAKBf+dnPfrZdoC61h4xTpkzRnnvuqTPPPFOXXXaZrr76av3yl7/s0Md506ZNu/yakyZNSgfqkrTnnnum/91ZD/Su+OlPf5ru456Xl6eCgoLtjhkMBtMzkCXptNNOS4fZkjRjxozdeu1dEQqFtHz58h3WcP7553cYvzUgnjJlSvr9/eUvf9GBBx6o8847T7fddptmz54ti8WiwYMHp/c79NBD0//eZ599dPzxx+vKK6/UI488oi+++EIjRozocs2LFi3q0O97a6A6fPhwTZo0Kf38Y4891mG/bWeie71eXXvttdsd+5vq+PWvf90hUJf+7/PY6oILLkj/22w269xzz00/bmxsTP++t/08ti7e+7Of/UwPPvigVqxYofLy8vRrTZgwQXa7XZL0+uuva8yYMTrrrLN000036ZVXXlE0Gt3luzO+yUUXXaTTTz+9w3OfffZZh7765557bjpQ//r7lrb/XL6tH/7wh7JarZLa70yoqKhIb9v2b/SDDz5I/3v69OnpQH1rzTvSnd9PAAAA9H/MVAcAAP3KXnvt1enzJ510kpYtW7bT/SORyC6/Znl5eYfHWwNMSUqlUrt8vJ0dc+sClM3NzR3GfH127Ncf94SmpqYO73HbIFyS3G63PB5Petb51gDzoIMO0r333qsbbrhBwWBQH374oT788MP0fgUFBXrhhRc0depUSe3tNU4//XQtWLBADQ0N+s9//tPhdU4//XQ988wz24XWndk2LHc6nTrxxBPTj8866yy99957kqSlS5dqxYoV2nfffSWpQyhcWlraIRTuis6+m19fwPXrn9/XH2/9/H73u9/pyy+/1GuvvaZgMKg33nhDb7zxRnrc4Ycfrn//+99yu90aNmyYZs2apcsuu0z19fX65JNPOlxU8Hg8euSRR9IXF3bFxRdfrKFDh+p///d/0y177rnnHjU0NHT4nHf3fX7d1/+euvr32pW/J6nj31RRUdE31rit7vx+AgAAoP/j/+oDAAD9itvt3u65zz77rEOgfvbZZ2vTpk1KJpNKpVIqLCz8Vq+5dQbsVltnYPf0MXNycjo83trOYqttW5X0lNzc3A611dbWdtj+9TYuubm56X9feeWVqq2t1Zw5czRz5kxddtll2mOPPSRJ9fX1HWYvl5aW6v3339fq1av19NNP6+abb9Ypp5wii6V9Dsjzzz/fpVY3kUikQ8/strY2+Xw+GYYhwzA6tHuROgbw285a3rhxY7odT1d19t3c9pjS9p/f1x9v/fx8Pp/+85//aOPGjXrhhRd0++2365xzzpHL5ZIkvf322+l2KlL7bPyqqirNmzdPf/7zn3XVVVel764IBoP6wQ9+0OH31FVnnHGGfvOb32ju3Lk69thj08/PmjWrQ1/83X2fXw+ht+1NnkwmtWbNmi7V2dW/0W3vcvn639PXa9xWd30/AQAAkB0I1QEAQL/X0NDQ4fGpp56qoUOHyjAMzZ07N71gZn/j9Xo7tJp5+eWXFY1G04+/3r6kJ7hcrg69s1944YUOwecTTzzRYfzkyZMlSVVVVaqtrZXL5dJ3vvMdXXbZZZo5c6aee+659NgNGzakf3fLli1TMpnUyJEjdfbZZ+umm27Siy++qOOOOy49ftuZ7jvyyiuvbDfD/5s8/fTTisfjkqRDDjkk/XxLS4t+//vfbzd+/fr1XT629H+fx1bbBq+JREJPPfVU+nFeXl769/3xxx+ne4Ofeuqp+vWvf62nnnpKP/zhD9Pjt34ejY2NWr9+vaxWq6ZMmaKLL75Y99xzj+bMmZMeGwqFOrQS2lUmk0kzZ87sMHt/66KqUntLpG2D9aeeeqrDRYmvB85bP5evt3JasGBB+t+PPPJIt//tjh8/Pv3v2bNnd5hhv+3v4uu66/sJAACA7ED7FwAA0O+NHDlSJpMp3ebhiiuu0EcffbRdi4r+6Ec/+pGuvvpqSdLq1as1adIkffe739WyZcv0j3/8o1teY9ugcVs//vGP9eMf/1i/+MUv0ou7rlu3ThMmTND3v/99VVVVdQhLR40apeOPP16S9M477+icc87RIYccotGjR6ukpESJREIvv/xyerzNZkvPvD7jjDPk9/t1xBFHaOjQocrLy9OaNWs6tNnorJf+1237+3a73frud7+73Zja2lrNnTtXUvts5X//+9868cQTdeGFF+r2229Pz1j+1a9+pTlz5mjSpEkKhUJasGCBCgoK9Morr+y0jq32339/HXnkkemA++6779aXX36pMWPG6H//93879Ba/4oor0jO3r776ai1atEhHHnmkSktLVVhYqKqqqg7vb+vn8fnnn2vSpEmaMGGC9t9/f5WUlMhisWj27NkdaunK5/dNRo4cqTPOOEN///vfJUlz587Ve++9p8mTJ8tkMunnP/+5brjhBkntPdMPOeQQHX300fr000/1/PPPp49zxBFHpC/U+Hw+jRo1Sp9//rmk9sVhly5dqra2tg4LvHaXH/zgB3r99dclSX6/XxMnTtQZZ5yhTZs26cknn9zhft31/QQAAEB2IFQHAAD9XlFRkX784x/r4YcfltTeuuO3v/2tJOnII4/Up59+qs2bN2eyxN12+eWX6x//+Ee61ca2vcmPPfZYvfbaa+mxu9vPecmSJZ0+X1VVJal9AcelS5fq3nvvlSStXLlSK1eu7DC2pKREL7/8crodhtTevuOdd97RO++80+nxL7300g6LntbU1OiZZ57pdGxeXl6HWdqd2bx5c4e+42eddZYeeeSR7ca1tLSouLg4vYDtrFmzdOKJJ8rr9epf//qXTjjhhHSw/uabb+rNN99M77ttf/aueuqpp3TkkUem+5y/+OKLevHFFzuMOeWUU/TrX/+6w3NNTU3bjdvK4XDo8ssv7/Dc4sWLtXjx4k7Hn3zyyaqsrNzl2r/uV7/6lZ555pl07/PbbrstHSz/6le/0vLly/XCCy9Iap91vu3Mc0kaPXr0djPCr7nmmvTvNplM6tVXX5XUviiszWbTp59++q3r3uq0007Taaedlq7xiy++0O233y5Jmjp1avpiS2e+7fcTAAAA2YP2LwAAICv86U9/0m9/+1uVlZXJarVq+PDh+uUvf6l//etfHYLe/sZqtWr27Nm69tprNWzYMNlsNu2555764x//qN/85jcdxvbkTNl77rlHb7zxhk455RSVlJTIarXK4/Fo7NixuuGGG7R8+XKNGTMmPf6QQw7R7bffruOPP16VlZXyer2yWCwqLCzUkUceqVmzZumee+5Jj7/jjjt08cUX68ADD1RxcbGsVqtcLpf22msvXXLJJVqyZInKysq+scYnn3yyw6KUF110UafjvF6vTj311PTjf//73+k2IxMmTNDKlSt1yy23aMKECfL5fLJYLCoqKtJ3vvOd3Vrss7i4WIsXL9Y999yjSZMmKScnJ/1ZTJ8+Xc8++6xefPHFDt/TX/7yl7riiit08MEHa+jQobLZbLLb7RoxYoQuuOACLVq0SBMmTJDU3nrlnnvu0cknn6xRo0YpJydHZrNZubm5mjJliu6///4Ofea/jX322UcnnHBC+vFrr72WvshjNpv1/PPP64UXXtBxxx2noqIiWSwW5eTkaOLEifr973+vxYsXq6SkpMMxf/CDH+iRRx7R6NGjZbPZVFxcrJ/+9KdatGjRNy4euruefvpp3X777RoxYoSsVqvKy8t1/fXXd7hA9XXd8f0EAABA9jBSW6eZAAAAoE9qa2vrMKN7q6uvvjodTHs8HjU0NMhms/V2eQAAAAAwoPTfaVsAAAADxBFHHKERI0bo0EMPVWlpqZqamjR79uwOrSh+8pOfEKgDAAAAQC9gpjoAAEAfN3bsWC1btmyH248//ni99NJLstvtvVgVAAAAAAxM9FQHAADo4y699FIdc8wxGjp0qBwOh+x2u4YNG6aTTjpJL774ol599VUCdQAAAADoJcxUBwAAAAAAAACgi5ipDgAAAAAAAABAFxGqAwAAAAAAAADQRZZMF5Atksmkqqqq5PV6ZRhGpssBAAAAAAAA+pRUKqWWlhaVlJTIZGKuL/ovQvVuUlVVpdLS0kyXAQAAAAAAAPRpGzdu1LBhwzJdBrDbCNW7idfrldR+UvD5fBmuBgAAAAAAAOhbAoGASktL0zka0F8RqneTrS1ffD4foToAAAAAAACwA7RORn9H8yIAAAAAAAAAALqIUB0AAAAAAAAAgC4iVAcAAAAAAAAAoIvoqQ4AAAAAAAAAGZRIJBSLxTJdxoBms9lkMnVtDjqhOgAAAAAAAABkQCqVUk1NjZqbmzNdyoBnMplUUVEhm82207GE6gAAAAAAAACQAVsD9aKiIrlcLhmGkemSBqRkMqmqqipVV1dr+PDhO/09EKoDAAAAAAAAQC9LJBLpQD0/Pz/T5Qx4hYWFqqqqUjwel9Vq/caxLFQKAAAAAAAAAL1saw91l8uV4UogKd32JZFI7HQsoToAAAAAAAAAZAgtX/qGXfk9EKoDAAAAAAAAANBFhOoAAAAAAAAAgN0yd+5cGYah5ubmHn2d8vJy3XfffT36Gl1FqA4AAAAAAAAAfdTGjRt10UUXqaSkRDabTWVlZbriiivU0NDQ67VMnTpVV155ZYfnJk+erOrqauXk5HTLa8yaNUuDBg3a7vnFixfrxz/+cbe8xrdFqA4AAAAAAAAAfdCXX36p8ePHa/Xq1XrmmWf0xRdf6OGHH9acOXM0adIkNTY2ZrpE2Ww2FRcX93hv+MLCwj6zqCuhOgAAAAAAAAD0QT/72c9ks9n0v//7vzr88MM1fPhwHXvssXrzzTe1efNmXX/99ZLaF9l85ZVXOuw7aNAgzZo1K/342muv1ahRo+RyuTRixAjdcMMNisVi6e0333yzxo4dqyeffFLl5eXKycnRmWeeqZaWFknShRdeqLffflv333+/DMOQYRhat27ddu1fpk6dmt6+7c+6deskSffee6/23Xdfud1ulZaW6pJLLlEwGJTU3kpmxowZ8vv96f1uvvlmSdu3f9mwYYNOPPFEeTwe+Xw+nX766aqtre3y+/k2CNUBAAAAAAAAoI9pbGzU66+/rksuuUROp7PDtuLiYp1zzjl67rnnlEqlunQ8r9erWbNm6ZNPPtH999+vRx55RH/84x87jFmzZo1eeeUVvfrqq3r11Vf19ttv684775Qk3X///Zo0aZJ+9KMfqbq6WtXV1SotLd3udV5++eX09urqap188snac889NXjwYEmSyWTSzJkztXLlSj3++ON66623dM0110hqbyVz3333yefzpfe/+uqrt3uNZDKpE088UY2NjXr77bf1xhtv6Msvv9QZZ5zR5ffzbVi+9REAAAAAAAAAAN1q9erVSqVSGj16dKfbR48eraamJtXV1XXpeL/5zW/S/y4vL9fVV1+tZ599Nh1oS+1h9axZs+T1eiVJ5513nubMmaPbb79dOTk5stlscrlcKi4u3uHr5OXlpf/9xz/+UW+99ZYWLlyYvjCwbU/28vJy3Xbbbbr44ov10EMPyWazKScnR4ZhfONrzJkzRytWrNDatWvTwf4TTzyhMWPGaPHixZowYcJO38+3QagOAAAAAAAAAH3Uzmai22y2Lh3nueee08yZM7VmzRoFg0HF43H5fL4OY8rLy9MBtCQNGTJEW7Zs2fWiJb322mu67rrr9K9//UujRo1KP//mm2/qjjvu0KeffqpAIKB4PK5wOKxQKNTlnumrVq1SaWlph5nye++9twYNGqRVq1alQ/XufD/bov0LAAAAAAAAAPQxI0eOlGEYWrVqVafbV61apcLCQg0aNEiGYWwXvm/bL/3999/XOeeco+OOO06vvvqqli5dquuvv17RaLTDPlartcNjwzCUTCZ3ufZPPvlEZ555pu68804dffTR6efXrVun7373u9pvv/300ksvacmSJXrwwQclabtaukN3vZ+vI1QHAAAAAAAAgD4mPz9fRx11lB566CG1tbV12FZTU6Onn35aF154oSSpsLBQ1dXV6e2rV69WKBRKP37vvfdUVlam66+/XuPHj9cee+yh9evX73JNNptNiUTiG8fU19frhBNO0CmnnKKf//znHbYtWbJEyWRS99xzjw4++GCNGjVKVVVVu/wao0eP1saNG7Vx48b0c5988omam5u199577+K72nWE6gAAAAAAAADQBz3wwAOKRCI65phj9M4772jjxo2aPXu2jjrqKI0aNUo33nijJOk73/mOHnjgAS1dulQffPCBLr744g6ztPfYYw9t2LBBzz77rNasWaOZM2fqf/7nf3a5nvLyci1cuFDr1q1TfX19p7O+TznlFLlcLt18882qqalJ/yQSCY0cOVKxWEx/+tOf9OWXX+rJJ5/Uww8/vN1rBINBzZkzR/X19R0uDmw1bdo07bvvvjrnnHP04YcfatGiRTr//PN1+OGHa/z48bv8vnYVoTq6pC2a0PqGVoVj33yVCAAAAAAAAED32GOPPbR48WKNGDFCp59+usrKynTsscdq1KhRmj9/vjwejyTpnnvuUWlpqQ499FCdffbZuvrqqzv0J//e976nn//857r00ks1duxYvffee7rhhht2uZ6rr75aZrNZe++9twoLC7Vhw4btxrzzzjv6+OOPVVZWpiFDhqR/Nm7cqP3331/33nuv7rrrLu2zzz56+umndccdd3TYf/Lkybr44ot1xhlnqLCwUHffffd2r2EYhv7xj38oNzdXhx12mKZNm6YRI0boueee2+X3tDuM1M463aNLAoGAcnJy5Pf7t2vwnw0aghEt3disQU6rKgs9ynV3bQEEAAAAAAAAQMr+/GxXhcNhrV27VhUVFXI4HF3e76abbtK9996rN954QwcffHAPVjiw7Mrvw9JLNSELJJIp+dtiWr6pWSMKPRo6yCmTych0WQAAAAAAAMCAccstt6i8vFwLFizQQQcdJJOJZiS9jVAdu6TI61CgLaZPqvwKhGMaUeCR02bOdFkAAAAAAADAgDFjxoxMlzCgEapjl/mcVjmsZm1sbFNLOK6RRR4VeOyZLgsAAAAAAAAAehz3BmC32CwmleQ4FIoktHxTs9bWBRVPbL/aLwAAAAAAAABkE0J17DbDMFTotctltejzLS1aWR1QMBLPdFkAAAAAAAAA0GNo/4JvzW23yGYxqbq5TcGv2sEUee0yDBYxBQAAAAAAAJBdmKmObmE1m1SS41Q8kdKKTX6t2RJUNE47GAAAAAAAAADZhVAd3cYwDOW5bfI5rFq9JaiVVX4FwrFMlwUAAAAAAAAA3aZfhuoPPvigysvL5XA4NHHiRC1atGiHY19++WWNHz9egwYNktvt1tixY/Xkk092GHPhhRfKMIwOP9OnT+/pt5G1nDazhuQ4VdcS0bKNzapqblMqlcp0WQAAAAAAAMCA1xZNqC2aUCyRTP8bu6bf9VR/7rnndNVVV+nhhx/WxIkTdd999+mYY47RZ599pqKiou3G5+Xl6frrr9dee+0lm82mV199VTNmzFBRUZGOOeaY9Ljp06frscceSz+22+298n6yldlkaEiOU82hqD7e7FegLabyArccVnOmSwMAAAAAAAAGnFA0rlA0ocfmrdXslTUKtMXlc1o0fUyxZhxSIZfNLJctM3GxYRj6n//5H5100kmdbl+3bp0qKiq0dOlSjR07tldr60y/m6l+77336kc/+pFmzJihvffeWw8//LBcLpceffTRTsdPnTpV3//+9zV69GhVVlbqiiuu0H777ad58+Z1GGe321VcXJz+yc3N7Y23k/UGuWzKddm0rqFVH2/2q6k1mumSAAAAAAAAgAElHEvor+98qYNuf1MPzl2jNXWtqgtGtKauVQ/OXaODbn9Tf33nS4VjPT9r/c4775RhGLryyiu7vE9paamqq6u1zz77SJLmzp0rwzDU3NzcM0XuRL8K1aPRqJYsWaJp06alnzOZTJo2bZref//9ne6fSqU0Z84cffbZZzrssMM6bJs7d66Kioq055576qc//akaGhq+8ViRSESBQKDDDzrnsLa3g/G3xbRsU7M2NrYqkaQdDAAAAAAAANDTQtG4Hn57je57c7V2FMklU9J9b67Ww2+vUSga77FaFi9erL/85S/ab7/9dmk/s9ms4uJiWSx9o/FKvwrV6+vrlUgkNHjw4A7PDx48WDU1NTvcz+/3y+PxyGaz6fjjj9ef/vQnHXXUUent06dP1xNPPKE5c+borrvu0ttvv61jjz1WicSOr8zccccdysnJSf+UlpZ++zeYxUyGoSKvQ1aTSSurAlpVHaBfEwAAAAAAALAbksmUGoKRnf74Q1GFIgnNnLO6S8edOWe1QtGE/KHoTo+d3MVJs8FgUOecc44eeeSRTruEVFdX69hjj5XT6dSIESP04osvpretW7dOhmHoo48+0rp163TEEUdIknJzc2UYhi688MJdquXb6hvRfg/zer366KOPFAwGNWfOHF111VUaMWKEpk6dKkk688wz02P33Xdf7bfffqqsrNTcuXN15JFHdnrMX/3qV7rqqqvSjwOBAMF6F/icVjmsZm1qalMwEtfIIo8KPPSvBwAAAAAAALqqKRTVgbe9udNxD5x1gFZWBXY4Q/3rkinp0XlrtfcQny59Zuk3jl3ym2nK34Vc72c/+5mOP/54TZs2Tbfddtt222+44Qbdeeeduv/++/Xkk0/qzDPP1IoVKzR69OgO40pLS/XSSy/plFNO0WeffSafzyen09nlOrpDvwrVCwoKZDabVVtb2+H52tpaFRcX73A/k8mkkSNHSpLGjh2rVatW6Y477kiH6l83YsQIFRQU6IsvvthhqG6321nMdDfZLCaV5DhUH4xq+aZmVeS7VZrnksXcr26cAAAAAAAAAPq0gyry9Mc3P9+lfV5fWaMLJpd3ax3PPvusPvzwQy1evHiHY0477TT98Ic/lCTdeuuteuONN/SnP/1JDz30UIdxZrNZeXl5kqSioiINGjSoW2vtin6VYtpsNh144IGaM2dO+rlkMqk5c+Zo0qRJXT5OMplUJBLZ4fZNmzapoaFBQ4YM+Vb1YscMw1Ch1y6X1aLPt7RoZVVAwUjP9WsCAAAAAAAABhq33aJA265lboFwXG57983F3rhxo6644go9/fTTcjgcOxz39Xx30qRJWrVqVbfV0Z361Ux1Sbrqqqt0wQUXaPz48TrooIN03333qbW1VTNmzJAknX/++Ro6dKjuuOMOSe29z8ePH6/KykpFIhH95z//0ZNPPqk///nPktp7+dxyyy065ZRTVFxcrDVr1uiaa67RyJEjdcwxx2TsfQ4UbrtFdotJNf5wuh1MkdcuwzAyXRoAAAAAAADQr7VG4vI5LaoL7niC8df5HBa1duPk1yVLlmjLli0aN25c+rlEIqF33nlHDzzwwDdOfu6r+l2ofsYZZ6iurk433nijampqNHbsWM2ePTu9eOmGDRtkMv3fBPzW1lZdcskl2rRpk5xOp/baay899dRTOuOMMyS13y6wfPlyPf7442publZJSYmOPvpo3XrrrbR36SUWs0lDchxqCsW0YpNf5fkuDc93y2bpVzdSAAAAAAAAAL0i12XTkt9M2+k4q9nQMWOK9dDcNV0+9vR9hshpNe30+LkuW5eOd+SRR2rFihUdnpsxY4b22msvXXvttTKbzZKkBQsW6Pzzz0+PWbBggQ444IBOj2mztb92IpHoUg3drd+F6pJ06aWX6tJLL+1029y5czs8vu222zptfL+V0+nU66+/3p3lYTcYhqE8t01t0YS+qGtVSySuEYUe5TitmS4NAAAAAAAA6FNMJqPLi4RedEiFHn57TZcWKzUZ0kVTyuVzdi0w7wqv16t99tmnw3Nut1v5+fkdnn/hhRc0fvx4HXLIIXr66ae1aNEi/e1vf+v0mGVlZTIMQ6+++qqOO+44OZ1OeTyebqt5Z5gKjD7FaTOr2OdQfTCi5ZuaVdXcplSqi8sTAwAAAAAAAOjAZTPr8iP36NLYK47cQ06buYcr6twtt9yiZ599Vvvtt5+eeOIJPfPMM9p77707HTt06FDdcsstuu666zR48OAdTsDuKUaKxLJbBAIB5eTkyO/3y+fzZbqcbtcQjOiD9U0qyXH22ms2h6JqiyU0PM+l8gK3HNbM/EEDAAAAAADg28v2/GxXhcNhrV27VhUVFd+4gGe3vFYsoYffXqOZc1Z3OmPdZEiXH7mHLj68csBmcLvy++iX7V8wMAxy2eSIJbSuob0dzMhCj3Ld3XfrCQAAAAAAADAQOKxm/fiwETrv4DI9Nn+dXvu4WoFwXD6HRcfuM0QzppTLaTMP2EB9VxGqo09zWM0akuNUXUtEyzY1a0SBW0NzXTKbjEyXBgAAAAAAAPQbLptFLptFPztipH52xEhZzIbiifZp65lq+dJfEaqjzzMZhgb7HGoJx/RJdUCBcFyVhR7+2AEAAAAAAIBdtG2mxsT03UOojn7D67DKYTVrU1ObgpG4RhZ5VNDFVY4BAAAAAAAAoDuYMl0AsCusZpNKchwKRRJavqlZa+uCiieSmS4LAAAAAAAAwABBqI5+xzAMFXrtclkt+nxLi1ZWBRSMxDNdFgAAAAAAAIABgPYv6LfcdovsFpNq/OF0O5gir12GwSKmAAAAAAAAAHoGM9XRr1nMJg3JcSieSGnFJr/WbAkqGqcdDAAAAAAAAICewUx19HuGYSjPbVNbNKEv6lrVEolrRKFHOU5rpksDAAAAAAAA+pZYW/v/mixS8quWylZn5urph5ipjqzhtJlV7HOoPhjRso3NqmpuUzKZynRZAAAAAAAAQOZFQ1JrnfTO76W/HCr9ce/2/33n9+3PR0MZK628vFz33XffN44xDEOvvPJKr9SzM4TqyCpmk6Fin1OGpI83+/V5bYvCsUSmywIAAAAAAAAyJ9YmvTdT+sMo6d17pPrVUnBL+/++e0/78+/NlGLhbn/pRCKhG264QRUVFXI6naqsrNStt96qVGrXJsNWV1fr2GOPlSStW7dOhmHoo48+6vZ6u4L2L8hKg1w2OWIJrWtobwczstCjXLct02UBAAAAAAAAvSsaag/M596x4zGp5P9tn3y5ZHN128vfdddd+vOf/6zHH39cY8aM0QcffKAZM2YoJydHl19+eZePU1xc3G01fVvMVEfWcljNGpLjlD8U07JNzdrQ0KoE7WAAAAAAAADQ3yWTUmv9zn/amqVoUHr7rq4d9+27pFhr+347O3Yy2aVDvvfeezrxxBN1/PHHq7y8XKeeeqqOPvpoLVq0qMO4lpYWnXXWWXK73Ro6dKgefPDBDtu3bf9SUVEhSTrggANkGIamTp3atffXTZipjqxmMgwN9jnUEo7pk+qAAuG4Kgs9ctrMmS4NAAAAAAAA2D1tjdLvK3c+7tTHpJrl7TPRuyKVlN5/SCreV3pxxjeP/eUayV2w00NOnjxZf/3rX/X5559r1KhRWrZsmebNm6d77723w7jf//73+vWvf61bbrlFr7/+uq644gqNGjVKRx111HbHXLRokQ466CC9+eabGjNmjGy23u1QQaiOAcHrsMphNWtTU5uCkbhGFnlU4LFnuiwAAAAAAACg55RNlub+btf2+fRf0sQfd1sJ1113nQKBgPbaay+ZzWYlEgndfvvtOuecczqMmzJliq677jpJ0qhRozR//nz98Y9/7DRULywslCTl5+dnpC0M7V8wYFjNJpXkONQWTWj5pmatrQsqnujiVToAAAAAAACgv7F7pLB/1/YJBySbp9tKeP755/X000/r73//uz788EM9/vjj+sMf/qDHH3+8w7hJkyZt93jVqlXdVkd3YqY6BhTDMFTgsas1EtfnW1ra28EUeeSx86cAAAAAAACALBMJSo4cKbil6/s4fO192LvJL3/5S1133XU688wzJUn77ruv1q9frzvuuEMXXHBBt71ObyJJxIDktltkt5hU4w+n28EU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opHr5cEHH9Q111yjsbExdXd3n7WxYW46fPiwBgYG9IMf/EC/9mu/dsL78PoFUxq5Xnj9gqP19vbqzjvv1Hve857jvsfcghc71fXC3AJJKhaLuuSSS/Tnf/7n+l//63/p4osv1l133XXC+zLHAHMTK9Uh13X1yCOP6Nprr63fZpqmrr32Wm3evPmEx2zevPmY+0vSddddd9L7o3WczvUixS8ali9frmXLlr3kyg20L+YWnI6LL75YixYt0mtf+1r95Cc/me3hYJZMTExIioOMk2GOwZRGrheJ1y+QgiDQ1772NZVKJW3YsOGE92FuwZRGrheJuQXS+973Pr3hDW84bu44EeYYYG4iVIeGh4cVBIEGBwePuX1wcPCkvbQHDhyY1v3ROk7nejnvvPP05S9/Wf/8z/+sv/3bv1UYhtq4caP27NlzNoaMeeRkc0s+n1elUpmlUWGuWrRokb74xS/qH//xH/WP//iPWrZsma6++mo9+uijsz00nGVhGOrmm2/WlVdeqQsvvPCk9+P1C6TGrxdev7S3LVu2KJfLKZlM6vd///f1zW9+Uy9/+ctPeF/mFkznemFuwde+9jU9+uijuuOOOxq6P3MMMDfZsz0AAK1vw4YNx6zU2Lhxo84//3x96Utf0v/8n/9zFkcGYD4777zzdN5559W/3rhxo7Zt26bPfvaz+pu/+ZtZHBnOtve973168skn9eMf/3i2h4J5oNHrhdcv7e28887TY489pomJCf3DP/yDbrzxRv3gBz84aVCK9jad64W5pb3t3r1bH/jAB/Td736XDWqBeY5QHerv75dlWTp48OAxtx88eFALFy484TELFy6c1v3ROk7nenmxRCKhV77ylXr++ednYoiYx042t3R2diqdTs/SqDCfrFu3jmC1zdx0003613/9V/3whz/U0qVLT3lfXr9gOtfLi/H6pb04jqPVq1dLki699FL9/Oc/1+c+9zl96UtfOu6+zC2YzvXyYswt7eWRRx7RoUOHdMkll9RvC4JAP/zhD3X33XerVqvJsqxjjmGOAeYm6l8gx3F06aWX6oEHHqjfFoahHnjggZP2wG3YsOGY+0vSd7/73VP2xqE1nM718mJBEGjLli1atGjRTA0T8xRzC87UY489xtzSJqIo0k033aRvfvOb+t73vqeVK1e+5DHMMe3rdK6XF+P1S3sLw1C1Wu2E32NuwYud6np5MeaW9vKa17xGW7Zs0WOPPVb/c9lll+kd73iHHnvsseMCdYk5BpirWKkOSdItt9yiG2+8UZdddpnWrVunu+66S6VSSe9+97slSTfccIOWLFlS7/z6wAc+oFe/+tX60z/9U73hDW/Q1772Nf3iF7/QX/7lX87mw8BZMt3r5ROf+ISuuOIKrV69WuPj47rzzjv1wgsv6L3vfe9sPgycBcVi8ZhVNzt27NBjjz2m3t5enXPOObr11lu1d+9e/d//+38lSb//+7+vu+++Wx/5yEf0n//zf9b3vvc9feMb39C3v/3t2XoIOIume73cddddWrlypS644AJVq1X99V//tb73ve/p3//932frIeAset/73qevfvWr+ud//md1dHTUe0W7urrqn2zh9QumnM71wuuX9nXrrbfq9a9/vc455xwVCgV99atf1YMPPqj77rtPEnMLjjXd64W5pb11dHQct59HNptVX19f/XbmGGB+IFSHJOltb3ubDh8+rI997GM6cOCALr74Yt177731zTB27dol0zzywYaNGzfqq1/9qv77f//v+uM//mOtWbNG3/rWt0652RNax3Svl7GxMf3e7/2eDhw4oJ6eHl166aV66KGH6KRsA7/4xS90zTXX1L++5ZZbJEk33nijNm3apP3792vXrl31769cuVLf/va39cEPflCf+9zntHTpUv31X/+1rrvuurM+dpx9071eXNfVhz70Ie3du1eZTEZr167V/ffff8w50Lr+4i/+QpJ09dVXH3P7V77yFb3rXe+SxOsXHHE61wuvX9rXoUOHdMMNN2j//v3q6urS2rVrdd999+m1r32tJOYWHGu61wtzC14KcwwwPxhRFEWzPQgAAAAAAAAAAOYDOtUBAAAAAAAAAGgQoToAAAAAAAAAAA0iVAcAAAAAAAAAoEGE6gAAAAAAAAAANIhQHQAAAAAAAACABhGqAwAAAAAAAADQIEJ1AAAAAAAAAAAaRKgOAAAAAAAAAECDCNUBAACAabr99ttlGMZsDwMAAADALCBUBwAAwKzYtGmTDMOo/7FtW0uWLNG73vUu7d27d7aHBwAAAAAnZM/2AAAAANDePvGJT2jlypWqVqv66U9/qk2bNunHP/6xnnzySaVSqdkeHgAAAAAcg1AdAAAAs+r1r3+9LrvsMknSe9/7XvX39+vTn/60/uVf/kVvfetbZ3l0AAAAAHAs6l8AAAAwp1x11VWSpG3bttVv+973vqerrrpK2WxW3d3detOb3qRnnnnmmOPe9a53acWKFced70T954Zh6KabbtK3vvUtXXjhhUomk7rgggt07733Hnf8j3/8Y11++eVKpVIaGhrSl770pSY8SgAAAADzFSvVAQAAMKfs3LlTktTT0yNJuv/++/X6179eq1at0u23365KpaI/+7M/05VXXqlHH330hEF6I3784x/rn/7pn/Rf/+t/VUdHhz7/+c/rLW95i3bt2qW+vj5J0pYtW/S6171OCxYs0O233y7f93XbbbdpcHCwGQ8VAAAAwDxEqA4AAIBZNTExoeHhYVWrVf3sZz/Txz/+cSWTSf3Wb/2WJOm//bf/pt7eXm3evFm9vb2SpOuvv16vfOUrddttt+mee+45rZ/7zDPP6Omnn9bQ0JAk6ZprrtFFF12kv/u7v9NNN90kSfrYxz6mKIr0ox/9SOecc44k6S1veYte8YpXnOnDBgAAADBPEaoDAABgVl177bXHfL1ixQr97d/+rZYuXar9+/frscce00c+8pF6oC5Ja9eu1Wtf+1r927/92xn93KlAfeqcnZ2d2r59uyQpCALdd999uv766+uBuiSdf/75uu66687oZwMAAACYv+hUBwAAwKz6whe+oO9+97v6h3/4B/3mb/6mhoeHlUwmJUkvvPCCJOm888477rjzzz9fw8PDKpVKp/Vzjw7Kp/T09GhsbEySdPjwYVUqFa1Zs+a4+51oPAAAAADaAyvVAQAAMKvWrVunyy67TFJc6/KqV71K//E//kc999xz0zrPizcjnRIEwQlvtyzrhLdHUTStnwsAAACgvbBSHQAAAHOGZVm64447tG/fPt19991avny5JJ0wYH/22WfV39+vbDYrKV5lPj4+ftz9pla7T9eCBQuUTqe1devW47433cAfAAAAQOsgVAcAAMCccvXVV2vdunW666671NPTo4svvlj33HPPMYH5k08+qX//93/Xb/7mb9ZvGxoa0sTEhJ544on6bfv379c3v/nN0xqHZVm67rrr9K1vfUu7du2q3/7MM8/ovvvuO61zAgAAAJj/CNUBAAAw5/y3//bfdPDgQW3atEl33nmnRkZGtGHDBn3mM5/R//yf/1O//uu/rq6uLt1+++31Y97+9rcrm83qt3/7t/W5z31Od9xxh9avX69zzz33tMfx8Y9/XJJ01VVX6dOf/rQ++clP6pprrtEFF1xwpg8RAAAAwDxFqA4AAIA5581vfrOGhob0mc98Rtdcc43uvfde9fX16WMf+5g+85nP6IorrtBPfvITrVy5sn5MX1+fvvnNbyqTyegjH/mI7rnnHt1xxx164xvfeNrjWLt2re677z4tWLBAH/vYx/TlL39ZH//4x/Xbv/3bzXiYAAAAAOYhI2InJgAAAAAAAAAAGsJKdQAAAAAAAAAAGkSoDgAAAAAAAABAgwjVAQAAAAAAAABoEKE6AAAAAAAAAAANIlQHAAAAAAAAAKBBhOoAAAAAAAAAADSIUB0AAAAAAAAAgAYRqgMAAAAAAAAA0CBCdQAAAAAAAAAAGkSoDgAAAAAAAABAgwjVAQAAAAAAAABoEKE6AAAAAAAAAAANIlQHAAAAAAAAAKBBhOoAAAAAAAAAADSIUB0AAAAAAAAAgAYRqgMAAAAAAAAA0CBCdQAAAAAAAAAAGkSoDgAAWtKDDz4owzDqf3bu3DnbQzqp+TRWAMe6+uqr6/923/Wud832cAAAAHAWEKoDAIDT9uIw+GR/2jloapXAfNOmTcc8jgcffHC2hzRj/uEf/uG4a/juu++e7WHNWTt37jzhv3vTNNXZ2akLL7xQN910k55//vnZHioAAADQFPZsDwAAAKDdDQ0N6c4776x/3dvbO4ujwVe+8pXjbtu0aZNuuummWRjN/BVFkQqFgp566ik99dRTuueee/SDH/xAl1xyyWwPDQAAADgjhOoAAKBp3va2t+myyy477vYLL7xwFkYzfyxbtkwf/vCHZ3sYkHTgwAHdd999x93+yCOP6Mknn5zxazmfz6uzs3NGf8ZMe+1rX6vXve51KpVK+u53v6uf/OQnkqRisaj/9b/+l/7pn/5plkcIAAAAnBnqXwAAQNP8xm/8hj784Q8f9+c3fuM3JEkPPPDAMfUQO3bsOOb4MAy1ePHi+vc/+clPSpJGR0f1kY98RK95zWu0YsUKdXR0yHEcDQ4O6rWvfa3+5m/+RlEUNTzOU3Ugv7jm5GgPPvig3vOe9+iSSy7RokWLlEwmlclktHr1ar373e/Wli1bjrm/YRi65pprjrlt5cqVx/3sl6qICYJAX/7yl/Wa17xG/f39SiQS6uvr0zXXXKO/+qu/ku/7x9z/xXUcDz74oL72ta9p/fr1ymQy6unp0e/8zu9o9+7dDT9np+tXv/qV/uAP/kDnnXeeMpmMMpmMzj33XP2X//Jf9Oyzzx53/1KppE984hO65JJL1NHRoUQioYGBAV188cX6vd/7Pd17773H3P9HP/qRfvu3f1tLliyR4zjK5XJasWKFXv/61+v222/XxMTEtMb7N3/zNwqCQJKUy+W0ePHi+vc2bdp00uN839eXv/xlve51r9Pg4KAcx9GCBQt0xRVX6OMf/3j9fif6u/k//+f/6JJLLlE6ndav/dqvHXPef/zHf9Qb3vAGLVy4UI7jqKenRxs3btSf/umfqlwuHzeOLVu26D/9p/+kFStWKJlMKp1O65xzztGv//qv69Zbb9XevXuPGfNdd92lDRs2qLu7W7Ztq6+vTxdccIFuuOEGfe1rX5vWczdl48aN+vCHP6zbbrtN3//+97V06dL6955++ukTHvPII4/ohhtu0MqVK5VKpZTL5XThhRfqQx/6kPbs2XPc/VesWFF/Dm+//fZjvnf77bfXv7dixYpTHvfII4/ot37rt9Td3a1MJqOrrrpKP/7xj084xm9+85tat26d0um0BgcH9Z73vEeHDh065XPR7OsTAAAAc0QEAABwmr7//e9Hkup/vvKVr5zy/mEYRsuXL6/f/0/+5E+O+f4DDzxQ/55pmtHu3bujKIqiLVu2HPNzTvTn3e9+9ynHtmPHjvr3Xv3qV9dvv/HGG4857itf+coxxx3tQx/60CnH4DhO9N3vfrd+/5ca89TPPtVYi8Vi9Gu/9munPM+rXvWqqFAo1I/ZsWPHcd8/0XFr1qyJKpXKKf/OTva8fP/733/JY77xjW9EqVTqpONOJpPR3/3d3x1zzNVXX33Kx/q2t72tft/7778/sizrlPd/5plnGnp8U17+8pfXj/2P//E/Rh/84AfrXw8ODkae5x13zMjISHT55ZefdAxdXV31+7747+aqq6465uuLLrooiqIo8n0/eutb33rKx3b++edH+/btq5/7qaeeijKZzCmP+c53vlO//4033njK+65fv76h5+zFj+m222475vuXXHJJ/XtXXnnlccd/9rOfjUzTPOXz9+Lr7eh55MU/77bbbqt/b/ny5Sc9bt26dVEikTjhdfn0008fc9xf/MVfnHBsK1euPOaaOXo+mYnrEwAAAHMD9S8AAKBp7r33Xg0PDx93+9ve9jYtW7ZMhmHoxhtv1Cc+8QlJ0le/+lXdeuut9ft99atfrf/3a1/72voKV9M0df7552vdunVauHChuru7Va1W9ctf/lL/7//9P0VRpK985Sv6/d//fa1bt27GHl82m9WrX/1qveIVr1Bvb6/S6bRGRkb07W9/W88884xc19X73//++mrcO++8U9u2bdMXv/jF+jn++I//WD09PZIaq8V5//vfrx/+8If1r1/3utdpw4YN+ulPf1qvKfnxj3+s97///fryl798wnP8+Mc/1uWXX67rrrtO3//+9+t1HFu3btW3vvUtvf3tbz+9J+QUnn/+eb3zne9UrVaTJPX19enGG2+UYRi65557NDw8rFqtphtvvFGXXnqp1qxZo2eeeaa+Aappmrrhhht07rnnanh4WDt27Dhuc9S//Mu/rK8qf9nLXqbf+Z3fkW3b2rVrlx577DE9+uij0xrzww8/fMxK6re//e0aHBzUZz/7WUnSwYMH9Z3vfEdvfOMbjznune98p37+85/Xvz7//PP1m7/5m0omk/rlL3+pn/3sZyf9mT/60Y+0fPlyveUtb1Emk6mvfP6TP/kTfeMb36jf74orrtDrXvc6PfPMM/r7v/97SdIzzzyjd7zjHfre974nSbrnnnvqq9eXLl2q//Sf/pOy2az27NmjJ598Uj/96U/r5ysWi/rbv/3b+tdvectbdMkll2hiYkIvvPCCfvCDH0zruTuRUqmkf/u3f9Pjjz9ev+2tb33rMff54Q9/qFtuuaX+SZNzzjlHv/u7v6tisaivfOUrKpfLmpiY0Fve8hY9//zz9X87zfDwww9r6dKlesc73qHdu3fX559arabPfe5z9X+3e/bs0Qc/+MH6cR0dHXrPe94j0zT15S9/+bhP3Exp9vUJAACAOWS2U30AADB/vXiF9cn+HL3KdPv27ZFhGPXvbdmyJYqiKKrValFPT0/99q9//evH/bwXXngh+od/+Ifo7rvvjj7zmc9Ed955Z7RkyZL6MZ/4xCdOOrZmrFSPoigKgiD62c9+Fm3atCm66667ojvvvDO65ZZbjjlm165dDY3jpe4zPDx8zErXt771rcccd/RKZsuyouHh4SiKjl85vG7dush13SiKosh13WhgYKD+vVtuueX4v9gTmO5K9Q984AP1+5qmWf97jqL4kwdHr0z+wAc+EEVR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0+lkwYIFXHDBBdxwww2sWLGi67k2TbNr4ct169aRSCSoqqritNNO4xvf+Aa/+tWv+Na3vtV1231ZDHLHjh08/vjjfX5sr7zyStfr7n3ve1+3bddddx25XK7bZZs3b+7zbYNdQ7J72Pz//t//6/YzsOfrYOfzt3HjRtrb2wmHw5x88slcfvnl3HHHHdx2221d++7+fLz66qsAzJ07l/POO4/vfe97/O1vf2PevHl5938vvva1rzF9+vSu8zfddBPRaLTH2MFe6Hj30Prvf/97V/XLnvvu/jP8wgsvdM1Wf/3117sdoOsPCxYs6Pq6oaGBJ598suv8s88+2+uBlP56fYqIiIjI8KNOdREREek3jz32GM3NzT0uD4fDXHjhhd0uW7ZsGT//+c+B7rN7d5+lDnbdQmlpaVcFw/e+9z0aGxvJ5XLcdddd76lq5cgjj+RPf/oTAO+++y5HHHEEM2fO5F//+leP8Hyn3fuWwQ73Tz75ZFavXs3vf//7Xu9r3Lhx3c5fcsklnHTSSbjdbj760Y9y8MEH93rdiooKzj//fH71q18Bdnjf3t7O4sWLee655/jHP/7Rte+5557b1fM9GC666CKKi4t7XD5//nzuvPNOLrnkEu644w7S6TSmabJ06VLOO+88HA4H9957b1e9htfr5ZJLLgHsmo1Zs2Yxe/ZsFi5cSG1tLYFAgP/85z9EIpGu+9gZqN5888385je/6er/HjNmDK2trfz617/use/e/PrXv+4WWp966qkEg8Fu+5imyUMPPdR1/u677+bmm29m7ty5nHLKKfztb38D7M71Qw89lFNOOQW/38+aNWt4+umn8/5c9MbpdHL55Zd3ha8rV67kfe97Hx/84AdZu3Ztt4M4xx9/PIceeigADzzwAN/5znc47rjjOOiggxg7dizxeLyrYmnP5+Ooo46itraWY445htraWkpKSnjttde6Hajqy/O3N263m2984xt84QtfAOzv8W233cZ///d/A3D55Zfzl7/8Bcuy6Ojo4Mgjj+TTn/40sViMu+66q+t2ysvLu60pcOSRR/LKK68AsGLFiq7H8sQTT3QdJOsv55xzDtdcc03Xe83HPvYxLrjgAhwOR7cx7qm/Xp8iIiIiMgwN0QKpIiIiMgr861//soB9niZNmjeT7hAAAQAASURBVJT3+jNnzuy2n9frtZqbm3vsd8MNN+S93Tlz5ljz58/vOn/eeef1OraNGzd2bWtoaLAqKip63J7T6bROOumkbpftlMlkrLlz5+Ydx3nnndft/L/+9a9u4z/88MPzXu+hhx7a51hjsZh17LHH7vX5Pfroo62Ojo6u62zcuHGv41m6dGne52xv7r777j59r5cuXdp1nQcffNDy+/297uvz+azf/e53XfvX1dXt8/YXLlxoZbNZy7Is66KLLtrrvk6n0/rTn/60z8c2Y8aMruscdNBBve53zDHHdO1XXV3dNY7m5mbryCOP7HUc4XC46zb29b3ZKZfLWZ/85Cf3+vhmzpxpbd++ves6119//T6fv1tvvbVrf5/Pt9d9p0yZYrW3t+/z+dvzMX3nO9/ptj2dTlvjxo3r2l5ZWWnF4/Gu7TfffLPldDr3+vzt+TytWbMm7/gDgYB13HHHdZ3f871n0qRJvY7zO9/5Tq/Xu+222/KOrba21jrooIPy/jz11+tTRERERIYf1b+IiIjIkNlzVvqpp56ad7b1lVdeyc9+9jMOPvhgPB4PNTU1XHjhhaxYsYJQKLTf91tdXc2KFSs4+eSTCYVCFBUV8f73v5+nnnqqWy3N7jweD//85z85//zzqaiowOfzMWfOHH7+859zzTXX7PX+/vjHP/Kxj32M8vLy/e4zLyoq4sknn+SXv/wlxx9/POXl5bjdbsrKyli6dCl33nknTz311Ht6HgbaJz/5SV599VUuvvhipk+fjt/vx+/3M23aNC688EJeeeWVbs93WVkZt912G2effTazZs2ivLwcl8tFSUkJCxYs4LrrruPJJ5/E7bY/bPn5z3+eK6+8kmOPPZYJEybg9/vxer1MmDCBT37yk6xYsYLTTz99r2N87rnnWLt2bdf5PV+Tu9t9W2NjY9fiuRUVFTzzzDP88pe/5MQTT6SqqqrrezR//nwuu+yy/X7uXC4XDz74IA899BCnnHIK1dXVuN1uwuEwixYt4sYbb+TFF1/s6ksHOP300/n2t7/NiSeeyOTJkwkGg7jdbsaOHcuHP/xhHn74Yf7rv/6ra/877riDZcuWMW/evK4xh0Ih5s2bxze+8Q2ef/75rtqdA+H1evnqV7/adb65uZnly5d3nb/ssst4/vnn+exnP8ukSZPwer0EAgFmzpzJ5Zdfzuuvv95jseNZs2bxxBNPcMwxxxAIBCgpKeHUU0/l+eefZ+nSpQc85j1dcskl/P73v2f+/Pn4fD4qKyv57Gc/y/PPP9/te7C7/nh9ioiIiMjw5LCszgJCERERERERERERERHZK81UFxERERERERERERHpI4XqIiIiIiIiIiIiIiJ9pFBdRERERERERERERKSPFKqLiIiIiIiIiIiIiPSRQnURERERERERERERkT5SqC4iIiIiIiIiIiIi0kcK1UVERERERERERERE+sg91AMYLUzTZMeOHRQXF+NwOIZ6OCIiIiIiIiIiIsOKZVl0dHRQW1uL06m5vjJyKVTvJzt27GDChAlDPQwREREREREREZFhbevWrYwfP36ohyHynilU7yfFxcWA/aZQUlIyxKMREREREREREREZXqLRKBMmTOjK0URGKoXq/WRn5UtJSYlCdRERERERERERkV6oOllGOpUXiYiIiIiIiIiIiIj0kUJ1EREREREREREREZE+UqguIiIiIiIiIiIiItJH6lQXERERERERERERGUKGYZDNZod6GAXN6/XidPZtDrpCdREREREREREREZEhYFkW9fX1tLe3D/VQCp7T6WTKlCl4vd597jvsQvWf/exn3HjjjdTX13PooYfy05/+lIULF/a6f3t7O9/85jf54x//SGtrK5MmTeKWW27hlFNO6fNtplIpvvrVr3L//feTTqc56aSTuP322xkzZsyAPlYREREREREREREpXDsD9erqaoLBIA6HY6iHVJBM02THjh3U1dUxceLEfX4fhlWo/sADD3DFFVewfPlyFi1axC233MJJJ53EunXrqK6u7rF/JpPhAx/4ANXV1fz+979n3LhxbN68mdLS0v26zcsvv5xHH32Uhx56iHA4zKWXXsrHP/5xnnnmmcF66CIiIiIiIiIiIlJADMPoCtQrKiqGejgFr6qqih07dpDL5fB4PHvd12FZljVI49qnRYsWceSRR3LbbbcB9hGCCRMm8F//9V9cddVVPfZfvnw5N954I2vXru31ge7rNiORCFVVVfz2t7/lE5/4BABr165l5syZrFy5kqOOOqpPY49Go4TDYSKRCCUlJe/l4YuIiIiIiIiIiIxays+6S6VSbNy4kcmTJxMIBIZ6OAUvmUyyadMmpkyZgt/v3+u+fWteHwSZTIZVq1Zx4okndl3mdDo58cQTWblyZd7rPPzwwyxevJhLLrmEMWPGMGfOHL7//e9j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5xw9++yz+vM//3P97d/+7QLuGebb5Zdfrm3btunhhx9e6F3BEjDb44X3Lyvbscceq61bt2poaEjf+ta3dMkll+jBBx/ca1CKla2Z44XXlpXtpZde0u///u/r3nvvZYFaYIkjVIfWrl0rx3E0MDAw6fKBgQF1dXXNeJuurq6mtsfysT/Hy1SZTEavfvWr9Ytf/GIudhFL2N5eW4rFonK53ALtFZaSM888k2B1hbniiiv0L//yL/r+97+vQw899BW35f0LmjlepuL9y8rieZ6OPvpoSdJpp52mn/70p7rxxht12223TduW1xY0c7xMxWvLyvLYY49px44dOvXUU+uXRVGk73//+7r55ptVqVTkOM6k2/AaAyxO1L9AnufptNNO03333Ve/LI5j3XfffXvtgTv77LMnbS9J99577yv2xmF52J/jZaooivT444+ru7t7rnYTSxSvLThQW7du5bVlhTDG6IorrtCdd96p+++/Xxs2bNjnbXiNWbn253iZivcvK1scx6pUKjNex2sLpnql42UqXltWlvPPP1+PP/64tm7dWv86/fTT9Z73vEdbt26dFqhLvMYAixWT6pAkXXXVVbrkkkt0+umn68wzz9QNN9yg0dFRXXbZZZKk9773vVq3bl298+v3f//39frXv15f+tKX9La3vU3f/OY39eijj+ov//IvF/JpYJ40e7x8+tOf1llnnaWjjz5ag4ODuv766/XCCy/oAx/4wEI+DcyDkZGRSVM3zz33nLZu3ar29nYddthh+vjHP67t27frb/7mbyRJH/7wh3XzzTfr6quv1vve9z7df//9+t//+3/ru9/97kI9BcyjZo+XG264QRs2bNDGjRtVLpf1ta99Tffff7/+/d//faGeAubR5ZdfrjvuuEP/9E//pNbW1nqvaFtbW/0vW3j/gpr9OV54/7JyffzjH9db3vIWHXbYYRoeHtYdd9yhBx54QPfcc48kXlswWbPHC68tK1tra+u09TwKhYLWrFlTv5zXGGBpIFSHJOnd7363du7cqWuuuUb9/f065ZRTdPfdd9cXw3jxxRdl2xN/2HDOOefojjvu0Cc+8Qn98R//sY455hjdddddr7jYE5aPZo+XPXv26IMf/KD6+/u1evVqnXbaafrhD39IJ+UK8Oijj+q8886rn7/qqqskSZdccom2bNmivr4+vfjii/XrN2zYoO9+97v6gz/4A91444069NBD9bWvfU0XXnjhvO875l+zx0u1WtVHP/pRbd++Xfl8XieddJK+973vTboPLF9f+cpXJElveMMbJl3+13/917r00ksl8f4FE/bneOH9y8q1Y8cOvfe971VfX5/a2tp00kkn6Z577tGb3vQmSby2YLJmjxdeW7AvvMYAS4NljDELvRMAAAAAAAAAACwFdKoDAAAAAAAAADBLhOoAAAAAAAAAAMwSoToAAAAAAAAAALNEqA4AAAAAAAAAwCwRqgMAAAAAAAAAMEuE6gAAAAAAAAAAzBKhOgAAAAAAAAAAs0SoDgAAAAAAAADALBGqAwAAAE365Cc/KcuyFno3AAAAACwAQnUAAAAsiC1btsiyrPqX67pat26dLr30Um3fvn2hdw8AAAAAZuQu9A4AAABgZfv0pz+tDRs2qFwu60c/+pG2bNmihx9+WNu2bZPv+wu9ewAAAAAwCaE6AAAAFtRb3vIWnX766ZKkD3zgA1q7dq0+//nP6zvf+Y7+23/7bwu8dwAAAAAwGfUvAAAAWFTOPfdcSdKzzz5bv+z+++/Xueeeq0KhoFWrVukd73iHnnrqqUm3u/TSS3XEEUdMu7+Z+s8ty9IVV1yhu+66S5s2bVI2m9XGjRt19913T7v9ww8/rDPOOEO+7+uoo47SbbfddhCeJQAAAIClikl1AAAALCrPP/+8JGn16tWSpO9973t6y1veoiOPPFKf/OQnNT4+ri9/+ct6zWteo5/97GczBumz8fDDD+v//J//o//5P/+nWltbddNNN+ld73qXXnzxRa1Zs0aS9Pjjj+vNb36zDjnkEH3yk59UGIa69tpr1dnZeTCeKgAAAIAliFAdAAAAC2poaEi7du1SuVzWj3/8Y33qU59SNpvVr//6r0uSPvaxj6m9vV2PPPKI2tvbJUkXXXSRXv3qV+vaa6/V7bffvl+P+9RTT+nJJ5/UUUcdJUk677zzdPLJJ+vv//7vdcUVV0iSrrnmGhlj9NBDD+mwww6TJL3rXe/SiSeeeKBPGwAAAMASRagOAACABXXBBRdMOn/EEUfoG9/4hg499FD19fVp69atuvrqq+uBuiSddNJJetOb3qR//dd/PaDHrQXqtfssFov65S9/KUmKokj33HOPLrroonqgLknHH3+8LrzwwgN6bAAAAABLF53qAAAAWFC33HKL7r33Xn3rW9/SW9/6Vu3atUvZbFaS9MILL0iSjj322Gm3O/7447Vr1y6Njo7u1+M2BuU1q1ev1p49eyRJO3fu1Pj4uI455php2820PwAAAABWBibVAQAAsKDOPPNMnX766ZKSWpfXvva1+u///b/r6aefbup+pi5GWhNF0YyXO44z4+XGmKYeFwAAAMDKwqQ6AAAAFg3HcXTdddept7dXN998sw4//HBJmjFg//nPf661a9eqUChISqbMBwcHp21Xm3Zv1iGHHKJcLqdnnnlm2nXNBv4AAAAAlg9CdQAAACwqb3jDG3TmmWfqhhtu0OrVq3XKKafo9ttvnxSYb9u2Tf/+7/+ut771rfXLjjrqKA0NDek///M/65f19fXpzjvv3K/9cBxHF154oe666y69+OKL9cufeuop3XPPPft1nwAAAACWPkJ1AAAALDof+9jHNDAwoC1btuj666/Xyy+/rLPPPltf/OIX9ZnPfEZvfOMb1dbWpk9+8pP121x88cUqFAp65zvfqRtvvFHXXXedNm/erFe96lX7vR+f+tSnJEnnnnuuPv/5z+tP//RPdd5552njxo0H+hQBAAAALFGE6gAAAFh0fvM3f1NHHXWUvvjFL+q8887T3XffrTVr1uiaa67RF7/4RZ111ln6wQ9+oA0bNtRvs2bNGt15553K5/O6+uqrdfvtt+u6667T29/+9v3ej5NOOkn33HOPDjnkEF1zzTX6+te/rk996lN65zvfeTCeJgAAAIAlyDKsxAQAAAAAAAAAwKwwqQ4AAAAAAAAAwCwRqgMAAAAAAAAAMEuE6gAAAAAAAAAAzBKhOgAAAAAAAAAAs0SoDgAAAAAAAADALBGqAwAAAAAAAAAwS4TqAAAAAAAAAADMEqE6AAAAAAAAAACzRKgOAAAAAAAAAMAsEaoDAAAAAAAAADBLhOoAAAAAAAAAAMwSoToAAAAAAAAAALNEqA4AAAAAAAAAwCz9/w0GsJs7PqJRAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "name": "stdout", "output_type": "stream", "text": [ - "Visualization libraries installed and imported successfully.\n" + "\n", + "==== Loss Comparison: 4-bit vs 8-bit ====\n", + "\n", + "Training Loss (4-bit): 0.1754 ± 0.0877\n", + "Training Loss (8-bit): inf ± nan\n", + "\n", + "Eval Loss (4-bit): 0.4618 ± 0.0725\n", + "Eval Loss (8-bit): 0.4909 ± 0.0776\n" ] } ], "source": [ - "!pip install seaborn matplotlib pandas -q\n", - "\n", - "# Import the libraries\n", - "import matplotlib.pyplot as plt\n", - "import pandas as pd\n", - "import seaborn as sns\n", - "\n", - "print(\"Visualization libraries installed and imported successfully.\")" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "35cb4b3a", - "metadata": {}, - "outputs": [], - "source": [ - "# Visualization functions for memory usage and training loss\n", - "import matplotlib.pyplot as plt\n", - "import pandas as pd\n", - "import seaborn as sns\n", - "\n", - "def plot_memory_metrics(flow_4bit, flow_8bit=None):\n", - " \"\"\"Plot memory usage metrics comparing 4-bit and 8-bit quantization\"\"\"\n", - " # Extract and organize memory data for 4-bit\n", - " memory_data = []\n", - " \n", - " for collab, rounds_data in flow_4bit.all_memory_stats.items():\n", - " for round_name, stats in rounds_data.items():\n", - " # Extract round number from round_name (e.g., 'round_0' -> 0)\n", - " round_num = int(round_name.split('_')[1]) if '_' in round_name else 0\n", - " quant_type = stats.get(\"quant_type\", \"4bit\")\n", - " \n", - " # Extract memory data\n", - " for phase, memory in stats.items():\n", - " if memory is not None and phase not in ['training_loss', 'eval_loss', 'quant_type']:\n", - " memory_data.append({\n", - " \"Collaborator\": collab,\n", - " \"Round\": round_name,\n", - " \"Round Number\": round_num,\n", - " \"Phase\": phase,\n", - " \"Memory (MB)\": memory,\n", - " \"Quantization\": quant_type\n", - " })\n", - " \n", - " # Add 8-bit data if provided\n", - " if flow_8bit is not None:\n", - " for collab, rounds_data in flow_8bit.all_memory_stats.items():\n", - " for round_name, stats in rounds_data.items():\n", - " # Extract round number from round_name (e.g., 'round_0' -> 0)\n", - " round_num = int(round_name.split('_')[1]) if '_' in round_name else 0\n", - " quant_type = stats.get(\"quant_type\", \"8bit\")\n", - " \n", - " # Extract memory data\n", - " for phase, memory in stats.items():\n", - " if memory is not None and phase not in ['training_loss', 'eval_loss', 'quant_type']:\n", - " memory_data.append({\n", - " \"Collaborator\": collab,\n", - " \"Round\": round_name,\n", - " \"Round Number\": round_num,\n", - " \"Phase\": phase,\n", - " \"Memory (MB)\": memory,\n", - " \"Quantization\": quant_type\n", - " })\n", - " \n", - " if not memory_data:\n", - " print(\"No memory data collected\")\n", - " return\n", - " \n", - " memory_df = pd.DataFrame(memory_data)\n", - " \n", - " # Create a figure with subplots for memory metrics\n", - " fig, axes = plt.subplots(2, 1, figsize=(15, 14), gridspec_kw={'height_ratios': [1, 0.7]})\n", - " \n", - " # 1. Memory usage by phase for each quantization (top plot)\n", - " if flow_8bit is not None:\n", - " sns.barplot(x=\"Phase\", y=\"Memory (MB)\", hue=\"Quantization\", data=memory_df, ax=axes[0])\n", - " axes[0].set_title(\"Memory Usage by Phase and Quantization Type\", fontsize=14, fontweight='bold')\n", - " else:\n", - " sns.barplot(x=\"Phase\", y=\"Memory (MB)\", hue=\"Collaborator\", data=memory_df, ax=axes[0])\n", - " axes[0].set_title(\"Memory Usage by Phase and Collaborator\", fontsize=14, fontweight='bold')\n", - " \n", - " axes[0].set_xlabel(\"Phase\", fontsize=12)\n", - " axes[0].set_ylabel(\"Memory (MB)\", fontsize=12)\n", - " axes[0].tick_params(axis='x', rotation=45)\n", - " axes[0].legend(title=\"Quantization\" if flow_8bit else \"Collaborator\", bbox_to_anchor=(1.05, 1), loc='upper left')\n", - " \n", - " # 2. Peak memory across rounds (bottom plot)\n", - " peak_data = memory_df[memory_df[\"Phase\"] == \"peak\"]\n", - " if not peak_data.empty:\n", - " group_var = \"Quantization\" if flow_8bit else \"Collaborator\"\n", - " sns.lineplot(\n", - " x=\"Round Number\", \n", - " y=\"Memory (MB)\", \n", - " hue=group_var, \n", - " data=peak_data, \n", - " marker='o', \n", - " sort=True,\n", - " linewidth=3,\n", - " markersize=10,\n", - " ax=axes[1]\n", - " )\n", - " axes[1].set_title(\"Peak Memory Usage Across Rounds\", fontsize=14, fontweight='bold')\n", - " axes[1].set_xlabel(\"Round\", fontsize=12)\n", - " axes[1].set_ylabel(\"Memory (MB)\", fontsize=12)\n", - " axes[1].legend(title=group_var, bbox_to_anchor=(1.05, 1), loc='upper left')\n", - " axes[1].grid(True, linestyle='--', alpha=0.7)\n", - " \n", - " plt.tight_layout()\n", - " plt.savefig('memory_metrics_comparison.png', dpi=300, bbox_inches='tight')\n", - " plt.show()\n", - "\n", - "def plot_loss_metrics(flow_4bit, flow_8bit=None):\n", - " \"\"\"Plot training and evaluation loss metrics comparing 4-bit and 8-bit quantization\"\"\"\n", - " # Extract and organize loss data for 4-bit\n", - " loss_data = []\n", - " \n", - " for collab, rounds_data in flow_4bit.all_memory_stats.items():\n", - " for round_name, stats in rounds_data.items():\n", - " # Extract round number from round_name (e.g., 'round_0' -> 0)\n", - " round_num = int(round_name.split('_')[1]) if '_' in round_name else 0\n", - " quant_type = stats.get(\"quant_type\", \"4bit\")\n", - " \n", - " # Extract loss data\n", - " if 'training_loss' in stats and stats['training_loss'] is not None:\n", - " loss_data.append({\n", - " \"Collaborator\": collab,\n", - " \"Round\": round_name,\n", - " \"Round Number\": round_num,\n", - " \"Metric\": \"Training Loss\",\n", - " \"Value\": stats['training_loss'],\n", - " \"Quantization\": quant_type\n", - " })\n", - " if 'eval_loss' in stats and stats['eval_loss'] is not None:\n", - " loss_data.append({\n", - " \"Collaborator\": collab,\n", - " \"Round\": round_name,\n", - " \"Round Number\": round_num,\n", - " \"Metric\": \"Evaluation Loss\",\n", - " \"Value\": stats['eval_loss'],\n", - " \"Quantization\": quant_type\n", - " })\n", - " \n", - " # Add 8-bit data if provided\n", - " if flow_8bit is not None:\n", - " for collab, rounds_data in flow_8bit.all_memory_stats.items():\n", - " for round_name, stats in rounds_data.items():\n", - " # Extract round number from round_name (e.g., 'round_0' -> 0)\n", - " round_num = int(round_name.split('_')[1]) if '_' in round_name else 0\n", - " quant_type = stats.get(\"quant_type\", \"8bit\")\n", - " \n", - " # Extract loss data\n", - " if 'training_loss' in stats and stats['training_loss'] is not None:\n", - " loss_data.append({\n", - " \"Collaborator\": collab,\n", - " \"Round\": round_name,\n", - " \"Round Number\": round_num,\n", - " \"Metric\": \"Training Loss\",\n", - " \"Value\": stats['training_loss'],\n", - " \"Quantization\": quant_type\n", - " })\n", - " if 'eval_loss' in stats and stats['eval_loss'] is not None:\n", - " loss_data.append({\n", - " \"Collaborator\": collab,\n", - " \"Round\": round_name,\n", - " \"Round Number\": round_num,\n", - " \"Metric\": \"Evaluation Loss\",\n", - " \"Value\": stats['eval_loss'],\n", - " \"Quantization\": quant_type\n", - " })\n", - " \n", - " if not loss_data:\n", - " print(\"No loss data collected\")\n", - " return\n", - " \n", - " loss_df = pd.DataFrame(loss_data)\n", - " \n", - " # Create a figure with subplots for loss metrics\n", - " if flow_8bit is None:\n", - " fig, axes = plt.subplots(2, 1, figsize=(15, 12), gridspec_kw={'height_ratios': [1, 0.8]})\n", - " \n", - " # 1. Training and eval loss per round (top plot)\n", - " sns.lineplot(\n", - " x=\"Round Number\", \n", - " y=\"Value\", \n", - " hue=\"Collaborator\", \n", - " style=\"Metric\", \n", - " data=loss_df, \n", - " marker='o', \n", - " sort=True,\n", - " linewidth=3,\n", - " markersize=10,\n", - " ax=axes[0]\n", - " )\n", - " axes[0].set_title(\"Training and Evaluation Loss by Round\", fontsize=14, fontweight='bold')\n", - " axes[0].set_xlabel(\"Round\", fontsize=12)\n", - " axes[0].set_ylabel(\"Loss\", fontsize=12)\n", - " axes[0].legend(bbox_to_anchor=(1.05, 1), loc='upper left')\n", - " axes[0].grid(True, linestyle='--', alpha=0.7)\n", - " \n", - " # 2. Boxplot of loss distribution by round (bottom plot)\n", - " sns.boxplot(x=\"Round\", y=\"Value\", hue=\"Metric\", data=loss_df, ax=axes[1])\n", - " axes[1].set_title(\"Loss Distribution Across Rounds\", fontsize=14, fontweight='bold')\n", - " axes[1].set_xlabel(\"Round\", fontsize=12)\n", - " axes[1].set_ylabel(\"Loss Value\", fontsize=12)\n", - " axes[1].legend(bbox_to_anchor=(1.05, 1), loc='upper left')\n", - " else:\n", - " # Comparison between 4-bit and 8-bit\n", - " fig, axes = plt.subplots(2, 1, figsize=(15, 12), gridspec_kw={'height_ratios': [1, 1]})\n", - " \n", - " # 1. Training loss comparison\n", - " training_loss_df = loss_df[loss_df[\"Metric\"] == \"Training Loss\"]\n", - " sns.lineplot(\n", - " x=\"Round Number\", \n", - " y=\"Value\", \n", - " hue=\"Quantization\", \n", - " style=\"Collaborator\", \n", - " data=training_loss_df, \n", - " marker='o', \n", - " sort=True,\n", - " linewidth=3,\n", - " markersize=10,\n", - " ax=axes[0]\n", - " )\n", - " axes[0].set_title(\"Training Loss Comparison: 4-bit vs 8-bit\", fontsize=14, fontweight='bold')\n", - " axes[0].set_xlabel(\"Round\", fontsize=12)\n", - " axes[0].set_ylabel(\"Training Loss\", fontsize=12)\n", - " axes[0].legend(bbox_to_anchor=(1.05, 1), loc='upper left')\n", - " axes[0].grid(True, linestyle='--', alpha=0.7)\n", - " \n", - " # 2. Evaluation loss comparison\n", - " eval_loss_df = loss_df[loss_df[\"Metric\"] == \"Evaluation Loss\"]\n", - " sns.lineplot(\n", - " x=\"Round Number\", \n", - " y=\"Value\", \n", - " hue=\"Quantization\", \n", - " style=\"Collaborator\", \n", - " data=eval_loss_df, \n", - " marker='o', \n", - " sort=True,\n", - " linewidth=3,\n", - " markersize=10,\n", - " ax=axes[1]\n", - " )\n", - " axes[1].set_title(\"Evaluation Loss Comparison: 4-bit vs 8-bit\", fontsize=14, fontweight='bold')\n", - " axes[1].set_xlabel(\"Round\", fontsize=12)\n", - " axes[1].set_ylabel(\"Evaluation Loss\", fontsize=12)\n", - " axes[1].legend(bbox_to_anchor=(1.05, 1), loc='upper left')\n", - " axes[1].grid(True, linestyle='--', alpha=0.7)\n", - " \n", - " plt.tight_layout()\n", - " plt.savefig('loss_metrics_comparison.png', dpi=300, bbox_inches='tight')\n", - " plt.show()\n", - "\n", - "def plot_aggregated_metrics(flow_4bit, flow_8bit):\n", - " \"\"\"Plot aggregated metrics comparing 4-bit and 8-bit quantization\"\"\"\n", - " if (not hasattr(flow_4bit, 'average_loss_history') or not flow_4bit.average_loss_history or\n", - " not hasattr(flow_8bit, 'average_loss_history') or not flow_8bit.average_loss_history):\n", - " print(\"Not enough aggregated metrics data available\")\n", - " return\n", - " \n", - " # Create comparison dataframes\n", - " rounds_4bit = list(range(len(flow_4bit.average_loss_history)))\n", - " data_4bit = pd.DataFrame({\n", - " 'Round': rounds_4bit,\n", - " 'Average Training Loss': flow_4bit.average_loss_history,\n", - " 'Aggregated Model Loss': flow_4bit.agg_model_loss_history,\n", - " 'Local Model Loss': flow_4bit.local_model_loss_history,\n", - " 'Quantization': '4-bit'\n", - " })\n", - " \n", - " rounds_8bit = list(range(len(flow_8bit.average_loss_history)))\n", - " data_8bit = pd.DataFrame({\n", - " 'Round': rounds_8bit,\n", - " 'Average Training Loss': flow_8bit.average_loss_history,\n", - " 'Aggregated Model Loss': flow_8bit.agg_model_loss_history,\n", - " 'Local Model Loss': flow_8bit.local_model_loss_history,\n", - " 'Quantization': '8-bit'\n", - " })\n", - " \n", - " # Combine data\n", - " combined_data = pd.concat([data_4bit, data_8bit])\n", - " \n", - " # Melt for easier plotting\n", - " melted_data = pd.melt(\n", - " combined_data,\n", - " id_vars=['Round', 'Quantization'],\n", - " value_vars=['Average Training Loss', 'Aggregated Model Loss', 'Local Model Loss'],\n", - " var_name='Metric',\n", - " value_name='Loss'\n", - " )\n", - " \n", - " # Plot comparison\n", - " plt.figure(figsize=(15, 8))\n", - " sns.lineplot(\n", - " data=melted_data,\n", - " x='Round',\n", - " y='Loss',\n", - " hue='Quantization',\n", - " style='Metric',\n", - " markers=True,\n", - " dashes=True,\n", - " linewidth=3\n", - " )\n", - " \n", - " plt.title('Comparison of 4-bit vs 8-bit Quantization Performance', fontsize=16, fontweight='bold')\n", - " plt.xlabel('Round', fontsize=14)\n", - " plt.ylabel('Loss', fontsize=14)\n", - " plt.grid(True, linestyle='--', alpha=0.7)\n", - " plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')\n", - " plt.tight_layout()\n", - " plt.savefig('aggregated_comparison.png', dpi=300, bbox_inches='tight')\n", - " plt.show()" + "# Visualize training and validation loss across quantization methods\n", + "plot_loss_metrics(flflow_4bit, flflow_8bit)" ] }, { "cell_type": "code", - "execution_count": 20, - "id": "61c7da64", + "execution_count": 18, + "id": "c3be3b11", "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "==== Training & Evaluation Loss Comparison: 4-bit vs 8-bit ====\n", - "\n" - ] - }, { "data": { - "image/png": "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Scb9v/76q/Hvvn37EhQUBFRenNaqVYupU6fyyiuvoNfrmT9/PvPnzzdp06hRI77++mtCQkIsOufNLl26REZGBk899RSenp78/PPPxl8+fPXVVwwfPpzu3buXevz1tQKWLFlCdHQ0APXr1+fpp582timrBJkQQgghhChDlabyhRBCiBqsojPTQ0ND9VevXi31fHFxcfrFixfrv/rqK/3nn3+u/+yzz/TOzs7G43/66SdjW0tnpisUCv3+/fuN+yZMmGDc5+3tbXKcpTPT77vvPr1Op9Pr9Xp9WlqaXqVSGffNnDnTeNyNM39DQkL0ubm5xn03z0611sz0iIiIUvswe/Zsk3P9/vvver1er58+fbpx25NPPlninNnZ2fqLFy8a77u7uxvbX7hwoUT706dPWzS2gQMHmvQnLy/PouMOHDhgctxrr71m3FdcXKzv2LGjyXOu1Wr1en3J53XcuHHG4yZNmmSy79lnnzXuGzVqlHF769atTfpy4zHh4eH6goIC477x48eb7I+Pjzc5NiMjQ79mzRr93Llz9dOmTdN/9tln+m7duhnb9+rVq9Rrubu768+dO1fisSktTlasWGHc1q9fvxLH5efn65OSkoz3hwwZYmzv5uamv3TpknHfmjVrTK7xxRdfGPfdaiz+l5npAwYMML7fXJ/NX5kz0+3t7U3688svv5j09bvvvjPuK+09pbx95Tlz5oxeoVAYjz9y5Iher9frCwoK9F5eXsbtS5YsMR5TWXF63e+//272lwZOTk76d955R5+dnV2h8908c/6XX34x7ktISNDb29sb940ePdq4z9zMdEv2CSGEEEKIWyMz04UQQojb5Nlnn8XT07PE9rNnzzJ69Gh27txZ5vHmajKXp2PHjib1kps0aWL821yNc0s8/fTTxrrG3t7e1KpVi0uXLpmcMzs72zjzF2DEiBE4OTkZ748dO9aknq815Obmcvjw4VL78Mgjj/DMM88Y7+/atYuhQ4fSuXNnFAoFer2eb775hn379tGsWTOaNGmCRqOhZ8+e1K5d23hc165d+euvvwBo3rw57du3p1GjRoSHh9OzZ08aNmxo1XFen3l+3aOPPmr8W6VS8dBDDxnbpKenExcXR1hYWInzPPTQQ8a/b55RGxkZafz7xhmtZb2GRo4ciVqtNjn/d999Z7wfExNDw4YN0el0vPHGG3z55ZcU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vI9ddNFF7Nq1y/VBFcCOHTuIj49XIl3kB84mxk6cOFEnYX7qwyvDMMwbrEgboHyHiJwJrUxv4x544AGmTZuGzWZjyJAhzJgxg/Lycm699VYAbr75ZhITE3n++ecBuP/++xk5ciS/+93vuPLKK5k1axZZWVn89a9/PZ/TEPFYTY2xF198kSeffJJ33nmH5ORk134E7dq1o127dudtHiKeqikxFhQURL9+/WrdHxERAVDnvIg4NfV97O6772bmzJncf//93HvvvezcuZPnnnuO++6773xOQ8RjNTXGJkyYwO9//3sGDhzI0KFD2bVrF0888QQTJkyo9Y0QEYHjx4+za9cu18979+5l/fr1REVF0alTJx577DHy8/P517/+BcBdd93FzJkzefjhh/nJT37C0qVLyczMZP78+edrCiLigZRMb+OmTp3K4cOHefLJJzl48CADBgxg4cKFrk039u/fX2vlw4UXXsg777zD448/zq9+9Su6d+/OvHnzlIQQqUdTY+xPf/oTVVVVXHfddbX6mT59Ok899dS5HLpIq9DUGBORpmlqjFmtVhYtWsQvfvELUlNTSUxM5P777+eRRx45X1MQ8WhNjbHHH38ci8XC448/Tn5+PjExMUyYMIFnn332fE1BxGNlZWUxatQo188PPPAAANOmTePtt9/mwIED7N+/33U9JSWF+fPn84tf/II//OEPJCUl8be//Y1x48ad87GLiOeyGPoumIiIiIiIiIiIiIhIg7RUS0RERERERERERESkEUqmi4iIiIiIiIiIiIg0Qsl0EREREREREREREZFGKJkuIiIiIiIiIiIiItIIJdNFRERERERERERERBqhZLqIiIiIiIiIiIiISCOUTBcRERERERERERERaYSS6SIiIiIiIiIiIiIijVAyXURERETahKeeegqLxXK+hyEiIiIiIq2UkukiIiIicsbefvttLBaL6/Dz8yMxMZFbbrmF/Pz88z08ERERERER0/id7wGIiIiISOvzm9/8hpSUFE6ePMk333zD22+/zfLly9m8eTNBQUHne3giIiIiIiItTsl0EREREWmyK664ApvNBsDtt99Ohw4dePHFF/noo4/IyMg4z6MTERERERFpeSrzIiIiIiLNNmLECAB2797tOrd06VJGjBhBaGgoERERTJw4kZycnFr33XLLLSQnJ9fpz119c4vFwj333MO8efPo168fgYGB9O3bl4ULF9a5f/ny5QwePJigoCC6du3KX/7ylxaYpYiIiIiItGVamS4iIiIizbZv3z4AIiMjAVi8eDFXXHEFXbp04amnnqKiooLXX3+diy66iHXr1rlNoJ+J5cuX8/777/PTn/6U9u3b89prrzF58mT2799PdHQ0AJs2bWLs2LHExMTw1FNPUVNTw/Tp04mNjW2JqYqIiIiISBulZLqIiIiINFlJSQlFRUWcPHmSVatW8fTTTxMYGMhVV10FwEMPPURUVBQrV64kKioKgEmTJjFw4ECmT5/OP//5z7N63JycHLZu3UrXrl0BGDVqFGlpabz77rvcc889ADz55JMYhsFXX31Fp06dAJg8eTL9+/dv7rRFRERERKQNUzJdRERERJpszJgxtX5OTk7mP//5D0lJSRw4cID169fz8MMPuxLpAKmpqVx22WUsWLCgWY97KpF+qs+wsDD27NkDgN1uZ9GiRUyaNMmVSAfo3bs348aNa9Zji4iIiIhI26aa6SIiIiLSZG+88QafffYZc+fOZfz48RQVFREYGAjAt99+C0DPnj3r3Ne7d2+KioooLy8/q8c9PUF+SmRkJMeOHQPg8OHDVFRU0L179zrt3I1HRERERETkTGlluoiIiIg02ZAhQ7DZbICzfMvw4cO58cYb2b59e5P6+eEmo6fY7Xa35319fd2eNwyjSY8rIiIiIiLSVFqZLiIiIiLN4uvry/PPP09BQQEzZ86kc+fOAG4T69u2baNDhw6EhoYCzlXlxcXFddqdWt3eVDExMQQHB7Nz584615qa6BcRERERETmdkukiIiIi0myXXHIJQ4YMYcaMGURGRjJgwAD++c9/1kqUb968mf/973+MHz/eda5r166UlJSwceNG17kDBw7wwQcfnNU4fH19GTduHPPmzWP//v2u8zk5OSxatOis+hQREREREQEl00VERESkhTz00EMUFhby9ttv8/LLL3PkyBGGDRvGK6+8wjPPPMOll15KeHg4Tz31lOue66+/ntDQUK655hr+8Ic/8PzzzzN06FB69Ohx1uN4+umnARgxYgQvvvgizz77LKNGjaJv377NnaKIiIiIiLRhSqaLiIiISIu49tpr6dq1K6+88gqjRo1i4cKFREdH8+STT/LKK69wwQUX8PXXX5OSkuK6Jzo6mg8++ICQkBAefvhh/vnPf/L8888zYcKEsx5HamoqixYtIiYmhieffJK///3vPP3001xzzTUtMU0REREREWmjLIZ2axIRERERERERERERaZBWpouIiIiIiIiIiIiINELJdBERERERERERERGRRiiZLiIiIiIiIiIiIiLSCCXTRUREREREREREREQaoWS6iIiIiIiIiIiIiEgjlEwXEREREREREREREWmEkukiIiIiIiIiIiIiIo1QMl1EREREREREREREpBFKpouIiIiIiIiIiIiINELJdBERERERERERERGRRiiZLiIiIiIiIiIiIiLSCCXTRUREREREREREREQaoWS6iIiIiIiIiIiIiEgjlEwXEREREREREREREWmEkukiIiIiIiIiIiIiIo1QMl1EREREREREREREpBFKpouIiIiIiIiIiIiINELJdBEREQ+zbNkyLBaL69i3b9/5HlK9WtNYRc7Evn37av1NL1u27HwPqVV66qmnXL/D5OTkM77vlltucd13ySWXmDY+b3C2r79vv/12rftERERE5MwpmS4iIm3SD5MQ9R233HLL+R7qeeMtifIfJo68NTlqGAYLFizgpptuokePHoSFheHv709sbCyjR4/mxRdf5MCBA+d7mNIK/P73v6/zWugJWnuifcuWLdx555306tWL0NBQ/Pz8iIiIwGaz8fjjj3Po0KHzPUQl2kVEREQa4Xe+ByAiIiKtV9euXXn55ZddP0dFRZ3H0bRdubm53HjjjSxfvrzOtUOHDrF06VKWLl1KTk4Ob7/99rkfYCsSFRVV62+6a9eu53E0596OHTt4/PHHz9vjX3/99fTr1w8Aq9V63sbR0hYsWMA111xDVVVVrfMlJSWsXbuWtWvX8tZbb7Fq1So6depk6lgGDx5c629cRERERM6ckukiIiLA1KlTsdlsdc6fSuqIe1arlQcffPB8D6NNKywsZOTIkezdu9d1LiUlhauvvprY2FiOHTvGN9984zbRLt+rqqrCMAzCwsLa7N+0w+HglltuoaKi4ryN4fLLL+fyyy8/b49vloceesiVSA8MDOQnP/kJiYmJLFmyhM8//xyAgwcPMnPmTF566SVTx9K3b1/69u1r6mOIiIiIeCuVeREREcGZwHnwwQfrHKeSOkuWLKn11ffTE5fgTEIlJCS4rj/77LMAHD16lIcffpjRo0eTnJxM+/btCQgIIDY2lssuu4x///vfGIZxxuO85JJL6i1B09DX85ctW8Ztt93GoEGDiI+PJzAwkJCQELp168att97Kpk2barW3WCyMGjWq1rmUlJQ6j91YKRi73c7f//53Ro8eTYcOHfD39yc6OppRo0bx5ptvUlNTU6u9u3rVs2bNYujQoYSEhBAZGcmUKVPIzc0949/Z2dqxYwd33303PXv2JCQkhJCQEHr06MH//d//sW3btjrty8vL+c1vfsOgQYNo3749/v7+dOzYkQEDBnDHHXewcOHCWu2/+uorrrnmGhITEwkICKBdu3YkJydzxRVX8NRTT1FSUnJG4/z5z39e6+/x7rvvZseOHcyYMYPHHnuMl156iS+//JLt27dz2WWX1bn/vffe48orryQuLo6AgAAiIyO58MIL+d3vfseJEyfqtD/9+Xn77bf597//zYABAwgODqZbt268+uqrANTU1PDb3/6WlJQUAgMD6d27N2+++Wad/n74N71t2zYmT55MVFQUISEhDB8+nMWLF9e574MPPuCmm24iNTWV2NhY1++wT58+3HPPPW7LEv3wsTZv3sykSZOIjo4mMDCQnJycBmum19TUMGPGDIYNG0ZERAR+fn5ER0fTt29fbr75ZmbNmlXnMfPz83nooYfo378/7dq1IygoiOTkZH784x+zevXqOu1/WGu8pKSEhx56iM6dOxMQEECXLl147rnn6rxu/HDcZ/MNhN///vesXLkSPz8/rrrqqibf35CysjJ++ctfYrVaCQoKok+fPsycObPOPNyVcjn12vbPf/7T1e6LL7444/JNpaWlhIaGNvi7mTp1quv66XHSUnG6e/du13/fcccd/PGPf+TXv/41n332GeHh4a5rhw8fPqP+3DEMgzfeeIN+/foRFBREYmIiDzzwAGVlZbXauXuvOPX3c+utt9Zqe3q7p5566qzHJiIiIuI1DBERkTbo888/NwDX8Y9//KPB9g6Hw+jcubOr/XPPPVfr+pIlS1zXfHx8jNzcXMMwDGPTpk21HsfdceuttzY4tr1797qujRw50nV+2rRpte77xz/+Ueu+0/3yl79scAwBAQHGZ5995mrf2JhPPXZDYz1+/Lhx8cUXN9jP8OHDjbKyMtc9e/furXPd3X3du3c3KioqGnzO6vu9fP75543ek5mZaQQFBdU77sDAQOPdd9+tdc8ll1zS4FynTp3qart48WLD19e3wfY5OTmNjrOgoMCwWCyuewYMGGDY7fYz+r3U1NQYGRkZDY6hd+/eRkFBQa37Tr+enp7u9r4nnnjCmDhxottrb731Vq3+Tv+bTk9PN8LCwurc4+PjY2RmZta6b/LkyQ2OPSwszNi4cWO9jzVw4EAjNDS01j3Z2dl1/gZP/3uZNm1ag485dOjQWo/3xRdfGJGRkfW29/HxMX73u9/Vumf69Omu69HR0Ubv3r3r/R2f7ofjbuw17YdycnJcf/NPPPFErXH88PXkTJx+f2xsrGGz2dzO495776113+m/45EjRxqGUTeG3R2NxfVNN93kajt27Nha18rKyozg4GDX9XfeeccwjJaLU8MwjIEDB9b629u9e7dx8uRJ46OPPjJ8fHxc12bNmnVmv2Cj7uvvlVde6XaMgwcPrvV66e694od/P+6O6dOnn/HYRERERLyVyryIiIgACxcupKioqM75qVOnYrVasVgsTJs2jd/85jcAvPPOOzz22GOudu+8847rvy+77DKSkpIA8PHxoXfv3gwZMoS4uDgiIiI4efIk2dnZfPzxxxiGwT/+8Q/uuusuhgwZYtr8QkNDGTlyJP379ycqKorg4GCOHDnC/PnzycnJoaqqivvuu4+tW7cC8PLLL7N7927+/Oc/u/r41a9+RWRkJHBm5W/uu+8+vvzyS9fPY8eOZdiwYXzzzTcsWrQIgOXLl3Pffffx97//3W0fy5cvZ/DgwYwbN47PP/+cr7/+GoCdO3cyb948rr/++rP7hTRg165d3HTTTVRWVgIQHR3NtGnTXCtji4qKqKysZNq0aaSnp9O9e3dycnJcK2N9fHy4+eab6dGjB0VFRezdu7fOqtm//vWv2O12AHr16sWUKVPw8/Nj//79rF+/nnXr1p3RWD///PNaK3unTZuGj8+ZffHwueeeIzMz0/XzBRdcwNixY8nJyWHOnDkA5OTk8KMf/YilS5e67WPt2rUMGzaMyy67jNmzZ7N9+3YAnnnmGQBGjhzJxRdfzJtvvsnBgwcBeOmll/jJT35Sb38JCQncfffdlJWV8dZbb1FZWYnD4eDOO+9k7NixrlW8ERERjB07lt69exMZGUlAQACFhYV88MEH7N+/n9LSUh555BEWLFjg9rGys7Px8/Pjpptuonv37mzbto2goKB6f1/Hjx/nP//5j+vnyZMnM2jQIEpKSvj222/54osvarUvLi7m2muv5dixYwAEBwdz6623EhYWxrvvvsu3336Lw+HgwQcfJD09nZEjR9Z5zCNHjnDs2DFuvvlmEhIS+Nvf/uZ6nfrDH/7A448/TkBAQL1jPlN2u51bbrmFkydPkpaWxhNPPOH6dk1LKCwspLi4mLvuuouIiAj+85//kJeXB8Drr7/O5MmT3c7/lFM1vmfPnk1WVhYAXbp04e6773a1aay2/a233sq///1vwPlNo0OHDtGxY0cA5s2b5yptExERwTXXXAO0XJwCzJgxg6uuuoqysjKys7PrjDcqKorHH3+cqVOnnnGfPzR//nwmTpxIWloan376KWvWrAFgzZo1vPTSSzz55JP13ntqr4CsrCxmz57tOn96bfULL7zwrMcmIiIi4jXOdzZfRETkfPjhir76jtNXO+7Zs6fWKuBNmzYZhmEYlZWVtVafzp49u87jffvtt8bcuXONmTNnGq+88orx8ssvG4mJia57fvOb39Q7tpZYmW4YhmG3241Vq1YZb7/9tjFjxgzj5ZdfNh544IFa9+zfv/+MxtFYm6KiolorOjMyMmrdd/qKaF9fX6OoqMgwjLqrI4cMGWJUVVUZhmEYVVVVRseOHV3XHnjggbpPrBtNXZl+//3311o5fOp5NgznNw1OX0V6//33G4ZhGOvWrXOd6927t+FwOGr1WVNTY+zbt8/189VXX+1q/8MV7oZhGAcOHDDKy8sbndtLL71Ua26ffvppo/cYhvNvISoqynXfsGHDjJqaGtf1hx9+uFa/2dnZrmunn+/Tp4/r+Vm0aFGta2lpaa4+//znP9e6Vlpa6urv9L9pf3//Wn9n//3vf2vd9+abb9aaR1VVlfHll18ab731lvHqq68aL7/8snHrrbe62gcGBrrG98PHAox58+bV+d3UtzL96NGjrnNhYWFGZWVlrfscDoexZ88e18+vvvpqrX4WLFjgulZYWGi0a9fOdW3ixImuaz9cET5jxgzXtXnz5tW6dvrK++asTH/hhRdcv//169e7HUdT/fD+//73v7XG6u/v77r2ox/9yHXN3cr0M7nWGIfDYaSkpLjuf/31113Xxo8f7zp/9913u863VJyesnXrVqNHjx5u32tuvvnmWn8/Z+KHr7933HGH61pVVZXRt29f17WkpCTXtYbeKxp7HxERERFp67QyXURE5AylpKRwySWXuDaLe/fdd3n22WdZuHCha/VpVFQUEydOdN1z5MgRpk2bxvz58xvs+9QqTbN89tln3H777ezfv7/RcVit1mY/3urVq10rOsG5Yvp006ZNc62KttvtrF69miuuuKJOP7fffjv+/v4A+Pv7k5KSwqFDhwBcv/OWtnLlStd/p6en11qF369fP9LT010rPk+17d27N9HR0Rw5coScnBy6devGwIED6dGjB6mpqYwZM4bOnTu7+hkxYgQfffQR4KwR/Ze//IUePXrQs2dPLrroIoYMGVKn7n1L2r59O0ePHnX9/OMf/xhfX1/Xz9OmTau1CeLKlSsZMGBAnX4yMjJcz09ycnKta9dee62rzx+uwj127Bjt27ev09+IESNq9TN16lRuueUWqqurAefK9dtvvx2A//73v/z85z93+42SUyorKykqKiI+Pr7OtX79+tWK1cZERkbSt29ftmzZQmlpKSkpKQwePJju3bvTv39/Ro8eTUpKiqv96X9HMTExtf6+O3bsyBVXXOH6BsDpbU/n6+vL//3f/7l+7tmzZ63rp8dAcnJyk/ZfOCUnJ4fp06cD8Pjjj5OWltboPaWlpfz1r3+tcz48PJw77rijznl/f/9aK66Tk5MZPny467V07dq1TR53U52qk39qru+++y733HMPR44c4bPPPnO1O71meEvG6RdffMG1117L0aNH8fPz48c//jEpKSksXLiQlStX8q9//Yv58+ezYsUKevToAcCbb77ptib7nXfeSVhYWJ3zN/0/e/cdHlWZ/g38e6bPZJJJbxBIaBK6GlBAQcVeVl1UdH2VIljAFWwr6oq44s+yK2AF2yL21V17XYyAgqKAuIhUIfSSRsokk6nn/eNkJjOZc6YkOaTw/VzXuZg5bZ6TyT1D7rnnfq67LnBbr9fjqquuClzv/v37ceTIEWRlZcU0XiIiIiKSx2Q6ERERgCVLloRN6ClnypQpYcn04BYvf/rTn2A0GgP3b7jhhqiJdACBliLxaJ44UzrHwYMHcdlll8lOJtkW45ATnKgFEJbAaX5fKTHePEEb/LP1+XytGKGy4LHLJZ6C1/nHbTKZ8O6772Ly5MnYu3cvdu3ahV27dgX2MxgMePTRR3HHHXcAkCYN3bhxI9566y04nU6sWLEipBXMoEGD8N///lc2CRysW7duIfe3bt0amDQ3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xx8DbX0AYMyYMdi0aRPuvPNODBw4EBaLBQaDAT169MC1116L77//Hnfeeadq4+0oEhISsGrVKvz5z39Gt27dYDAYcMIJJ+Cpp57Cs88+G/N5hg0bhrfffhsnnXRSyMSs8Wr++p2VlRXofR+sLeP0iiuuwPr16zF16lT069cPFosFWq0WKSkpGD16NP7xj39gzZo1shOLxurll1/G/PnzUVhYCKPRiJycHMycORPffPNNSPuYSIxGIz7//HOce+65rRoLERERUVcliKIotvcgiIiIiOj4dMYZZ2DlypUApNYoavb6JiIiIiIiag1WphMRERERERERERERRcFkOhERERERERERERFRFEymExERERERERERERFFwZ7pRERERERERERERERRsDKdiIiIiIiIiIiIiCgKJtOJiIiIiIiIiIiIiKJgMp2IiIiIiIiIiIiIKApdew+gq/D5fDh48CASExMhCEJ7D4eIiIiIiIiIiI5DoiiitrYWubm50GhYR0vUlphMbyMHDx5EXl5eew+DiIiIiIiIiIgI+/btQ/fu3dt7GERdCpPpbSQxMRGA9EKVlJTUzqNpO6Iowuv1QqvVsuKeSAWMMSJ1McaI1MUYI1IXY4xIXV01xmpqapCXlxfIVRFR22EyvY34X3STkpK6XDLd4XDAbDZ3qTcWoo6CMUakLsYYkboYY0TqYowRqaurx1hXvCai9sbGSRSR1+vFxo0b4fV623soRF0SY4xIXYwxInUxxojUxRgjUhdjjIjixWQ6EREREREREREREVEUTKYTEREREREREREREUXBnukUlVarbe8hEHVpjDEidTHGiNTFGCNSF2OMSF2MseODz+eDy+Vq72FQB6XX62N+LRBEURRVHs9xoaamBjabDdXV1V1qAlIiIiIiIiIiIuo8mKMK5XK5UFJSAp/P195DoQ4sOTkZ2dnZUSfuZWU6RSSKIqqrq2Gz2TgLNJEKGGNE6mKMEamLMUakLsYYkboYY12fKIo4dOgQtFot8vLyoNGw4zWFEkUR9fX1KC0tBQDk5ORE3J/JdIrI6/Vi69atKCoqgk7HXxeitsYYI1IXY4xIXYwxInUxxojUxRjr+jweD+rr65GbmwuLxdLew6EOymw2AwBKS0uRmZkZseULP44hIiIiIiIiIiKiLsfr9QIADAZDO4+EOjr/hy1utzvifkymExERERERERERUZfFNj4UTay/I0ymU0SCIMBsNvNFh0gljDEidTHGiNTFGCNSF2OMSF2MMSKKF5PpFJFWq8XQoUMj9goiopZjjBGpizFGpC7GGJG6GGNE6mKMEbXOihUrIAgCqqqqVH2c/Px8LFy4UNXHiBWT6RSRz+dDaWkpfD5few+FqEtijBGpizFGpC7GGJG6GGNE6mKMUUe3b98+TJkyBbm5uTAYDOjZsydmzpyJioqKYz6WM844A7NmzQpZN2rUKBw6dAg2m61NHuPVV19FcnJy2Pq1a9fixhtvbJPHaC0m0ykin8+HXbt28Y2FSCWMMSJ1McaI1MUYI1IXY4xIXYwx6sh27dqFoqIi7NixA2+//TZ+//13LF68GMXFxRg5ciQqKyvbe4gwGAzIzs5WvVVSRkZGYILQ9sZkOilyuLxw+4ATTy6C2yfdJyIiIiIiIiIiInXNmDEDBoMB//3vfzF27Fj06NEDF1xwAb7++mscOHAA999/PwCp9/+HH34YcmxycjJeffXVwP177rkH/fr1g8ViQa9evfDAAw/A7XYHts+dOxfDhg3D66+/jvz8fNhsNlx99dWora0FAEyaNAkrV67EU089BUEQIAgCdu/eHdbm5YwzzghsD152794NAJg/fz4GDx6MhIQE5OXlYfr06bDb7QCkljGTJ09GdXV14Li5c+cCCG/zsnfvXlx66aWwWq1ISkrCVVddhSNHjsR8Pa3BZDqFqXd5UG534tlvduDiZ1bhtMdX4OJnVuHZb3ag3O5EvcvT3kMkIiIiIiIiIiLqkiorK/HVV19h+vTpMJvNIduys7Nx7bXX4l//+hdEUYzpfImJiXj11VexefNmPPXUU3jppZewYMGCkH127tyJDz/8EJ9++ik+/fRTrFy5Eo899hgA4KmnnsLIkSMxbdo0HDp0CIcOHUJeXl7Y47z//vuB7YcOHcIf//hHnHDCCcjKygIAaDQaPP300/jtt9+wdOlSfPPNN/jLX/4CQGoZs3DhQiQlJQWOv+uuu8Iew+fz4dJLL0VlZSVWrlyJZcuWYdeuXZgwYULM19MaulafgbqUBrcXL367C08X74AvKB7L7E48t2InFq3cidvG9cXNY3vDpOcEHUStJQgCbDYbZ48nUgljjEhdjDEidTHGiNTFGKOOaseOHRBFEYWFhbLbCwsLcfToUZSVlcV0vr/+9a+B2/n5+bjrrrvwzjvvBBLZgJSkfvXVV5GYmAgAuO6661BcXIxHHnkENpsNBoMBFosF2dnZio+TmpoauL1gwQJ88803+PHHHwMfCAT3XM/Pz8e8efNw88034/nnn4fBYAjEY6THKC4uxq+//oqSkpJAQv+1117DwIEDsXbtWgwfPjzq9bQGk+kUUO/y4MVvd2Hh1zsU9/GJCGy/cUwvWAz8FSJqDa1Wq/jmSEStxxgjUhdjjEhdjDEidTHGqKOLVnluMBhiOs+//vUvPP3009i5cyfsdjs8Hg+SkpJC9snPzw8kngEgJycHpaWl8Q8awBdffIHZs2fjk08+Qb9+/QLrv/76azz66KPYunUrampq4PF40NDQgPr6+ph7om/ZsgV5eXkhlfEDBgxAcnIytmzZEkimt+X1BGObFwqod3nxdLFyIj3Y08U72EOdqA34fD7s37+fE94QqYQxRqQuxhiRuhhjROpijFFH1adPHwiCgC1btshu37JlCzIyMpCcnAxBEMKS7sH90H/44Qdce+21uPDCC/Hpp59iw4YNuP/+++FyuUKO0ev1IfcFQWhRbGzevBlXX301HnvsMZx77rmB9bt378bFF1+MIUOG4D//+Q/Wr1+P5557DgDCxtIW2up6mmMynQBIk4v+c1VJSGuXSHwi8MqqEvx6oBpLVpfg040H8eOuCuwqs6O2wR1zzyai4x3/80akLsYYkboYY0TqYowRqYsxRh1VWloazjnnHDz//PNwOBwh2w4fPow333wTkyZNAgBkZGTg0KFDge07duxAfX194P7333+Pnj174v7770dRURH69u2LPXv2xD0mg8EArzdyYW15eTkuueQSjB8/HrfffnvItvXr18Pn8+HJJ5/Eqaeein79+uHgwYNxP0ZhYSH27duHffv2BdZt3rwZVVVVGDBgQJxXFT/26KCAr347HPf+E0fl46FPNodtM+k1yEg0It1qxIiCVNx7gfzXphrcXvZeJyIiIiIiIiIiCvLss89i1KhROO+88zBv3jwUFBTgt99+w913341+/fphzpw5AICzzjoLzz77LEaOHAmv14t77rknpCq7b9++2Lt3L9555x0MHz4cn332GT744IO4x5Ofn48ff/wRu3fvhtVqDemP7jd+/HhYLBbMnTsXhw835RkzMjLQp08fuN1uPPPMM7jkkkuwevVqLF68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qirV1dXpfe97nzZv3px137/8y7/okEMOGfZ6I/U3tyxLF154oR544AEdddRRqqio0JFHHqk1a9YMu//xxx/X8ccfr3A4rEWLFunb3/72BMwSAAAAwHTGynQAAAAcsJdeekmSVF9fL0l69NFH9a53vUsLFy7Utddeq3g8rttuu00nnniiNmzYMGKAno/HH39c999/vy644ALV1NTo1ltv1VlnnaVXXnlFM2bMkCT99a9/1Tve8Q41NTXp2muvVSqV0jXXXKOZM2dOxFQBAAAATFOE6QAAAChYLBZTW1ubent79eSTT+q6665TRUWF3vOe90iS/vVf/1UNDQ1at26dGhoaJElnnnmmjj32WF1zzTW65557xvX7bt68WX//+9+1aNEiSdIpp5yiY445Rj/+8Y914YUXSpJWr14t13X1xz/+UQcddJAk6ayzztLrX//6A502AAAAgGmMMB0AAAAFW7FiRdavDznkEP3oRz/SvHnztHPnTj311FO64oor0kG6JB199NF6+9vfroceeuiAft+BIH3gNWtra7V161ZJkm3bevjhh3XmmWemg3RJOuKII3Taaacd0O8NAAAAYHqjZzoAAAAKdvvtt+s3v/mNfvrTn+r0009XW1ubKioqJEkvv/yyJOnwww8fdt8RRxyhtrY2dXd3j+v3zQzIB9TX12v//v2SpNbWVsXjcS1evHjYdSONBwAAAADyxcp0AAAAFGzZsmVqaWmR5LVvefOb36wPfvCDevbZZwt6naGbjA6wbXvE836/f8TzrusW9PsCAAAAQKFYmQ4AAIAD4vf7deONN2rHjh365je/qYMPPliSRgzWt2zZosbGRlVVVUnyVpW3t7cPu25gdXuhmpqaFIlE9Pzzzw97rtCgHwAAAAAyEaYDAADggL31rW/VsmXLdMstt6i+vl5Lly7VPffckxWUP/PMM3rkkUd0+umnp88tWrRIsVhMmzZtSp/buXOnfvazn41rHH6/X6eddpoeeOABvfLKK+nzmzdv1sMPPzyu1wQAAAAAiTAdAAAAE+Rf//VftXv3bt1999362te+pr179+qNb3yjvv71r+v666/X2972NkWjUV177bXpe8455xxVVVXp/e9/v77xjW/oxhtv1PLly3XYYYeNexzXXXedJOktb3mLbrrpJn35y1/WKaecoiOPPPJApwgAAABgGiNMBwAAwIT4f//v/2nRokX6+te/rlNOOUVr1qzRjBkztHr1an3961/XCSecoP/93//VggUL0vfMmDFDP/vZz1RZWakrrrhC99xzj2688UadccYZ4x7H0UcfrYcfflhNTU1avXq17rrrLl133XV6//vfPxHTBAAAADBNWS67NQEAAAAAAAAAMCZWpgMAAAAAAAAAkANhOgAAAAAAAAAAORCmAwAAAAAAAACQA2E6AAAAAAAAAAA5EKYDAAAAAAAAAJADYToAAAAAAAAAADkQpgMAAAAAAAAAkANhOgAAAAAAAAAAORCmAwAAAAAAAACQA2E6AAAAAAAAAAA5EKYDAAAAAAAAAJADYToAAAAAAAAAADkQpgMAAAAAAAAAkMP/B8+ZPYgpDIDFAAAAAElFTkSuQmCC", + "image/png": "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uXJF+/fv16pVq3T16lX973//03/+8x9169ZNkjmHyOuvv27fd0hIiPr27avz589r4cKFSkpKyjAGZxyHszjz/ciq06dP6+zZs+rTp49Kly6t999/X6dOnZIkvfnmm3rllVfk7e19U/vcvHmzatSooS5dumjPnj368ssv7a+1YMECjRgxQtKtf2bO9Mcff6h37972iRdLlCihvn37ymKx2D//xMRE9e3bV/Xr11e1atUUHR1tn4DcarWqT58+ql69uk6dOqWDBw+mm5x83rx5Sk5OlmR+h7p27SpPT08dOXJEe/bs0a5du24p9sjISFWvXl1du3bV0aNHtXTpUtlsNl2+fFnh4eHav3+/PDw89Mwzz+i///2vJGnNmjU6deqUgoKCJEmrVq2y7+/222/XXXfddUuxSNKZM2ccPk+LxaKuXbs61Jk0aZJWrlxpf3733XfrwQcfVHR0tD2W6Oho9ezZU99+++0tx5KRTZs26a677lLr1q313XffafPmzZKk33//XatXr1aPHj0kmf8Gfvzxx/btqlatqm7duumff/7R0qVLnRoTAAC4eevWrbNfr6bWvXv3m5737WauhX18fHT33XcrLCxMJUqUUOHChRUXF6fIyEj98MMPMgxDw4cPV/fu3eXn55f9A/1XtWrV1K5dO/33v//VZ599pqNHj+r06dPasGGDJNmvYTLTu3dv7dmzR5JUpEgR/d///Z/Kli2rzZs3a926dbLZbBo2bJgaNGigpk2batCgQXr44Yf1wgsv2PeResivokWLZvg6GzduVFBQkHr06KESJUqkm98xs9h++OEH+/OaNWuqXbt28vHx0e7du7V9+3b7OmddU3/33XcyDMP+vG/fvlke7tcZ17I7d+5U48aN1apVK61YsUIHDhyQJI0fP16S1KxZM913332aP3++YmJiJElTp07V448/nun+SpcurUGDBun8+fNasGCBEhMTZbPZ9NRTT+nBBx+0f2bFihXTgw8+qJo1ayowMFDe3t46ceKEPvvsMx05ckTx8fF66aWX7O23tHbv3i1PT0/17t1b1apV0/79++Xr65vp+3XhwgV9+OGH9uePPPKI7rzzTsXFxenw4cP6/vvvHeqfO3dOXbp0sQ/f7Ofnp/DwcAUEBGj58uU6fPiwbDabnn/+edWvX1/NmjVL95o50b4FkMNcnVUB4B6OHTvmcAfLtGnTDMMwjCVLljjcpZD6DowLFy4YhQsXtq/7/PPP7etq1aplL3/99dft5Z07d7aXN2/e3OHulh07dji81k8//WRfl/pOcw8PD2Pnzp2ZHsuJEyeMNWvWGO+++64xffp0Y9q0aUbt2rXt2z/++OP2ugMGDHC4eyP1UEdp7w5Kfdf/rR5HVt1MTw1nvh9ZvTtNksOdWatXr870PMlqT41y5coZ8fHx9nX16tWzr+vSpYu9/FY/s+u52Z4aQ4cOdYhh37599nX79u1z6O4/dOhQwzAMY9euXQ53YqXtxnz16lXj0KFD9ucdOnSw18+oe/Xx48cz7KaekdTnS1BQkEMX+4kTJzoce0qXc5vN5jAEXeo7m1LfKZb2jqfMpH2PM3oEBgam66qfnJxs76YumT2TUvcuevHFF9Pd9WUYzuup0bBhQ/swbUlJSUZISIh9XUREhH271q1b28uLFi1qnD59OtP3mJ4aAADkvLQ9NTJ7pL5GyIlr4RQ//fST8eGHHxpvvvmmMW3aNGPChAkO22zYsCHD17rVnhrDhw83vv76a/vzkSNHGuHh4fbnO3fudLhOT/06P/30k8O+vv32W4fXadeunX1d586dM40hs2ue1HUCAgKMw4cPp6uTWU+NvXv3OpS3a9cu3ZC6f/75p33ZWdfUU6dOdXjdtMPGZuZWr2UNw/F9qlWrlv04169f77Cubt269n3OnTvXYV3q9lXq618vLy+HYaM++ugjh+3mz5/vcBxJSUnGhg0bjAULFhgzZ840pk2b5nA++fj4OHwOaXvurF69Ot17k9n37cyZMw7nR2JiosN2NpvN+Ouvv+zPZ86c6bCfL7/80r7uxIkTDr9ZdOzY0b4uu99pAK5FTw0AkqSlS5fa72CxWCzq3r27JKlTp07y9fVVQkKCJGnRokWaMWOGJMnf319du3bVokWLJJm9Mx5++GHt3btXv/76qyTJw8NDvXv3tr9Oyl3OkhQVFSUPD49MY9qyZYvq1KmTrrxt27a6884705VfvnxZgwcP1pIlS+w9KDJy9OhR+/KPP/5oX65fv77DZHS9evVS//79dfXq1XT7cMZxOIsz34+s8vDw0IABA+zPb7vtNof1KXfJ3IzevXurSJEi9ufVq1fX7t270+3vVj8zZ9q6datDDKknmKxdu7bq169vv3sspW7NmjVVokQJnT59WtHR0apatarq1aun6tWrq06dOmrZsqUqVKhg38+9996rtWvXSpL69eun9957T9WrV9dtt92mpk2bqmHDhrJYLDcde4cOHRzulOvVq5dGjRplf75z5061bNlSFotFQ4YMsU/Y/f777ysiIkIHDx7Uzp07JUleXl7q1avXTceQmccffzxdr6EDBw7ozJkzDvGm/r717dtXU6dOtT/funWrwsLCnBbTk08+ae+B5uXlpUqVKunkyZOSMj8v27Rpo+LFizvEnPo9BgAAedvNXAvv2rVLffr0uWEPhFu5Jr+RVq1aqVatWvr11181b948Xbx4UZLUtGnTDNsPKVK3dSTp/vvvz7Tuli1bshVjnz59VL58+SzXTzsJ99ixY+3XaikqV65sX86pa+qscta1bLdu3ezHWbFiRYd1Xbp0se+zSpUqDuvOnj3r0MZKce+99zrsp3v37urXr5+uXLkiyWwTPPnkk5Kkjz76SM8991yGPZ1SJCYm6tSpUypVqlS6dbVr11bHjh0z3TatwMBA3X777frll18UHx+vSpUq6a677lK1atV0xx136IEHHlClSpXs9VO3zYKDg9W2bVv785CQELVt29beIyZ13dRyon0LIGdlra8cgHwv9dBTTZo0sXfBLlKkiB566CH7uo8++sjhB+PU3VnXrFmjS5cuadmyZfaytm3bOlzYpL6gu5HY2NgMy2vUqJFh+ciRI/XBBx9c9wd8SfYhgySzq2qKkiVLOtTz9PS0D7eTljOOw1mc+X5kVWhoqEOXYR8fH4f1N3rNjKS9OE+9z9T7u9XPzJlSf/6hoaHp1qcuS7kA9vX11cqVK+2Ntr/++kv/+c9/NHnyZD322GMqU6aMPWEoSc8995x69+4tDw8PJSYmKioqSvPmzdPw4cN19913q06dOjp+/PhNxx4SEpJprJLj+9uvXz97Iyg6OlqbN2926Dr/0EMPpdtfVg0cOFDjx4/Xvffeay9744039NRTTznUS/tdSxtv2ueZNTiMVMMFSFk/72/lvLzRewwAAHLfokWLZJjzijo8mjdvftP7yuq18OXLl/Xwww9naUilW7kmz4qU4YNPnz5tv1Ft6NCh190mN9s6mbVlMpM2ttQ/bmfEWdfUZcqUcXi+f//+W4r3Vq9lS5cubV9OOwxS6nWeno73LmfWLkt7verh4aESJUrYn6dc26Yk5a6X0EiR2Tl8s5+xJC1btky1atWSJB07dkxr1qzR9OnT1bdvX5UvX14RERH2urfSNsuojrPbtwByFj01AGj79u2Kjo62P9+8eXOmd6ucPHlSX375pTp06CBJuueee1StWjX9/vvvunjxotasWeMwrnx4eLjD9sWLF7ff5XzPPfdc946NJk2aZFju7++fYfmKFSvsy3fccYeWL1+u2267TZ6enurWrZvDPAApihUr5nBsqV29ejXTizdnHIezOPP9yKq0d0M54+6mrO7zVj8zZ0p9F/6JEyfSrU9dFhgYaF++//77dfDgQe3atUt79uzRH3/8oS1btmjjxo1KSkrSCy+8oA4dOqhq1ary9PTUkiVL9MYbb2jLli06cOCADhw4oM8++0xnz57Vzz//rBEjRmjx4sU3FXva9yxt/Knf3yJFiqhfv356++23JZm9Nfbt22dfn/b7fTO6d++u5s2b6+WXX9bDDz/sMHfP448/bk92pH6vM4o37fOU9zvtGMeXL1+2L9tsNv35559ZivNmzsvTp09LuvF7DAAA8rasXh9s2LDB4Qfz4cOHa8SIEQoKCtKlS5cyvY53pj59+ujll1+2/5hbrlw5de7c+brbpL3+eu2115w630dqN/sepI3t4MGDCg4OzrS+s66pW7RoIYvFYr9RZsmSJXr22WdvOK/GrV7LppX2nEstbSIjK9JeryYnJ9uvZaVrbYJVq1bZf9C3WCxatmyZ2rdvL39/f3355ZcON0Bm5lbO8zp16uiXX37Rvn37tGvXLv3+++/atWuXvvrqK9lsNs2cOVPt27dXixYtbrltllpOtG8B5CySGgAcemlktX5KUkMyf9h8+eWXJUmjRo3S4cOHJUlBQUFq3769w7ZNmjTR6tWrJUkxMTF66qmnFBAQ4FDn8uXLWrVq1U0nA1JfhLVo0cI+LFFsbGy6SZhTNGjQwD6Uzo8//qg//vhDVatWlSR9+OGHmQ5jlJPH4Sy38n7kBbf6mTlTkyZNtGPHDklm1+xffvnF/v7+/PPP9vhS6kpSQkKCDh48qJo1a6pBgwb2SRMNw1BgYKDi4uJks9n0008/qWrVqjpw4IDKlSun4OBgh6RZ7dq17Xcm3cpk4WvXrlV8fLz9fE09CZ9kDqeV2pAhQ/TOO+/IMAwtX77cfgdWaGio2rVrd9Ovn5bVatVbb72lGjVq2IfAGzNmjL777jtJZtfv4sWL2+/A+vDDDzVgwAB7F/u0DdCU9zt1ckaStm3bZo93/vz5Tu9B1aBBA61fv16SORHpmTNn7A2stO8xAAAoGFJfj0tSz5497b2KU/d+zUmFChXSk08+qWnTpkmSBg0adMMfwdO2X4KCgjRo0KB09X755Zd0d757enrar8cvXbqUndAzdM899zg8Hz9+vD777DOHYzp8+LB9WFdnXVOXKlVK3bp1s984tnv3bg0dOlSzZs1KNxTx77//rh07dqhnz563fC2b0zZu3KhDhw7ZeyWvWLHCPvSUdK1NkPocLlq0qLp162ZP5OTkObxnzx6FhYXpjjvu0B133GEvr1u3rvbu3SvJ/NxatGihJk2a2GOJjY3VV199ZR+C6uTJk/abp6Tce38B5DySGkABl5CQ4NCzolKlSmrYsGG6evv27bPPk/HFF1/o1KlT9gvyPn36aPTo0UpOTtbBgwft2/Tq1SvdHQ/Dhw/XmjVrZBiG/vjjD9WuXVtdunRRaGio4uLitG/fPn3//fe6ePGi+vTpc1PHctttt+nnn3+WZP5oabVaVahQIS1dujTTHzCfeOIJzZs3T4ZhKDk5Wffdd5/69Omj+Ph4LViwINPXysnjcJZbeT/yglv9zG7GgAEDMhx7tn79+nrvvff09NNPa86cOUpMTJTNZlOzZs3Ut29fWSwWLV682H43k7e3t55++mlJZhfuWrVq6fbbb1fDhg1VunRp+fn5adOmTYqLi7O/RsqP8TNnztTSpUvtY8aGhobqzJkzWrJkSbq6N+PUqVO666671LVrVx09elRLly61r6tSpYpatGjhUL969ep68MEHtX79eocu5b17976lu8IyUrVqVXXv3t0+dF1UVJS2bNmiJk2ayGq1atiwYRo9erQkcxzce+65Rw8++KD279/v0Jhq0aKF6tatK0kKCAhQ9erV9dtvv0mSJk6cqN27d+vy5cv69ttvnRJ3ak888YQ9qREXF6dGjRqpe/fu6d5jAABQcKQdl79Xr17q3r27Dh06lKvXBy+++KL9x9y013oZqVu3rlq1aqVvvvlGknmTy1dffaX69evLarXq8OHD2rJli6KjozV27FiHREOZMmXsN7m98cYbOn36tPz8/FSvXj098MAD2T6WO+64Q+3atdOXX34pyWyb1q1bV+3atZOvr69++eUXbdiwwd5725nX1DNnztS2bdvsx/fOO+/oq6++Uvv27e373b59uzZu3Kg+ffqoZ8+et3wtm9OuXLmipk2bqnfv3jp//rxDO6po0aLq2rWrJMdz+Ny5c3rooYfUpEkTbdq0SV9//XWOxXf33XerdOnSuvfee1W6dGkFBATop59+sic0pGufW9++fTV+/Hh7AuaRRx7R448/roCAAC1btkwXLlyQZPa+eO6553IsZgC5zCXTkwNwG8uXLzck2R8ffvhhhvUiIyMd6s2aNcthfdu2bR3WSzL27t2b4b5mz55teHp6pquf9pFahQoV7OVjx47N0rGkPEqVKmW0atXK/rxZs2YO240YMSLD7e68804jNDTU/nzcuHHZPo6sSn28aePNyffj4MGDDnW/++47+7qxY8fayytUqODwWtfbrm/fvpkeS+ptFi1a5LDuetvd6meWmUWLFt3wc0wbx8qVKw1fX99M6/r4+BjLly+31z9+/PgN99+wYUPjypUrhmEYxoABA65b12q1Gp999lmWji/1+dKkSRPDy8sr3f58fX2N77//PsPtv/jii3T1f/nllyy9dmbvcepzxDAMY9++fYbFYrGvb9u2rX3d1atXja5du173/ahZs6bxzz//OOzz/fffz7Bu5cqVjRo1atif9+3b177N9c5lwzCMZs2aZbidYRiZxti8efPrnusAAMD5vvvuu5v+/zcnroXbtGmT4fVB6mvdtPFd77WuJ/X+hg8ffsP6qWNI+zonTpwwwsLCbnj9mrYtMmzYsAzrPf300xnGmdnnkvbaMbVTp04Zd911V6YxFS1a1F7XmdfUhmEYhw4dMho3bnzD9yX1deKtXstm9j6lPd9Sr0t73h88eNC+LvV17N13320UL148w/cjdRvm9OnTRunSpbN0Dmf2WmmvmTM7jtTfGx8fn+u+X5UqVTLOnTtnr//9998bxYoVu+7nPH36dIfXv9XvNAD3wEThQAGXeuipokWLqkuXLhnWa9GihcOEuWmHrEo7tn79+vUduommNnjwYO3evVtPPfWUqlevrkKFCsnT01OhoaFq1qyZRo8erZ9++ummj6VHjx5auXKl6tatKy8vL5UoUULdu3fXtm3bHCZPS2vy5MmaN2+ebr/9dnl7e6tUqVIaMmSIIiMjFR8fb6+X9g6enDoOZ7nV9yMvuNXPzJm6du2qPXv2aODAgapatap8fX3l6+urKlWqqH///tq9e7d69Ohhrx8YGKh33nlHjz32mGrVqqXixYvLw8NDAQEBatCggcaPH6/IyEh774cnnnhCL730ku677z6VK1dOvr6+8vb2Vrly5dS1a1d9//336tSp003H3apVK23YsEGtWrVSkSJF5O/vby+77777MtymXbt29iG+JKlRo0b2ifucpXbt2g7D1X311Vf2oQA8PDy0cuVKrVq1Su3atVNISIg8PT1VtGhRNWrUSNOmTdMPP/yQ7rx+4oknNH/+fNWsWVPe3t4qWbKkBg0apB07duTI5N0fffSRJk6cqMqVK8vLy0sVK1bUqFGjHLq8AwCAguU///mPnnvuOZUqVUre3t6qWrWqJk2a5LQexjklJCRE27dv15w5c3T//fcrKChIHh4e8vf3V40aNdSrVy999NFHeuGFFxy2mzhxooYOHaqyZcumG5bJWUqUKKHNmzfr/fffV8uWLRUcHCxPT08FBgaqfv36DnfjO/uaukKFCtq8ebM+//xz9ezZU1WrVpW/v788PT0VEhKili1bavbs2Zo6dap9m1u9ls1Jt912m3bs2KFHH31UgYGB8vPzU5MmTfTll186tGGKFy+uTZs2qUuXLgoICJCfn5/uuusuffrpp+rXr1+OxTdnzhyFh4erTp069s+3cOHCqlOnjl588UVt375dRYsWtde/77779PPPP2v48OG6/fbbVahQIXl7e6t8+fLq2bOntmzZouHDh+dYvAByn8Uw/p3lCAAKqMuXL2c48d0XX3zh8CPr5s2bGYPTTfCZ5b42bdrYh1eaO3euBgwY4OKIAAAAAGRV8+bN9f3330syh2y62bk1AcCdMKcGgALv5Zdf1p49e9S+fXtVqlRJV69e1Y8//qh3333XXqdBgwZq3LixC6NEanxmuWP//v36559/tG3bNvuYucWKFVPPnj1dHBkAAAAAACioSGoAKPAMw1BUVJSioqIyXF+1alWtWrVKFosldwNDpvjMcseUKVO0ePFih7KJEyeqcOHCLooIAAAAAAAUdCQ1ABR4nTp10okTJ7R9+3bFxsYqISFBxYoVU+3atdW5c2c9+eSTKlSokKvDRCp8ZrnLx8dHVatW1bBhw/TEE0+4OhwAAAAAAFCAMacGAAAAAAAAAADIE6yuDgAAAAAAAAAAACArSGoAAAAAAAAAAIA8gTk1ssBms+nY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JP1RUkNERERE/jOzOT5xcfiwkejImjV++erV0KgR+PgYIzsiIuwXq4iIiIiIiKQfSmqIiIiIyDMpVcpIXJw/b9TW8PSMX3b0KPToYUxN1acPnDpltzBFREREREQkHVBSQ0RERESShKurkbg4ccIoLv7ii/HLbt2C//3PKCreogVs2ABWq50CFRERERERkTRLSQ0RERERSVIODvGJi/37oXNncHIyllmtsHw5vPwy+PrCrFlw7549oxUREREREZG0REkNEREREUk25cvDzJnG1FQjR0L+/PHL/v4bunSBQoXg88+NPomJjIQff4TWrU20auVG69YmfvzRaBcREREREZGMRUkNEREREUl2uXPDgAFw5gz89BM8/3z8sqtXYdQo8PKCtm0hMDB+aqoVK4xESIcOxgiPwEAnli83nufPDytX2mV3RERERERExE6U1BARERGRFJMpU3ziYscOeOMNcHQ0lsXEwMKFUKMGVKtm1Odo0QJu3DCWWyymBD9v3IDmzY3Eh4iIiIiIiGQMSmqIiIiIiF1UrQrz58PZszBoEHh4xC/btcsoLG61Pr6geFx7x46aikpERERERCSjUFJDREREROwqf34YPhxCQmDOHKOA+JOyWuH6dVi8ONnCExERERERkVRESQ0RERERSRWcnY1RF3v3Qu3aT76e2QxLlyZbWCIiIiIiIpKKONo7ABERERGRB5lMxuNJWSxGwfBWraB6daMmR6VKRpJERERERERE0hclNUREREQk1XF3N0ZgWCxP1v/+fWO0RtyIjUyZjMRGXJKjRg1jmisRERERERFJ2zT9lIiIiIikOi1aPHlCAyBLloTP79+Hv/4yio23aQMFCoCnJ7RrBxMnwp49Rh8RERERERFJWzRSQ0RERERSnTZtoFcvuHHDKAb+OCYTuLrC+fNw+jQEBsL27cbj6NGEfc+eNR4//2w8d3GBKlXiR3I8/zzkzp1ceyQiIiIiIiJJQUkNEREREUl1nJ1h7lxo3txIXCSW2IiruzF3rpGgKFPGeHTpYrRfvWqM1ohLcuzcCXfvxq9/9y5s2mQ84pQoEZ/kqF4dfHyMabBEREREREQkdVBSQ0RERERSpaZNYdky6NgRrl8Hs9mKxWKy/XR1NRIaTZsmvr67OzRubDwAYmLg77/jkxzbtxsjNx507Jjx+P5743nOnMYIjrgkR7VqkCNH8uyviIiIiIiI/DslNUREREQk1WrWDC5ehMWL4ddf4fLlKPLly0yrVtC6tTGi40k5OkLFisajRw+j7eLFhFNW7d0L0dHx69y8CatXGw8wRoeUK5ewALm3d/yoEREREREREUleSmqIiIiISKrm7Azt28Mbb1i5cuU6efLkwWxOmixC/vzw6qvGAyAy0khsPDiaIzQ0vr/Vaoz2+PtvmDbNaPPwSJjkqFz50cLlIiIiIiIikjSU1BARERER+X/OzvHJCTCSGGfOGMmNuBEd+/eDxRK/TlgYrFhhPMAYEeLnF7+dGjWgYMEU3xUREREREZF0SUkNEREREZHHMJnAy8t4vPmm0RYRYRQdj0tyBAYaNT/ixMTArl3G45tvjLaCBRMWIPf1hcyZU3x3RERERERE0jwlNURERERE/oNs2eDll40HGKM2jh5NWJvj8OGE65w/D4sWGQ8wRoRUqRKf5KheHfLkebp4IiPhl1+MoupXrxoF0lu0gDZt/lvNERERERERkbRASQ0RERERkWdgNkPp0sbjnXeMtmvXYMeO+CTHjh1w5078OpGRsGWL8YhTrFh8kqNGDShTBhwc/vm1V6yAjh2NkSJms5FgMZuNouq9esHcudC0aZLvsoiIiIiIiN0oqSEiIiIiksRy5YKGDY0HGFNSHTyYsAD56dMJ1zlxwnj88IPxPHt2eP75+CRHtWrg6hrff8UKY0RGnLg6H3E/b9yA5s2NERzNmiX9PoqIiIiIiNiDkhoiIiIiIsnM0dGoo+HrC926GW2XLyecsmrPHoiKil/n9m1Yu9Z4gFHfw8fHSHBUqQJ9+xrtVmvir2m1Gut07AgXL2oqKhERERERSR+U1BARERERsYN8+aBlS+MBRkJj37744uPbtsGlS/H9rVYIDjYeM2Y82WtYrcbUVIsXQ/v2Sb8PIiIiIiIiKU1JDRERERGRVMDJyZhu6vnnjedWK4SExCc5tm+HoCCIjf1v2zWbYelSJTVERERERCR9UFJDRERERCQVMpmgSBHj0a6d0XbnDuzaZRQkf7gmx+NYLEbhchERERERkfTAbO8ARERERETkyWTNCi++CH5+xgiMJ2E2G4XLRURERERE0gMlNURERERE0pgWLYwRGE/CYomv2yEiIiIiIpLWKakhIiIiIpLGtGkDbm7GFFX/xGQy+rVunTJxiYiIiIiIJDclNURERERE0hhnZ5g71/j34xIbce1z5xr9RURERERE0gMlNURERERE0qCmTWHZMnB1NZ7H1diI++nqCsuXG/1ERERERETSC0d7ByAiIiIiIk+nWTO4eBEWL4alS+HaNaMoeMuWxpRTGqEhIiIiIiLpjZIaIiIiIiJpmLMztG9vPERERERERNI7TT8lIiIiIiIiIiIiIiJpgpIaIiIiIiIiIiIiIiKSJiipISIiIiIiIiIiIiIiaYKSGiIiIiIiIiIiIiIikiYoqSEiIiIiIiIiIiIiImmCkhoiIiIiIiIiIiIiIpImKKkhIiIiIiIiIiIiIiJpgpIaIiIiIiIiIiIiIiKSJiipISIiIiIiIiIiIiIiaYKSGiIiIiIiIiIiIiIikiYoqSEiIiIiIhnK5MmT8fT0xNnZmWrVqrFz585/7P/LL79QqlQpnJ2dKVeuHH/88UcKRSoiIiIiIg9TUkNERERERDKMhQsX0qdPH4YMGcLevXupUKEC/v7+XLlyJdH+27dvp127dnTu3Jl9+/bRokULWrRowcGDB1M4chERERERASU1REREREQkA/n666/p2rUrnTp1wsfHh6lTp+Li4sLs2bMT7f/NN9/wyiuv8Mknn1C6dGlGjBhBxYoVmTRpUgpHLiIiIiIioKSGiIiIiIhkENHR0ezZs4d69erZ2sxmM/Xq1SMwMDDRdQIDAxP0B/D3939sfxERERERSV6O9g4gLbBarQDcunXLbjFYLBZu376Ns7MzZrNyUfLf6RiSZ6VjSJ6VjiF5VjqGUr+4v5fj/n5ObcLDw4mNjSVv3rwJ2vPmzcuRI0cSXefy5cuJ9r98+fJjXycqKoqoqCjb85s3bwJw48YNLBbL04b/zGJi7PbS6Y7JZOHWrVtkzpxZ70eSYnQOJy2TycKt+/fJHBODOZV+bqVJN27YO4JUTedx0tJ5nAzsfA4/6fcJJTWewO3btwEoVKiQnSMREREREUn9bt++Tc6cOe0dht2MHj2aYcOGPdJepEgRO0QjyeXPP+0dgYg8K53GycDNzd4RSAaj8ziJpZJz+N++Tyip8QTy58/PuXPnyJ49OyaTyS4x3Lp1i0KFCnHu3Dly5MhhlxgkbdMxJM9Kx5A8Kx1D8qx0DKV+VquV27dvkz9/fnuHkqjcuXPj4OBAaGhogvbQ0FDy5cuX6Dr58uX7T/0B+vfvT58+fWzPLRYL165dw93d3W7fJyRp6f1IJO3TeSyS9uk8Tn+e9PuEkhpPwGw2U7BgQXuHAUCOHDl0ksoz0TEkz0rHkDwrHUPyrHQMpW6peYRG5syZqVSpEgEBAbRo0QIwEg4BAQH06NEj0XWqV69OQEAAvXv3trWtXbuW6tWrP/Z1nJyccHJyStDm6ur6rOFLKqT3I5G0T+exSNqn8zh9eZLvE0pqiIiIiIhIhtGnTx/efvttKleuTNWqVZkwYQJ37tyhU6dOAHTo0IECBQowevRoAHr16kWdOnX46quvaNy4MT///DO7d+9m+vTp9twNEREREZEMS0kNERERERHJMF5//XXCwsIYPHgwly9fxtfXl1WrVtmKgYeEhCQo/FyjRg0WLFjAwIEDGTBgAMWLF2fZsmWULVvWXrsgIiIiIpKhKamRRjg5OTFkyJBHhrGLPCkdQ/KsdAzJs9IxJM9Kx5AklR49ejx2uqmNGzc+0tamTRvatGmTzFFJWqL3I5G0T+exSNqn8zjjMlmtVqu9gxAREREREREREREREfk35n/vIiIiIiIiIiIiIiIiYn9KaoiIiIiIiIiIiIiISJqgpIaIiIiIiIiIiIiIiKQJSmqkAZMnT8bT0xNnZ2eqVavGzp077R2SpBGjR4+mSpUqZM+enTx58tCiRQuOHj1q77AkDRszZgwmk4nevXvbOxRJQy5cuED79u1xd3cnS5YslCtXjt27d9s7LEkjYmNjGTRoEF5eXmTJkgVvb29GjBiBysKJiIiIiEh6YrVasVgs9g4jTVBSI5VbuHAhffr0YciQIezdu5cKFSrg7+/PlStX7B2apAGbNm2ie/fu/PXXX6xdu5b79+/ToEED7ty5Y+/QJA3atWsX06ZNo3z58vYORdKQ69evU7NmTTJlysSff/7JoUOH+Oqrr3Bzc7N3aJJGjB07lilTpjBp0iQOHz7M2LFj+fLLL5k4caK9QxMRSTesVisxMTG6kCKSRlgsFmJiYnSTh0g6ERsbi9VqxWQyYTbrcv2TMFn1DpiqVatWjSpVqjBp0iTA+OAqVKgQPXv25LPPPrNzdJLWhIWFkSdPHjZt2kTt2rXtHY6kIREREVSsWJHvvvuOL774Al9fXyZMmGDvsCQN+Oyzz9i2bRtbtmyxdyiSRjVp0oS8efMya9YsW9urr75KlixZmDdvnh0jExFJn6Kiorh8+TJFihSxdygi8gRu3bqFk5MTTk5O9g5FRJ5A3A0EiSUvzp49y9atW3Fzc6NRo0a2RIc8SqmfVCw6Opo9e/ZQr149W5vZbKZevXoEBgbaMTJJq27evAlArly57ByJpDXdu3encePGCd6PRJ7EihUrqFy5Mm3atCFPnjz4+fkxY8YMe4claUiNGjUICAjg2LFjAOzfv5+tW7fSsGFDO0cmIpK2WCwWYmNjE1125coVhg4dSqlSpfDy8mLw4MFERkamcIQi8qDY2NjHnrP79u2jc+fOFC9enGrVqrFmzRoAjdwQScUeTGY8nND4448/KFu2LD4+PkyePJn169cTExOjhMY/cLR3APJ44eHhxMbGkjdv3gTtefPm5ciRI3aKStIqi8VC7969qVmzJmXLlrV3OJKG/Pzzz+zdu5ddu3bZOxRJg06dOsWUKVPo06cPAwYMYNeuXXz44YdkzpyZt99+297hSRrw2WefcevWLUqVKoWDgwOxsbGMHDmSN998096hiYikKQ9eQDl58iTh4eFUrFiRTJkyMWHCBDZt2kSfPn2oWbMmly5d4t69ezg7O9sxYpGMzcHBwfbvo0eP4uLiQqFChTh69Ch9+/bFzc2NMWPGkD17drJmzQqgC6AiqYTFYnkkcRH3fP369WzYsIGCBQvyzjvvYLVaGT9+PA0bNmTIkCFky5aNs2fP6nz+F0pqiGQQ3bt35+DBg2zdutXeoUgacu7cOXr16sXatWv1pVaeisVioXLlyowaNQoAPz8/Dh48yNSpU5XUkCeyaNEi5s+fz4IFCyhTpgxBQUH07t2b/Pnz6xgSEXlI3F3dD14MjRMSEsLYsWNZuHAhJpOJRo0aMWjQINzd3fntt99o27Yt7777LgBlypQBEr8oIyJJw2q1Ehsbm+hd22Bc+Bw9ejQ7duygUKFCdO3ald69e7Nr1y62b9/OvXv37BC1SMb1b5+JcSOlHlcXY/ny5fTr14+IiAiqVKlC5syZuX79OlevXuXs2bN06tSJbNmyceHCBU0B+QSU1EjFcufOjYODA6GhoQnaQ0NDyZcvn52ikrSoR48e/Pbbb2zevJmCBQvaOxxJQ/bs2cOVK1eoWLGirS02NpbNmzczadIkoqKiEv3SLBLnueeew8fHJ0Fb6dKlWbJkiZ0ikrTmk08+4bPPPqNt27YAlCtXjrNnzzJ69GglNUREHhL3d1lMTAw3btwgd+7ctmULFixg7969/PLLL5QrV47w8HDy5MnD3bt3qVSpEvPmzePy5cu4u7uTP39+vL29efnll+21KyLpnslkwtHRuCx37949HB0dyZQpE2Bc9xkyZAh+fn6MHDmSPHny2K4NeXh4kCVLFj799FOcnJwoUqQIhQsXxtfXFw8PD7vtj0h6929J/riRFRcvXmTTpk0ULVrUNiLy9u3bzJ07lzp16jB9+nTAmCI+Z86cWK1WWrRoQdeuXfnqq6/w8fEhIiICPz8/hg0bluz7lVbplotULHPmzFSqVImAgABbm8ViISAggOrVq9sxMkkrrFYrPXr0YOnSpaxfvx4vLy97hyRpTN26dTlw4ABBQUG2R+XKlXnzzTcJCgpSQkP+Vc2aNTl69GiCtmPHjunOE3lid+/efeQLhIODg21OWhGRjOLixYvs27fvse9/sbGxLFy4kAoVKuDu7k67du349ttvAbh8+TIbNmygXLlyvPTSS2TPnp1SpUqRI0cO8uXLxxdffEGNGjW4e/cuFy5cYNKkSTRr1ozVq1en5C6KpAtxd2ufOnXKlohIrNZFeHg4AwYMsF347NOnDxcuXABg9+7d7N+/nyFDhlC1alUKFChAtWrVAPD39+ezzz7j77//5ty5c8yfP59WrVrRrVs3Wx1NEUl648aNY968eY/9HA4LC+Ott96iWLFiDB06lI4dO/Lee+8BxvkeGhqKm5sbkZGR/P3337brKXnz5mXw4MEsW7aMQYMGUbVqVXx8fBg7diy//fZbiu1fWqORGqlcnz59ePvtt6lcuTJVq1ZlwoQJ3Llzh06dOtk7NEkDunfvzoIFC1i+fDnZs2fn8uXLAOTMmZMsWbLYOTpJC7Jnz/5IDZasWbPi7u6u2izyRD766CNq1KjBqFGjeO2119i5cyfTp0+33Z0i8m+aNm3KyJEjKVy4MGXKlGHfvn18/fXXvPPOO/YOTUQkRcRNd9GzZ0+OHTvGpk2byJUr1yP9/v77b4YPH85rr71Gw4YNWb58OZ999hnOzs68++67VK1aldmzZ1OvXj28vLzImTMnRYsWpX379hQoUICZM2cCEBERQbZs2ShfvjwrV67E398/pXdZJE24e/cuLi4uWK3WBHPfm0wmjh8/ToUKFZg0aRLvvPNOonPj/+9//yMgIICBAweSK1cuevToQUhICJMnT6ZQoUIUK1aMJk2aULx4cby8vHB1daV69eo8//zz9OvXj379+nHt2jVy5crFxo0befnll/nyyy/JmTNnSv4aRNKFqKgofv31V+rWrUuePHkSnNcxMTE4Ojryxx9/YLFYaNasGTly5HhkG0uWLGHr1q3s2LGDkiVLsnTpUj755BMGDhzIF198wdtvv81HH33E4sWLKVOmDGfPnqVEiRJMnjyZPHny8MorryTY3syZMzl+/HiK7H9apKRGKvf6668TFhbG4MGDuXz5Mr6+vqxateqR4uEiiZkyZQoAL774YoL2OXPm0LFjx5QPSEQynCpVqrB06VL69+/P8OHD8fLyYsKECSryLE9s4sSJDBo0iG7dunHlyhXy58/Pe++9x+DBg+0dmohIioi7w7t9+/Z07dqVK1euPJLUsFgsLFiwgMyZM9O7d29y5sxJ1apVuX37NrNnz6Zhw4aMGDGCvHnzcufOHSIjI9m9ezfz588nLCyMIUOGEBISQpYsWfDw8GDVqlU4OTlRpUoVe+yySKo3d+5cPvzwQ27evJlowqJ48eIUL16c06dPExkZ+Uh9wpCQEH766Se6du1qu1EjT5489O7dm2nTpjFixAjGjBnDn3/+iYuLC6dOnWL//v1MmjSJHTt24OrqSmhoKAUKFOD+/fts2bKFypUr4+rqmhK7L5LuHD16lHfffZehQ4fy8ccfY7FYbCMp4s7xd999l969e3PlypVHkhpRUVEsXryYRo0aUa5cOcC4prt//37Wrl1Lt27dePfdd6lbty43b97k3LlzhIWFMWrUKKZMmcKQIUNYtWoVrq6uREZGMmfOHCpWrEjjxo1T9heRhiipkQb06NGDHj162DsMSYMSG+Iq8qw2btxo7xAkjWnSpAlNmjSxdxiSRmXPnp0JEyYwYcIEe4ciIpLkrFarbSRG3EWTh+/6jruo4u/vz7Vr1zh06BClSpVKsA2z2cymTZt48cUXE9yl/corr9iKCr/++uuPfK98/fXXCQgIYMiQIcyZM4fAwECCg4OJiIigS5cuvP7668m5+yJpVokSJYiIiODYsWOUKFEiwbLY2FgcHBzw8/Nj7969XLlyhcKFCycoIhwcHEzmzJmpU6eObb0yZcpQq1Yt1q5dy4gRI2jQoAENGjTg/v37ZMqUiYsXL1KwYEEuX77M4cOHmT9/PkeOHCE4OBg3NzcmTpyIm5tbiv4eRNK6uM/cAgUK0LhxYzZv3szHH3+coE/c5/Arr7xCWFgYR48epVixYgm24eTkxIkTJ6hbt26C7VatWpW1a9eyd+9eW70qgIoVKxIdHc2UKVO4du0a0dHRbN68mV9++YXbt29Ts2ZNBg4c+Mj7i8RTTQ0REREREREROzCZTDg4ONiSGEePHk30rm+LxYKLiwslSpRgy5YtREdHJ1gG4OPjQ3BwcIJlxYoVIyYmhitXrgAQFBTEiRMnCA8PZ8GCBZw9e9Y233f9+vVp2rQp8+fP5/r164wbN+6Ru8tFMqLY2FhiY2MTtBUvXpxChQrZ5rtP7IZCf39/Tpw4wdmzZ21tced3mTJluHTpErdu3bKtmzNnTvLly0dkZCQ3b97k3r17HDp0iIiICMLCwvjf//7Hiy++SO7cufHx8cHX15emTZuyevVqjh07pqniRP5f3Dl1/vx5zp8/n6DNYrEkOJ/jzklXV1eqVq3Kjh07AB6pH2qxWHBzc6NIkSJs3bqV+/fvP/J6VapUITAwkKioKNt2CxQoQEREBE5OTkRGRvLDDz+wfPlypk2bRsuWLcmWLRsfffQRmTNn5oMPPmDDhg1cvnyZJUuWULt27eT49aQbSmqIiIiIiIiIJJOHL6A8KDQ0lG+//ZbPPvuMefPmUbp0aTZt2mRb78FtADRq1IiNGzfaigE/OKqjVatWtpEWcW7fvs2+fft46aWXAPjtt9/o0qULxYoV47PPPqNhw4a0bNkSgBo1atC9e3fbRZTY2FiN/JYMY8mSJbRp04YzZ84ACZMUDg4Oj1zgzJEjBy+88EKiSY24vi+99BJ37tzh6NGjAAlGYxUuXJh8+fIREBBATEyMbd2//voLb29vcubMSVBQEN9++y0vvPACXl5eBAQE8Omnn5IvXz7c3d15//33+fjjj6lYsSLAY4sXi2Q0JpOJgwcPUqdOHX788ccEy8xms+0cPXLkCLdu3QKM87ZcuXJERkayd+9eIPHP4QYNGrBx40bbeg+e+23btmXr1q2sX7/e1rZ9+3bOnTtHjRo1cHJy4vLly3zxxRdMmTIFHx8fpkyZgqenJwCFChWiYMGCSfzbSL+U1BARERERERF5SlFRUXz88cfs2rXL1vbgRcoHL6A86OjRozRr1oypU6cSGxvL/PnzAeOiJiS8mGI2G1/dW7VqxaFDhzh37hxgXLiJW9asWTPKli1L586dWb16NQcOHODLL7+kUaNGFChQAIDXXnuNzz//nODgYEJCQhgyZAguLi6214mbDgtIMIJEJL2KO95v3LjB8ePH2b9/P4AtEXn79m1mzZpF06ZN6dChA8uWLQMgc+bM1K1bl507d9qmkHuQ1WolX758FChQgP3793P79u0EywC6du3K77//zqeffsqVK1f4448/OHr0KPXr1weM0RytWrVi7NixnD9/nr179z4yGsNisdi293AMIhlRXEK+dOnSeHl5cenSJe7fv2/7PDt9+jQdO3YkZ86c+Pv789prr7Fo0SIAvL29KVy4MCtXrgQS/xxu3bo1+/fv5+LFi0DCz+FWrVrRpEkT2rdvz8iRI+nbty+TJ09m7NixZMmSBZPJxHvvvcf27dsJCgpi3Lhx+Pj4pNjvJr3RO56IiIiIiIjIU3JycuLkyZM4OsaXrHzw35s3b2bAgAEsWrQowYXNefPmERoayrZt2xg3bhxjxoyhSpUqLF26FEh4gTLu3y+88AKA7cJrnNu3b3Pv3j1mz55N2bJl6d27N1WrViU0NJShQ4fa5tkvUaIE9evXp0CBAlit1kdGYzx4cUYkvbNYLLYLnS+++CK5cuWyJScdHR2xWq18+umnTJ48GW9vb7y9vWnfvj2TJ08mNjaW559/nqioKNt0NQ9vG6BmzZocOHCAy5cv25aZzWZiYmJ455136N27N+vXr6d8+fK8/vrrNGjQgDfffBMwRoM0aNCAJk2a4Orqmuiorwfr8YhIfELewcGBUqVKcerUKU6fPm1bPn36dM6fP8/atWvZs2cPFStW5JtvviEgIICiRYtSqVIlVq9eDST+OVy3bl2io6M5ePCgbdm1a9cICAggKCiISZMmMXz4cNavX8+BAwcYOHAgnTt3tq2fM2dOMmXKlBK/inRPhcJFRERERERE/oOHi3nH3b0dZ82aNWzatIkyZcowatQocuXKxaJFi1i4cCFLlizh1q1bHDlyhPr169sSDhUqVODtt9+mf//+REREkC1btgTbjCs+XKVKFTZt2kT16tU5cOAAf/zxB0uWLKFRo0b89NNPzJgxg7Nnz1K8ePFEL3bGxR530Ucko4q7yLh3714iIiLw9vbm0KFDtpEXv//+O5s2bWLlypUULVoUgCxZsvDVV19RoUIFXnjhBUqUKMGKFSuoXr16ghEbcefeK6+8wsqVKzl69CiOjo6sXbuW3377jQMHDvDtt9/y7rvvUq9ePe7cuUO5cuUSjTPunFXCUTKKuFGDiX1GxS17+JyIO0927NjBlClTKFy4MA4ODly/fp3Dhw9TokQJ9uzZw6pVq/jzzz/Jly8f165dI3/+/Ozbt4+ffvqJunXrUqNGDZYtW0Z0dDSZM2dO8Npxn8MVK1Zk0aJFXLhwgXXr1rF7926uXbvGwIEDGT58ON27d6d79+7J/nvK6PSOKCIiIiIiIvKAHTt22O6stlqttkfc3dcPJwtOnz5N165dbXeDXr16ldGjRzNt2jSWL1/O5s2b+fLLL1m6dCl79uwhR44cXL16FRcXlwSjN0qWLInZbGbjxo0AidbiaNSoET/88AO+vr68++673LhxgwkTJjB9+nRMJhNOTk6UKFECk8mUaIFj3dUtGUVsbGyC6WMerhGzcuVKChcuTKNGjZg0aRJbtmzh5MmTthoYCxYsoFatWly+fJn333+fsmXLMmzYMPLly2c7j+rVq8eff/4JJDy34i621qpViwsXLtCmTRu8vb1tI6e+/vprGjduDEDRokVtCY3EatnonJWM5p+S7nHLHkxoxCU59uzZQ7t27bh16xaurq62aZ6OHTsGGOfl/v37GTRoEEWLFsXT05OZM2fSp08fWxLCx8eHTJky2T6HE3sPeeWVV1i+fDkzZ87Ey8uLRYsWYbFYGD58eHL8OuQxNFJDRERERERE5P8tW7aMKVOm8Pnnnye4eAnGxZTIyEh27dqFh4cHpUqVAiBbtmzMmjWL5s2b4+Xlxcsvv0z27NmpWbMm3t7egDHXtpeXF0uWLKFSpUqUK1eOo0ePcvHiRUqWLAkY02bcuXOH9evX06RJkwQXN+Mu4HTu3JkcOXLQuHFjvLy8/nFfNBJD0pOHR0jFiY2N5a+//qJIkSIJiuzGHf9Xr17l9OnTVKhQgUyZMmG1Wrl37x4TJkygdu3afP/995w7d44vvviCxYsXs3fvXkqXLk3p0qUZMmQI69atw8/Pj759+/Liiy/aivoCvPzyy0yfPj3R0VUWi4UsWbIwatQo3N3deeWVV/Dw8PjHfdM5KxlFXD2YxI75w4cPM2DAAKpUqcKAAQMSLLt06RKLFy/myJEj1K5dmzZt2mA2m7l//z5TpkwhX758zJ8/nyxZsvDuu+/i4+PD/v37uXv3LpkyZSJ//vycO3eOiRMnUqFChUcKc3t5eeHj48Pvv/9OgwYNEozAiov1008/pV+/fo+c85KyNFJDRERERERE5P81adKE1atXU7t2bVtS4dixYwQGBjJp0iQKFCjAG2+8QYsWLVi3bh0xMTF4eHjg6elJYGAg0dHR5M2bl6JFixIREQHE3+nZoEED1q1bBxiFvcPCwpg8ebKtz6ZNm8iePbutz4MXe+Iu5ubNm5cePXrYEhoxMTGJjugQSW8eN2KhYsWK1KpVi+XLlye4qzogIABfX18KFixIu3bt6NSpEzt27MBkMrFr1y7Onj3LG2+8gaOjI15eXgwaNIiSJUva6mqULl0aR0dHAgIC+OWXX+jYsSOenp7cvHmT3bt3c//+ffz8/IiKirKN1kgsEdm7d2/eeustPDw8sFgsiZ6zGo0hGY3ZbE7wGRc3IhJg7dq1LF++nB9++IH79+/b+uzZs4eXXnqJOXPmEBERQc+ePenSpQsRERFkypSJgIAAXnvtNbJkyUJsbCzZsmWjTZs2hISEEBISQqFChciTJw+FCxemcePGtoTGpUuXmDt3LgcOHCBPnjx4e3uzePFiIGGNrLjzNGvWrEpopAJKaoiIiDxk6NCh+mIhIiKSDjw8jcuD4i4uPtzH0dGRsLAwfv/9d6KjowHo2bMnHTp0YOvWraxdu5YDBw7w3HPP8dVXX3Ho0CHAKDS8YcMG23RS9erVY/PmzURHR9subjZr1ozg4GDOnj3LSy+9RN++fZk9ezb16tWjQoUK7NixgxEjRnDr1i1CQ0Mf+/dI3B2ucfHq7m5J7y5fvszEiRP566+/bG1Wq5Vr167ZRkPt27ePqKgoAC5evMioUaPw9fXl3LlzfPvtt5w/f553330XAA8PD0JCQhLcpV2wYEGKFy/OkSNHuHPnDq1atcLNzY1hw4axe/duAC5cuMD//vc/fv31V27dukXevHnp0qULzs7OwOOTE3FJDLPZrHNWBDh+/DgVKlTg+eef58aNG7ZaTzExMRw6dIhmzZpx4sQJTpw4YVunV69elC1blu3btzN37lymTZvGb7/9xty5cwHjHI6baiomJgaAmjVrcvz4cQ4dOkTOnDnp27cvv/76K2+88Qbbtm1j3rx59OzZk8WLF5M5c2YcHR3p168fAQEBKf9Lkf9ESQ0REUkW33//ve0PE5PJhKOjIwUKFKBjx45cuHDB3uGJiIhIOvRg3QtIeIHx4eRF3MVFk8mU4E5QgOnTp9OrVy927twJQNOmTbl06RLlypWjYsWKuLq68vnnn3Pt2jUCAwMBY3qp/fv3c/HiRQAaNmzI4cOHE/zdU6dOHe7du0dgYCBms5l27doREBBAjRo16N69O3/88Qd3797F1dWVGzduPHY/zWazbsCQDCHufP7ss8/o1asXAwcOZOvWrYBxfh8/fhwHBwc++OAD/vzzT65evQrAkSNH2LRpE6NGjSJ37tw0bNiQ77//ngMHDvDnn39SsmRJMmfOzN9//w0Y7w+Ojo44OTlx9OhRDh8+jNlsZvr06Rw5coT3338fX19fSpYsyapVq6hSpQo5c+bEycmJ6dOn07Rp03/cDyUxJKPZtWsXs2bNAhLWpYhjsVg4cOAAx44dY+DAgURGRgJGon737t3Ur1+fYsWKsXr1agDOnTvH1atXadq0qS2J2LJlS1q2bMlPP/0EQN26dVm9ejWxsbE4OTkB4O7uztWrVzlw4AAAb7zxBtOmTeP+/ft07NiRQYMGUbBgQYYPH26bCrJkyZK26SUl9VJSQ0REktXw4cP58ccfmTp1Kg0bNmTevHnUqVPH9keLiIiIyNOyWq0JCuuaTCbbqIgdO3bw9ddfc+fOHduyB23dupV3332XcuXK8dZbb7Fs2TJbcqNatWoUKFDAdsGzYsWKFCxYkKxZs9rWL1++PDly5CA4OBgwCodGRkZy8OBB2zayZs1qS3pYrVZcXFyoXr06V69etcVcpUoVhg8fzvvvv09YWBgrVqygTJkyFCtWLFl+ZyJpSdx50qJFC8CoX/Ppp5/alufMmZOAgAD69evHpUuXOHnyJACnTp2icOHCtnP2/v37eHp6UrZsWQICAnBwcOCll15i3rx5HDt2DJPJxJUrVzh+/DgRERFs3rwZgObNm7NmzRo+//xzPv74Y44dO8Zff/1Fy5YtE0xLE3dXuIgY58PcuXMZMWJEgpoUDypWrBhly5bl5ZdfZseOHbYEyP3793F3d8dsNtOgQQN+++03AMLCwnB1deXmzZtA/OinBg0asHfvXgDeeecdLl68yKBBgwgPD+f27dtMnTqV7NmzExgYSGhoKACvvvoqs2fPJigoiNOnTzNhwgT8/PyS/fciSUtJDRERSVYNGzakffv2dOnShZkzZ9K3b19OnjzJihUr7B2aiIiIpHFxhXVNJhMnT55k1qxZ1K1bF2dnZ+rWrcuZM2dsd0jv27ePb775hrNnz7J9+3Z69uxJdHQ0H330EW5ubvTr14958+YBxlz6OXLkICgoCABfX1/y5MnDuXPnbHec5smThyJFinD69GkuXLiAo6MjFSpUYPPmzdy7d4+sWbNSoEABVq1aZYsVYNu2bXTv3t32/MyZM7Rv3x5/f3/b3eODBg3Snd2S7j2clIxre1DcefDSSy8B0Lp1a0JDQ5k0aRL379/n2rVrlCxZEjc3N4oVK8b69esBY877vHnzJpiuCqBs2bIcPnwYgE8++YQbN27w2muv8c0339C7d2+8vb1p0KBBgiRFtmzZaNmyJW+99Rb58+e3xf2gBxMcIhmdo6Mj1atXJ1u2bOzZswd4dLSGg4MDfn5+mEwmOnfuzPz589m0aRPXrl0jJiaG8uXLU6VKFXbt2sX9+/cpXrw4rq6utvM37r0hJiaGnDlzcunSJQoXLsxXX33F0qVLqVOnDkWKFKFw4cKMHz+eXr164ebmBhjvM9mzZ09wo4KkPUpqiIhIiqpVqxaA7S4qgPXr11OrVi2yZs2Kq6srzZs3t/2xEieuMN/DEqt/YTKZ6NGjB8uWLaNs2bI4OTlRpkwZ20WFB23dupUqVarg7OyMt7c306ZNS4K9FBERkZQQFBREq1atyJEjB2XLlqVr166cPHmSv/76i4iICD766CMGDx7MggUL6NChA9u2bSMyMpJChQrRt29fvv/+e9555x2++eYbKlasyLx587BarRQoUABPT0/OnDnDlStXcHFxoVixYpw4cYLz58/bXr9SpUrcuHGD/fv3A8bojFWrVtkKhK9YsYKZM2c+EveDF0Q9PT3x9vamTp06rFu3jnXr1mnaC8kQHkxKgjHHfmLTqlksFnLmzEmhQoW4cOECAwYMYNGiRWzfvp2DBw9SoEABcuTIQe3atW3z4JcvX54sWbKwdOlSADJlysS5c+c4dOiQ7fyqVasW8+fPp1q1asyZM4c8efIwfPhw5s+fT79+/RKN48G4RTK6uNpUD4r7fCtevDjZs2dnw4YNQOI1rho3bszGjRupW7cujRo14qOPPiJbtmzs2LGDEiVKUL16de7cucPOnTvJnj07NWvWZPXq1bbv9bGxsUydOpV69eqRM2dOALp168Yvv/zChx9+yG+//cbYsWPp1KkTDRs2JHPmzMDja99I2qJUsoiIpKgzZ84A2O6SWLduHQ0bNqRo0aIMHTqUe/fuMXHiRGrWrMnevXsTTWQ8ia1bt/Lrr7/SrVs3smfPzrfffsurr75KSEgI7u7uABw4cIAGDRrg4eHB0KFDiYmJYciQIeTNmzcpdlVERESSSdx0FtevX6d48eK8//771K9fnzlz5jBixAhKlCgBwN27dxk/fjwlSpRg8uTJ1K1b17aNN998k19++YVp06axd+9erFYr2bJlY/fu3VSpUgUfHx927drFvn378Pf3p1q1avz4448cPXqUwoULA1CuXDmuXbvGqVOnABg5ciTDhg3Dw8MDAC8vr0Tjf/CCqNlsZtiwYcnyexKxt7gLmVar9ZEpaK5cucIvv/zCpUuXKF26NG+99RaBgYFUq1YtwZQ1cf9u2LAhy5cvZ82aNZw5c4axY8dSuHBh7t69CxgjxBcuXEhISAilS5emU6dOvP3222TLlo2GDRvy66+/Yjab6dWrly0Gb29vpkyZ8khsiU2Zk9gUOiIZidVqTZAQMJvNtvPi0qVLODk5kStXLsBI2BctWpRt27bZ+j6sdu3a3Lhxg9OnT/P555/z008/8c4771C4cGEiIiIoVqwYxYoV488//6RmzZp89NFHHDt2jM6dO1O1alVOnDiB2Wxm1KhRuLi42LZbtmxZypYtm5y/CkkF9I4sIiLJ6ubNm4SHh3P+/HmWLFnCsGHDcHJyokmTJoAx7DtXrlwEBgbyySefMHjwYAICArh58yZDhgx56tc9fPgwW7ZsYeDAgfTq1YulS5dy9+5dWxExgMGDB2O1WtmyZQufffYZAwcOZMOGDba5sUVERMT+Hi7+DfEXR1566SXGjh1LgwYNMJlMVK9enbNnz3Lo0CEAypQpQ4ECBShQoAA1a9a0bQ9g4cKFjB07lipVqrB582Z++eUXsmXLZptLP+5O73379gFQtWpVQkJCbMXDAapXr86aNWvo0aMHALly5SJPnjzJ+NsQSR0enn7pcctNJpOt1s2Dd2ofPnyYJk2aMGnSJO7du8cPP/wAkKAGTZy4871Nmzbs3buXixcv0rt3b9zd3Zk+fToFCxYEoH79+sTGxrJ//35MJhNvvfUWM2bMIDg4mDfeeIMjR47YEiFxscVt32q1EhMTY3tdJTBEDBaLJcH5HMdqtbJjxw7efvtt8ubNS506dejQoQNbtmwBjCkafXx8OHXqFLdu3Up0dES+fPnw8fHhjz/+wGQyMX78eLZu3Yq7uzs5cuQAwN/fnz///BMwppX77rvvmDlzJgULFqRXr15s3LiR6tWrJzoSRNI3vUuLiEiyqlevHh4eHhQqVIjWrVuTNWtWVqxYQcGCBbl06RJBQUF07NjRdkcHGBcR6tevzx9//PFMr+vt7Z1gmzly5LDdSRkbG8vq1atp0aKF7YsNGHNo+/v7P/XrioiIyLN7XPHvf1OyZEkKFizIxo0bbetXrlwZi8Viu5vbZDJx+/Zt5s2bR758+Rg9ejRly5Yla9asXLhwwVZHw8fHBwcHBzZt2gSAn58fw4YNo127drbXc3BwoECBAkm12yJpxr9NvxS3fMeOHRw+fJhOnTolmNJpzpw5XLt2jb/++ouvvvqKkSNH4ufnx6+//grwyN3gAHXr1iUmJoadO3eSK1cuhg4dyocffkjPnj2xWCzkyJEDV1dXli5dakuEdu7cmYULFxIaGkpAQAD169dPNF6TyYSjo6OmpRF5iNlsxsHBgZiYGDZv3mwbeQEwa9YsnJ2dmTt3LitWrCBr1qwMHDiQY8eOAVCiRAliY2NtycqHb1AAo9D3hg0bsFqt1K9fnw0bNvDbb7/ZZleoVasWp06d4vbt2wC2kVcTJ06kS5cuthkgdO5mPEpqiIhIspo8eTJr165l8eLFNGrUiPDwcJycnAA4e/YsYFyAeFjp0qUJDw/nzp07T/W6DyYq4ri5uXH9+nUAwsLCuHfvHsWLF3+kX2LxiIiISPJ5eE7uuHn2L1y4wMmTJ/n666/54IMPCAsL+8ftmM1mateuzZo1a2zbbNasGcHBwba/AeJeL2vWrLYLLNevX2fhwoU899xzrF69mps3b+Lm5ka3bt0YNGgQYNyV2qlTJ4oWLZqUuy6S5litVnr16oWfnx+7du0CHr1YOXfuXLJnz07btm0ZN24cP/74o63v9evXOXHiBPXr17fNg1+5cmU6dOjAgQMHiI6OfiSRGXeneMWKFW21cby9vZkwYQLlypWzXdCcOXMm3bt3T5B0ibvjOzY29l9HmIhkNA/XxXh4xMOxY8d49dVXyZ49O126dOHnn38mLCwMk8nEq6++ysSJE3nllVcoWbIktWrV4u+//7bVvPD29iZv3rz/WFejSZMmHD16lNOnT+Po6EiJEiVs7wsALVq04Pr162TPnj05dl/SMCU1REQkWVWtWpV69erx6quvsmLFCsqWLcsbb7xhK6D5pB5358Xjvpg87u4xDUsVERFJGf/l4qGjY8Jyj9u2bcPX1xdvb29GjhzJxIkT2bVrl+2GiH/6PG/SpAk7d+7k2rVrADRt2pTw8HDbnaNg3OjQqlUrgoODqVChAt7e3ly/fp2JEycyZ84cnJ2dsVqttGrViho1agDxf4vobwnJ6C5dukRYWBg3btxg7Nix3L59G7PZbEtsnD17luHDh9O3b18OHz5Mz549adCgAdu3b+fWrVu4ubkRHh5OlixZEtzAVLp0aSwWCxs3bgQSJkrizrsXX3yRn3/+matXr9r6PDjPf6NGjahUqVKicTs4OKjAt8hDzGaz7TP49u3btnPJYrFgsVgYO3YsERERBAYGsm/fPnr27EnWrFkBY2qoB+tUfvPNN7i5ubF06VIAihQpQokSJWwJzcTOP19fX6Kjozl8+HCi8T3894FIHCU1REQkxTg4ODB69GguXrzIpEmTKFKkCABHjx59pO+RI0fInTu37Q8mNzc3bty48Ui/uIsb/5WHhwdZsmTh+PHjjyxLLB4RERH5b/7LxcMVK1bQs2dPQkNDsVqtfPfdd+TKlYtLly7Rt29f/P39CQ4O5siRI/+6rdq1a3Pnzh0OHjwIQO7cufH09GTbtm3cv3/f1u+1117j559/plu3bqxdu5a5c+fSoEEDGjdujJOTU4ILOw/SFBeS0V29epXTp0/z888/A0adOoifJurUqVOEhYXx/vvv4+zsjJ+fH0OHDsXR0ZG1a9cCxsjoY8eOcfnyZdt2zWYzd+7csd3V/eC5F7ftDz74gC+//BIPDw9b+8PnZGJT3IhkVEeOHPnHZPzff//Nm2++Sf78+WnUqBHTp0/n+vXrmM1m1q9fz6pVq3j77bfx9fXFxcWFEiVK2IpyX7p0iY8++oiiRYuyfv16WxHv/fv3ExMTg7u7O2XKlOHKlStcuHABePTGgJw5c3L16lUaN26cfL8ESZeU1BARkRT14osvUrVqVSZMmICbmxu+vr7MnTs3QcLi4MGDrFmzhkaNGtnavL29uXnzJn///bet7dKlS7a7QP4rBwcH/P39WbZsGSEhIbb2w4cPs3r16qfapoiIiBgSm54mbnqLCxcucP78eQCio6MB2L17N6tXryZv3rwEBwezfv16unXrhpubGz4+Pnz77bcULlyY/fv3A/+cWMifPz9ly5YlICDAdvHE19eXNWvWcO/evQR9q1evznvvvWe7s9tqtT5ywUUFg0UScnd358SJE5QpU4YBAwYwb948AgICbMv379+Pj49PguniihcvToUKFVi5ciVgjKi6dOkSU6ZMAYxExKZNm8iePbst8fFgYjTuPPTy8qJr165kzpz5sfHpnBUxjB49mpYtW9pqRT38+RYWFsaQIUO4fv06s2bNonbt2nzxxRd89tlngPEZffXqVV555RXA+Oy1Wq22xOHx48fZuXMnvXv3pnz58gDs2bOHGzdusGPHDgAKFCjAtWvX2L59u20bD4uriyHyX+idXkREUtwnn3xCaGgo33//PePGjePq1atUr16d8ePHM2LECF5++WVy5szJ0KFDbeu0bduWrFmz0rJlS7755htGjx5NtWrVKFGixFPHMWzYMMAoPjZ27FhGjhzJSy+9RJkyZZ51F0VERDK0h6enuXXrFo6OjgQHB/Pqq6/Su3dvADJnzmwrCu7l5QUYSYnQ0FCKFSsGGNNYZc6cGT8/P44cOcLFixeBf54GqmLFiixZssSWNJkyZQpr1661za3/oLjpa8C42KKRGCL/LDAwEF9fX0JCQqhYsSLvv/8+M2bMYPPmzQAULFgQR0dH22gpgKxZs1KgQAFbwWB/f38+/PBDvvvuO/z9/alYsSL79u1jxIgRhIeHc+3atceeixqJIfJkypYti7u7OwcOHAAe/dwMDAxk5cqVTJo0iYYNG/LFF18wZswYZsyYQWhoKPnz5yc2NtZ2IwIYn5NxicP79++TJ08efv31V65du8acOXNwcHDA3d2d+fPnA8boyYCAANq0aaPpGyVJKakhIiIprlWrVnh7ezN+/HheeuklVq1ahbu7O4MHD2b8+PE8//zzbNu2zXZxA4w7wpYuXYqLiwv9+vVj7ty5jB49mqZNmz51HOXLl2f16tV4eHgwePBgZs+ezbBhw2jZsmVS7KaIiEiG9bjpaXx8fBgzZgwrVqxg/fr1WCwWHBwc2LNnD2XLluX+/ftkypSJggULsm3bNiD+Ikzx4sXZt28fp06dStCemOHDh7N27VqcnJwAyJs3b4LCow9KbPoaEXlU3Dl37tw5XF1d8fHxAYxaGJs3b+arr74C4PnnnydbtmwsWbLEtu7Zs2fZvXs3x48f5/Llyzg7O/P222+zbt06KlWqxHvvvcfKlSuJiIggV65ctpo4idFIDJEnU758ebJly2YbMfnwZ11QUBC+vr4ULVrUtrxJkyZ4eHiwatUqW22rGTNmJJi+MTg4mODgYOrWrUvXrl2ZPXs2+fPnZ8KECbRv354dO3bY3g88PDwoVapUoq8v8ixMVqXJREREREREJAldvHiRChUqcPr0aY4dO4a/vz8//fQT9erVA6B9+/aEhYUxfPhwqlWrxosvvkjFihX5+uuvAejatSv79+/n999/x8PDgzt37tC2bVt27tzJ4MGD6d69uz13TyRDmz59Ou+//z61atVi586dZMmShRdeeIHAwEBGjBjB+++/z/r163nllVdo3bo1VatWZdu2bVSoUIGJEycyYcIE2rVrZxtxEZekuHLlCi1atKBEiRLMnj1byQuRJPDee+8REhLCokWLyJ49O2AkKE0mE8OGDWP79u2MGzeO8uXL2xKXderUoXTp0kybNo2ZM2cycuRIypUrR69evTh48CDr16+nadOmdOnSBYB9+/bh7u5O4cKF7bafkvHoE0JERERERESSVGLT08ycOdM2PU2/fv1wcHDgq6++IioqCjc3twR3cH700UfcuHGDFi1asGjRIoYMGUK+fPkoWrQoISEhtvocIpLygoODKVu2LNWrV2f16tUcPXqUFStW0LNnTyZPnszy5ct5+eWXWbp0KRaLhalTp1KuXDmaN29OkSJFOHnyJGAkM06cOMFbb71Fw4YNKV26NNmyZaN///5KaIgkER8fH27cuGGbgspisdgSin5+fty8eZO//voLMEZSnDt3jtu3b5MvXz4AOnTowLRp03B0dOSdd95h1qxZ1KhRg2bNmgFGgsTPz08JDUlxjvYOQERERERERNKHuLs/E5ueZtasWURGRlK7dm3Kly/P559/TuvWrZk2bRpnz56ldevWtu34+PiwaNEixo4dS79+/fDx8eHnn3+mZcuWXL9+XRc8RewoODiYl19+mTFjxgDx01L16tWLXbt2MX/+fJo0aULjxo1p3Lixbb1ly5Zx/PhxKlasaGsrWrQohQoVomTJkowYMYLKlSun7M6IpHMVKlRg0aJF7Nq1ixo1agDg4OAAwAsvvEDFihX5/PPPKVKkCJUqVWLRokXcvXuXDh06AJApUyYaNGjA888/T/bs2R+ZQkpTSom9KKkhIiIiIiIiSSLu4oaLiwtLliyhTp06Caan2bZtG9OmTePdd9+lZs2avPnmm8yfP5+goCCee+45wLhAarVa8fX1Zf78+QmmpgkODqZq1aqYzWZbAkVEUk7ceXfnzh0AYmNjbRdIc+bMyeLFi221bO7fv8+CBQvInDkzmzdvZsuWLbzzzjs0atTItj1HR0dGjRqV8jsikkGUKVOG3Llzs3//fiBhTZpMmTLx1VdfER4eTt++fTlz5gyurq4MHz4cb29vwPhct1qt5MiRwy7xizyOkhoiIiIiIiKSpB6cnmbEiBGULl0aDw8Phg8fzuTJk8mXLx/Nmzfn888/p3PnzoSFhZEnTx7AuIBiMpmIjIwkODiYkydPcuXKFebPn4+vry/9+vWz9RORlHX//n3u3r1LhQoVgPg7vuM4OTnZEpOZMmXi4sWL/Prrr+TPn5/BgwfbpqwRkZTh4eGBt7c3wcHBnDhxgrt37/Lnn3+yYsUKHB0dmTlzJosWLWLPnj24urrakhkP0uetpEYqFC4iIiIiIiJJql69epQtW5YJEyYA8Xd337x5k/bt25MlSxYWLFiAo6MjFosl0emkrFYrGzZs4KOPPsLR0ZFmzZrRoUMHvLy8UnhvROS/ijvnIyMjcXZ2tnc4IhnajBkz+OSTT7hz5w5Wq5USJUpQv3593nrrLSpXrqyRj5ImKakhIiIiIiIiScZqtdKgQQM8PT2ZMWNGgulpAKKiomzT08SxWCxYrdZH7vq+f/8+jo6Outgikso8LhkpIqnPkSNHWLlyJaVLl6Z+/fqPfAaLpEWafkpERERERESSzJNOT/NgouJxF0czZcqUfIGKyFNTQkMk7ShVqhSlSpWydxgiSUojNUREREREREREREREJE1Qal1ERERERESSnMVisXcIIiIiIpIOaaSGiIiIiIiIiIiIiIikCRqpISIiIiIiIiIiIiIiaYKSGiIiIiIiIiIiIiIikiYoqSEiIiIiIiIiIiIiImmCkhoiIiIiIiIiIiIiIpImKKkhIiIiIiIiIiIiIiJpgpIaIiIiIiIiIiIiIiKSJiipISIiIiIiIiIiIiIiaYKSGiIiIiIiIiIiIiIikiYoqSEiIiIiIiIiIiIiImmCkhoiIiIiIiIiIiIiIpIm/B/bm9ojwbolswAAAABJRU5ErkJggg==", "text/plain": [ - "
" + "
" ] }, "metadata": {}, "output_type": "display_data" - } - ], - "source": [ - "# Plot training loss metrics comparison between 4-bit and 8-bit\n", - "print(\"\\n==== Training & Evaluation Loss Comparison: 4-bit vs 8-bit ====\\n\")\n", - "plot_loss_metrics(flflow_4bit, flflow_8bit)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "397cb9c7", - "metadata": {}, - "outputs": [ + }, { "name": "stdout", "output_type": "stream", "text": [ "\n", - "==== Aggregated Performance Metrics: 4-bit vs 8-bit ====\n", - "\n" + "==== Percentage Difference (8-bit vs 4-bit) ====\n", + "\n", + "Avg Training Loss: 8-bit is inf% higher than 4-bit\n", + "Agg Model Loss: 8-bit is 0.52% higher than 4-bit\n", + "Local Model Loss: 8-bit is 1.13% lower than 4-bit\n" ] - }, - { - "data": { - "image/png": "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Wo2qVatizpw52Lx5c4FMK+Lj44PQ0FD069cPNWvWRNmyZWFmZgYjIyM4Ojqifv364muScf7sL774AuHh4Rg9ejRq1qwJGxsbGBkZwc7ODnXr1sWUKVMQHh6ODz/88L23I6PCHNv78uuvv2L16tUICgqCpaUlLCwsUK9ePWzcuDHb6SD0GTBgAH7++WcEBARIfqafW5988onOXPMffvih3hF/VlZWWLduHQYPHoy6devCzc0NFhYWMDIygr29PWrXro1x48bhypUrqFy5co5jMDU1xfbt2/Hnn3+iS5cuKF++PNRqNZRKJaytrVGtWjUMHDgQ58+fx/Dhw/PcZgDo0aMHjh49irZt28Le3h4mJibw8/PDzJkzsWvXrhwvqJzG398fu3fvRtOmTWFra5unubAVCgXGjBmD+/fv4/vvv0ezZs3g4uIimSIHAJydnXH16lVxCqqMbG1tcfToUYSEhKB06dIwNjaGu7s7hgwZgkuXLmX5GtnZ2eH48eP46quvUKZMGRgbG6NMmTIICQnBhQsXUKFChVy3LydcXFxw4MABtG3bFqVKlSqw6ZyMjY2xf/9+jBo1Ch4eHjA2NoajoyM6deqE06dPo379+tme46+//kLfvn3h6uoqWbRVrtGjR+PSpUsYNGgQqlSpAisrKxgZGYmLds6dOxdXrlxBjRo1cn0NQ2nUqBGuX7+OefPmoWnTpnBycoKxsTFMTU1RtmxZNGnSBOPGjcOJEyfQvXv39x5PUX+uDZ2vpUuXxsGDB7FlyxZ07twZHh4eUKvVMDU1Rbly5dCiRQuMGjVKcoyxsTFWrlyJI0eOoHfv3vDz84OlpSVUKhWsra1RpUoVdO/eHb///jtOnz79XuMnIiIiw1IIwnv+jT8REem4d++eZIGqRo0aiVNUEBEVZXv37kWbNm3EKRk6duyIP/74o1isF0BERERERCUP/ydDRERERPmmefPmkkVVN2/ejAEDBhgwIiIiIiIiotxjBzoRERER5auePXviu+++E7eXLVuGCRMmGDAiIiIiIiKi3OEULkREBsApXIiIiIiIiIiICj92oBMRERERERERERER6cEpXIiIiIiIiIiIiIiI9GAHOhERERERERERERGRHkaGDkCfxYsX48cff8Tjx4/h7++Pn376CbVr1860fkxMDMaNG4ctW7bg5cuXcHd3x/z589G6detc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QVEUpbVPIhVwlWciIiIiIiIiotbF+AwRtTROP7ZDsixjy5YtXECEKEkcM0T6cMwQ6cMxQ6QPxwyRPhwzRERNwwB6OyTLMg4ePMgPT6IkccwQ6cMxQ6QPxwyRPhwzRPpwzBARNQ0D6EREREREREREREREcRhb+wRSRbBUfHV1dSufSdP5/X7U1dWhuroaRiN/BIgS4Zgh0odjhkgfjhkifThmiPRJtzETjMtwST8iaimp/87ZQmpqagAAZWVlrXwmRERERERERETtW01NDex2e2ufBhG1A4LCKbukyLKM8vJyZGdnQxCE1j6dJqmurkZZWRl27drFFauJksAxQ6QPxwyRPhwzRPpwzBDpk25jRlEU1NTUoKSkBKLIysREdOQxAz1JoiiitLS0tU+jWeXk5KTFhydRS+GYIdKHY4ZIH44ZIn04Zoj0Sacxw8xzImpJnKojIiIiIiIiIiIiIoqDAXQiIiIiIiIiIiIiojgYQG+HLBYL7r//flgsltY+FaKUwDFDpA/HDJE+HDNE+nDMEOnDMUNE1DRcRJSIiIiIiIiIiIiIKA5moBMRERERERERERERxcEAOhERERERERERERFRHAygExERERERERERERHFwQB6mnrxxRfRrVs3WK1WjB07FosXL25w/w8//BD9+vWD1WrF4MGD8dVXX7XQmRK1DXrGzKuvvoqJEyciLy8PeXl5mDZtWsIxRpRu9H7OBL333nsQBAGnn376kT1BojZG75hxOBy49tpr0alTJ1gsFvTp04e/n1G7onfMPPvss+jbty9sNhvKyspw0003we12t9DZErWuH3/8EaeccgpKSkogCAI++eSThM+ZO3cuRowYAYvFgl69euHf//73ET9PIqJUxQB6Gnr//fdx88034/7778fy5csxdOhQzJgxAwcOHIi7/4IFC3D++efjsssuw4oVK3D66afj9NNPx+rVq1v4zIlah94xM3fuXJx//vn44YcfsHDhQpSVlWH69OnYs2dPC585UevQO2aCtm/fjltvvRUTJ05soTMlahv0jhmv14vjjjsO27dvx0cffYQN/9/e3cdUWfdxHP8cEULmyCc4CNI0cbMNkeYjSAppc5PhamtolBJqzh58IhNBnhRDTHO1kZnoYvxBPrR0Fgx8ioKmTHC02sA6R5gbC5U2MiHH07n/8tz3ieO9gDzXAd+v7fxx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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ - "# Plot aggregated metrics comparison\n", - "print(\"\\n==== Aggregated Performance Metrics: 4-bit vs 8-bit ====\\n\")\n", + "# Visualize aggregated metrics (memory vs. performance tradeoff)\n", "plot_aggregated_metrics(flflow_4bit, flflow_8bit)" ] }, { "cell_type": "markdown", - "id": "4c089e09", + "id": "9a4de940", "metadata": {}, "source": [ - "### Memory Efficiency Comparison\n", + "## Conclusion\n", + "\n", + "This notebook has demonstrated how to implement federated fine-tuning of Microsoft's Phi-4 model using OpenFL with both 4-bit and 8-bit quantization approaches. The visualization and analysis above help us understand the tradeoffs between these quantization methods:\n", + "\n", + "### Memory Usage and Performance Comparison\n", + "\n", + "- **Memory Footprint**: 4-bit quantization used approximately 2.6% less memory (55,770 MB vs 57,204 MB) compared to 8-bit quantization.\n", + "\n", + "- **Model Quality**: 4-bit quantization achieved better loss metrics overall:\n", + " - Training Loss: 0.1754 ± 0.0877 for 4-bit vs. significantly higher for 8-bit\n", + " - Evaluation Loss: 0.4618 ± 0.0725 for 4-bit vs. 0.4909 ± 0.0776 for 8-bit (6.3% higher)\n", + "\n", + "- **Performance Difference by Metric**:\n", + " - Average Training Loss: 8-bit significantly underperformed compared to 4-bit\n", + " - Aggregated Model Loss: 8-bit was 0.52% higher (worse) than 4-bit\n", + " - Local Model Loss: 8-bit was 1.13% lower (better) than 4-bit\n", "\n", - "- **4-bit Quantization**: Uses less memory overall, allowing for larger batch sizes or model sizes on the same hardware.\n", - "- **8-bit Quantization**: Requires more memory but still offers significant savings compared to full precision (FP16/FP32).\n", - "- **Peak Memory Usage**: The difference in peak memory consumption shows the trade-off between precision and memory requirements.\n", + "### Key Insights\n", "\n", - "### Training Performance Comparison\n", + "1. **Memory-Performance Tradeoff**: While 8-bit quantization required slightly more memory, the relative performance differences in evaluation metrics were more significant, suggesting 4-bit quantization offers a better memory-performance balance for this model and task.\n", "\n", - "- **Training Loss**: 8-bit quantization typically maintains closer fidelity to the original model, potentially leading to slightly better training convergence.\n", - "- **Evaluation Loss**: The evaluation metrics help determine if the higher precision of 8-bit quantization translates to better model performance.\n", + "2. **Training Stability**: The 4-bit quantization approach demonstrated more stable and better training performance compared to 8-bit quantization.\n", "\n", - "### Use Case Recommendations\n", + "3. **Efficiency Considerations**: Despite the memory analysis suggesting 8-bit provides more efficient memory usage relative to loss in some metrics, the overall performance profile favors 4-bit quantization for practical federated learning deployments.\n", "\n", - "- **Resource-constrained environments**: 4-bit quantization provides better memory efficiency for edge devices or limited GPU resources.\n", - "- **Higher precision needs**: If model accuracy is critical and resources permit, 8-bit quantization offers a good balance between performance and efficiency.\n", - "- **Federated Learning Impact**: The quantization choice particularly affects resource utilization across collaborators in the federated setting." + "By combining federated learning with appropriate quantization techniques, we can successfully fine-tune large language models while balancing computational resource constraints across federated devices. For this Phi-4 model, the 4-bit quantization approach appears to offer the better balance of memory efficiency and model performance." ] } ], diff --git a/openfl/utilities/phi_utils.py b/openfl/utilities/phi_utils.py new file mode 100644 index 0000000000..1d914b8412 --- /dev/null +++ b/openfl/utilities/phi_utils.py @@ -0,0 +1,434 @@ +""" +Utility functions for Phi-4 model quantization and federated learning experiments. +This module contains: +- Memory tracking utilities +- Visualization functions for comparing 4-bit and 8-bit quantization +""" + +import torch +import matplotlib.pyplot as plt +import pandas as pd +import seaborn as sns +import numpy as np +from matplotlib.ticker import EngFormatter + +def get_gpu_memory_info(): + """Get GPU memory usage information in MB.""" + try: + if torch.cuda.is_available(): + allocated = torch.cuda.memory_allocated() / (1024 * 1024) + reserved = torch.cuda.memory_reserved() / (1024 * 1024) + max_allocated = torch.cuda.max_memory_allocated() / (1024 * 1024) + return { + "allocated": allocated, + "reserved": reserved, + "max_allocated": max_allocated + } + else: + return {"allocated": 0, "reserved": 0, "max_allocated": 0} + except: + return {"allocated": 0, "reserved": 0, "max_allocated": 0} + +class MemoryTracker: + """Track GPU memory usage during training""" + def __init__(self, collaborator_name, quant_type): + self.collaborator_name = collaborator_name + self.quant_type = quant_type + self.timestamps = {} + self.peak = {"allocated": 0, "reserved": 0, "max_allocated": 0} + self.training_loss = None + self.eval_loss = None + + def log(self, timestamp): + """Log current memory usage at a specific timestamp""" + self.timestamps[timestamp] = get_gpu_memory_info() + + def log_loss(self, training_loss=None, eval_loss=None): + """Log training or evaluation loss""" + if training_loss is not None: + self.training_loss = training_loss + if eval_loss is not None: + self.eval_loss = eval_loss + + def update_peak(self): + """Update peak memory usage values""" + current = get_gpu_memory_info() + self.peak["allocated"] = max(self.peak["allocated"], current["allocated"]) + self.peak["reserved"] = max(self.peak["reserved"], current["reserved"]) + self.peak["max_allocated"] = max(self.peak["max_allocated"], current["max_allocated"]) + + def reset_peak(self): + """Reset peak memory usage values""" + self.peak = {"allocated": 0, "reserved": 0, "max_allocated": 0} + + def report(self): + """Print memory usage report""" + print(f"\n==== Memory Usage Report for {self.collaborator_name} ({self.quant_type}) ====") + print(f"Peak Memory Usage:") + print(f" Allocated: {self.peak['allocated']:.2f} MB") + print(f" Reserved: {self.peak['reserved']:.2f} MB") + print(f" Max Allocated: {self.peak['max_allocated']:.2f} MB") + + print("\nMemory Usage by Stage:") + for timestamp, mem in self.timestamps.items(): + print(f" {timestamp}:") + print(f" Allocated: {mem['allocated']:.2f} MB") + print(f" Reserved: {mem['reserved']:.2f} MB") + print(f" Max Allocated: {mem['max_allocated']:.2f} MB") + + print("\nPerformance Metrics:") + if self.training_loss is not None: + print(f" Training Loss: {self.training_loss:.4f}") + if self.eval_loss is not None: + print(f" Evaluation Loss: {self.eval_loss:.4f}") + print("-" * 50) + + def get_stats(self): + """Get all statistics as a dictionary""" + stats = { + "peak_allocated": self.peak["allocated"], + "peak_reserved": self.peak["reserved"], + "peak_max_allocated": self.peak["max_allocated"], + "quant_type": self.quant_type, + "training_loss": self.training_loss, + "eval_loss": self.eval_loss + } + for timestamp, mem in self.timestamps.items(): + stats[f"{timestamp}_allocated"] = mem["allocated"] + stats[f"{timestamp}_reserved"] = mem["reserved"] + stats[f"{timestamp}_max_allocated"] = mem["max_allocated"] + return stats + +def plot_memory_metrics(flow_4bit, flow_8bit): + """Plot and compare memory metrics between 4-bit and 8-bit quantization.""" + try: + # Create figure with multiple subplots + fig, axs = plt.subplots(2, 2, figsize=(16, 12)) + fig.suptitle('4-bit vs 8-bit Quantization Comparison', fontsize=16) + + # Colors for consistent plotting + colors_4bit = {'Portland': 'blue', 'Seattle': 'green'} + colors_8bit = {'Portland': 'darkblue', 'Seattle': 'darkgreen'} + markers_4bit = {'Portland': 'o', 'Seattle': 's'} + markers_8bit = {'Portland': '^', 'Seattle': 'D'} + + # Flatten the metric data for plotting + memory_data = [] + for quant, flow in [("4-bit", flow_4bit), ("8-bit", flow_8bit)]: + stats = flow.all_memory_stats + for collab, rounds_data in stats.items(): + for round_name, metrics in rounds_data.items(): + round_num = int(round_name.split('_')[1]) + row = { + 'Collaborator': collab, + 'Round': round_num, + 'Quantization': quant, + 'Peak Memory (MB)': metrics.get('peak_max_allocated', 0), + 'Training Loss': metrics.get('training_loss', 0), + 'Eval Loss': metrics.get('eval_loss', 0) + } + memory_data.append(row) + + df = pd.DataFrame(memory_data) + + # Plot 1: Peak Memory Usage by Round + axs[0, 0].set_title('Peak Memory Usage by Round') + for quant_type in ['4-bit', '8-bit']: + for collab in df['Collaborator'].unique(): + subset = df[(df['Quantization'] == quant_type) & (df['Collaborator'] == collab)] + color = colors_4bit[collab] if quant_type == '4-bit' else colors_8bit[collab] + marker = markers_4bit[collab] if quant_type == '4-bit' else markers_8bit[collab] + axs[0, 0].plot(subset['Round'], subset['Peak Memory (MB)'], + marker=marker, linestyle='-', label=f"{collab} ({quant_type})", + color=color) + + axs[0, 0].set_xlabel('Round') + axs[0, 0].set_ylabel('Memory (MB)') + axs[0, 0].legend() + axs[0, 0].grid(True, alpha=0.3) + axs[0, 0].yaxis.set_major_formatter(EngFormatter(unit='B')) + + # Plot 2: Training Loss by Round + axs[0, 1].set_title('Training Loss by Round') + for quant_type in ['4-bit', '8-bit']: + for collab in df['Collaborator'].unique(): + subset = df[(df['Quantization'] == quant_type) & (df['Collaborator'] == collab)] + color = colors_4bit[collab] if quant_type == '4-bit' else colors_8bit[collab] + marker = markers_4bit[collab] if quant_type == '4-bit' else markers_8bit[collab] + axs[0, 1].plot(subset['Round'], subset['Training Loss'], + marker=marker, linestyle='-', label=f"{collab} ({quant_type})", + color=color) + + axs[0, 1].set_xlabel('Round') + axs[0, 1].set_ylabel('Loss') + axs[0, 1].legend() + axs[0, 1].grid(True, alpha=0.3) + + # Plot 3: Eval Loss by Round + axs[1, 0].set_title('Evaluation Loss by Round') + for quant_type in ['4-bit', '8-bit']: + for collab in df['Collaborator'].unique(): + subset = df[(df['Quantization'] == quant_type) & (df['Collaborator'] == collab)] + color = colors_4bit[collab] if quant_type == '4-bit' else colors_8bit[collab] + marker = markers_4bit[collab] if quant_type == '4-bit' else markers_8bit[collab] + axs[1, 0].plot(subset['Round'], subset['Eval Loss'], + marker=marker, linestyle='-', label=f"{collab} ({quant_type})", + color=color) + + axs[1, 0].set_xlabel('Round') + axs[1, 0].set_ylabel('Loss') + axs[1, 0].legend() + axs[1, 0].grid(True, alpha=0.3) + + # Plot 4: Memory vs Loss (bubble chart) + axs[1, 1].set_title('Memory Usage vs. Evaluation Loss') + for quant_type in ['4-bit', '8-bit']: + for collab in df['Collaborator'].unique(): + subset = df[(df['Quantization'] == quant_type) & (df['Collaborator'] == collab)] + color = colors_4bit[collab] if quant_type == '4-bit' else colors_8bit[collab] + marker = markers_4bit[collab] if quant_type == '4-bit' else markers_8bit[collab] + + # Size proportional to round number for visual differentiation + sizes = [100 * (r+1) for r in subset['Round']] + + axs[1, 1].scatter(subset['Peak Memory (MB)'], subset['Eval Loss'], + s=sizes, alpha=0.7, + label=f"{collab} ({quant_type})", + color=color, marker=marker) + + # Add round number annotations + for _, row in subset.iterrows(): + axs[1, 1].annotate(f"R{int(row['Round'])}", + (row['Peak Memory (MB)'], row['Eval Loss']), + xytext=(5, 5), textcoords='offset points') + + axs[1, 1].set_xlabel('Peak Memory (MB)') + axs[1, 1].set_ylabel('Evaluation Loss') + axs[1, 1].legend() + axs[1, 1].grid(True, alpha=0.3) + axs[1, 1].xaxis.set_major_formatter(EngFormatter(unit='B')) + + plt.tight_layout() + plt.subplots_adjust(top=0.92) + plt.show() + + # Print summary comparison + print("\n==== Performance Summary ====\n") + # Group by quantization and compute means + summary = df.groupby('Quantization').agg({ + 'Peak Memory (MB)': 'mean', + 'Training Loss': 'mean', + 'Eval Loss': 'mean' + }).reset_index() + + # Calculate percentage difference + mem_diff_pct = ((summary.loc[1, 'Peak Memory (MB)'] - summary.loc[0, 'Peak Memory (MB)']) / + summary.loc[0, 'Peak Memory (MB)'] * 100) + + eval_diff_pct = ((summary.loc[1, 'Eval Loss'] - summary.loc[0, 'Eval Loss']) / + summary.loc[0, 'Eval Loss'] * 100) + + print(f"Memory Usage Comparison:") + print(f" 4-bit Avg: {summary.loc[0, 'Peak Memory (MB)']:.2f} MB") + print(f" 8-bit Avg: {summary.loc[1, 'Peak Memory (MB)']:.2f} MB") + print(f" Difference: {abs(mem_diff_pct):.1f}% {'more' if mem_diff_pct > 0 else 'less'} memory with 8-bit") + + print(f"\nEvaluation Loss Comparison:") + print(f" 4-bit Avg: {summary.loc[0, 'Eval Loss']:.4f}") + print(f" 8-bit Avg: {summary.loc[1, 'Eval Loss']:.4f}") + print(f" Difference: {abs(eval_diff_pct):.1f}% {'higher' if eval_diff_pct > 0 else 'lower'} loss with 8-bit") + + loss_efficiency = ((summary.loc[0, 'Eval Loss'] - summary.loc[1, 'Eval Loss']) / + (summary.loc[0, 'Peak Memory (MB)'] - summary.loc[1, 'Peak Memory (MB)'])) + + if loss_efficiency > 0: + efficiency_msg = "8-bit provides more efficiency memory usage relative to loss" + else: + efficiency_msg = "4-bit provides more efficiency memory usage relative to loss" + + print(f"\nEfficiency Analysis: {efficiency_msg}") + except ImportError: + print("Plotting requires matplotlib and pandas. Install with: pip install matplotlib pandas") + except Exception as e: + print(f"Error plotting metrics: {str(e)}") + +def plot_loss_metrics(flow_4bit, flow_8bit): + """Plot training and evaluation loss metrics comparing 4-bit and 8-bit quantization""" + # Extract and organize loss data + loss_data = [] + + # Helper function to safely convert tensor to float value + def tensor_to_float(val): + if val is None: + return None + if isinstance(val, torch.Tensor): + return val.detach().cpu().float().numpy().item() + return val + + # Process 4-bit data + for collab, rounds_data in flow_4bit.all_memory_stats.items(): + for round_name, stats in rounds_data.items(): + round_num = int(round_name.split('_')[1]) if '_' in round_name else 0 + quant_type = stats.get("quant_type", "4bit") + training_loss = tensor_to_float(stats.get("training_loss")) + eval_loss = tensor_to_float(stats.get("eval_loss")) + + if training_loss is not None or eval_loss is not None: + loss_data.append({ + "Collaborator": collab, + "Round": round_name, + "Round Number": round_num, + "Training Loss": training_loss, + "Eval Loss": eval_loss, + "Quantization": quant_type + }) + + # Process 8-bit data if provided + if flow_8bit is not None: + for collab, rounds_data in flow_8bit.all_memory_stats.items(): + for round_name, stats in rounds_data.items(): + round_num = int(round_name.split('_')[1]) if '_' in round_name else 0 + quant_type = stats.get("quant_type", "8bit") + training_loss = tensor_to_float(stats.get("training_loss")) + eval_loss = tensor_to_float(stats.get("eval_loss")) + + if training_loss is not None or eval_loss is not None: + loss_data.append({ + "Collaborator": collab, + "Round": round_name, + "Round Number": round_num, + "Training Loss": training_loss, + "Eval Loss": eval_loss, + "Quantization": quant_type + }) + + loss_df = pd.DataFrame(loss_data) + + # Create a figure with subplots for loss metrics + fig, axes = plt.subplots(2, 1, figsize=(15, 12), gridspec_kw={'height_ratios': [1, 1]}) + + # 1. Training loss across rounds (top plot) + group_var = "Quantization" if flow_8bit else "Collaborator" + + sns.lineplot( + x="Round Number", + y="Training Loss", + hue=group_var, + data=loss_df, + marker='o', + sort=True, + linewidth=3, + markersize=10, + ax=axes[0] + ) + axes[0].set_title("Training Loss Across Rounds", fontsize=14, fontweight='bold') + axes[0].set_xlabel("Round", fontsize=12) + axes[0].set_ylabel("Loss", fontsize=12) + axes[0].legend(title=group_var, bbox_to_anchor=(1.05, 1), loc='upper left') + + # 2. Evaluation loss across rounds (bottom plot) + sns.lineplot( + x="Round Number", + y="Eval Loss", + hue=group_var, + data=loss_df, + marker='o', + sort=True, + linewidth=3, + markersize=10, + ax=axes[1] + ) + axes[1].set_title("Evaluation Loss Across Rounds", fontsize=14, fontweight='bold') + axes[1].set_xlabel("Round", fontsize=12) + axes[1].set_ylabel("Loss", fontsize=12) + axes[1].legend(title=group_var, bbox_to_anchor=(1.05, 1), loc='upper left') + + plt.tight_layout() + plt.show() + + # Print summary statistics + if flow_8bit: + print("\n==== Loss Comparison: 4-bit vs 8-bit ====\n") + + # Group by quantization and compute means + summary = loss_df.groupby('Quantization').agg({ + 'Training Loss': ['mean', 'std'], + 'Eval Loss': ['mean', 'std'] + }) + + print(f"Training Loss (4-bit): {summary.loc['4bit', ('Training Loss', 'mean')]:.4f} ± {summary.loc['4bit', ('Training Loss', 'std')]:.4f}") + print(f"Training Loss (8-bit): {summary.loc['8bit', ('Training Loss', 'mean')]:.4f} ± {summary.loc['8bit', ('Training Loss', 'std')]:.4f}") + print(f"\nEval Loss (4-bit): {summary.loc['4bit', ('Eval Loss', 'mean')]:.4f} ± {summary.loc['4bit', ('Eval Loss', 'std')]:.4f}") + print(f"Eval Loss (8-bit): {summary.loc['8bit', ('Eval Loss', 'mean')]:.4f} ± {summary.loc['8bit', ('Eval Loss', 'std')]:.4f}") + +def plot_aggregated_metrics(flow_4bit, flow_8bit): + """Plot aggregated metrics comparing 4-bit and 8-bit quantization""" + # Create a figure with subplots for aggregated metrics + fig, axes = plt.subplots(1, 2, figsize=(16, 6)) + + # Helper function to safely convert tensor to float value + def tensor_to_float(val): + if val is None: + return None + if isinstance(val, torch.Tensor): + return val.detach().cpu().float().numpy().item() + return val + + # Convert any tensor values to CPU before plotting + loss_history_4bit = [tensor_to_float(x) for x in flow_4bit.average_loss_history] + loss_history_8bit = [tensor_to_float(x) for x in flow_8bit.average_loss_history] + agg_model_loss_4bit = [tensor_to_float(x) for x in flow_4bit.agg_model_loss_history] + agg_model_loss_8bit = [tensor_to_float(x) for x in flow_8bit.agg_model_loss_history] + local_model_loss_4bit = [tensor_to_float(x) for x in flow_4bit.local_model_loss_history] + local_model_loss_8bit = [tensor_to_float(x) for x in flow_8bit.local_model_loss_history] + + # Setup data + rounds = list(range(len(loss_history_4bit))) + + # Plot average loss history + axes[0].plot(rounds, loss_history_4bit, 'bo-', linewidth=2, markersize=8, label='4-bit') + axes[0].plot(rounds, loss_history_8bit, 'ro-', linewidth=2, markersize=8, label='8-bit') + axes[0].set_title('Average Training Loss by Round', fontsize=14, fontweight='bold') + axes[0].set_xlabel('Round', fontsize=12) + axes[0].set_ylabel('Loss', fontsize=12) + axes[0].grid(True, alpha=0.3) + axes[0].legend(fontsize=10) + + # Plot final metrics comparison + metrics = ['Avg Training Loss', 'Agg Model Loss', 'Local Model Loss'] + values_4bit = [loss_history_4bit[-1], agg_model_loss_4bit[-1], local_model_loss_4bit[-1]] + values_8bit = [loss_history_8bit[-1], agg_model_loss_8bit[-1], local_model_loss_8bit[-1]] + + x = np.arange(len(metrics)) + width = 0.35 + + bars1 = axes[1].bar(x - width/2, values_4bit, width, label='4-bit', color='blue', alpha=0.7) + bars2 = axes[1].bar(x + width/2, values_8bit, width, label='8-bit', color='red', alpha=0.7) + + # Add value labels on bars + for bars in [bars1, bars2]: + for bar in bars: + height = bar.get_height() + axes[1].annotate(f'{height:.4f}', + xy=(bar.get_x() + bar.get_width() / 2, height), + xytext=(0, 3), + textcoords="offset points", + ha='center', va='bottom', + fontsize=9) + + axes[1].set_title('Final Metrics Comparison', fontsize=14, fontweight='bold') + axes[1].set_ylabel('Loss', fontsize=12) + axes[1].set_xticks(x) + axes[1].set_xticklabels(metrics, rotation=15) + axes[1].legend(loc='upper right', fontsize=10) + axes[1].grid(True, alpha=0.3) + + plt.tight_layout() + plt.show() + + # Print percent differences + print("\n==== Percentage Difference (8-bit vs 4-bit) ====\n") + for i, metric in enumerate(metrics): + pct_diff = ((values_8bit[i] - values_4bit[i]) / values_4bit[i]) * 100 + direction = "higher" if pct_diff > 0 else "lower" + print(f"{metric}: 8-bit is {abs(pct_diff):.2f}% {direction} than 4-bit") From b68401305ac0f1309efb4e44c897f44908b2c357 Mon Sep 17 00:00:00 2001 From: Rajith Date: Wed, 21 May 2025 16:14:13 +0530 Subject: [PATCH 32/34] removed nvidia-smi cell --- .../workflow/LLM/phi-4-withquantization.ipynb | 37 ------------------- 1 file changed, 37 deletions(-) diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-withquantization.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-withquantization.ipynb index 5e592b5873..a8c3dba3ca 100644 --- a/openfl-tutorials/experimental/workflow/LLM/phi-4-withquantization.ipynb +++ b/openfl-tutorials/experimental/workflow/LLM/phi-4-withquantization.ipynb @@ -67,43 +67,6 @@ "!pip install torch transformers peft datasets trl==0.12.2 bitsandbytes accelerate -q" ] }, - { - "cell_type": "code", - "execution_count": 2, - "id": "a7ae1a7e-8c16-4c5a-be57-33d84723aed7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Wed May 21 08:21:44 2025 \n", - "+-----------------------------------------------------------------------------------------+\n", - "| NVIDIA-SMI 550.144.03 Driver Version: 550.144.03 CUDA Version: 12.4 |\n", - "|-----------------------------------------+------------------------+----------------------+\n", - "| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |\n", - "| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |\n", - "| | | MIG M. |\n", - "|=========================================+========================+======================|\n", - "| 0 NVIDIA H100 NVL Off | 00000001:00:00.0 Off | 0 |\n", - "| N/A 31C P0 61W / 400W | 1MiB / 95830MiB | 0% Default |\n", - "| | | Disabled |\n", - "+-----------------------------------------+------------------------+----------------------+\n", - " \n", - "+-----------------------------------------------------------------------------------------+\n", - "| Processes: |\n", - "| GPU GI CI PID Type Process name GPU Memory |\n", - "| ID ID Usage |\n", - "|=========================================================================================|\n", - "| No running processes found |\n", - "+-----------------------------------------------------------------------------------------+\n" - ] - } - ], - "source": [ - "!nvidia-smi" - ] - }, { "cell_type": "markdown", "id": "440a9c39-ec42-45a5-80f6-9a9e0bc90d2f", From 17f1bdf6a8d490d76984b4f0ea4c772482b501e2 Mon Sep 17 00:00:00 2001 From: Rajith Date: Wed, 21 May 2025 16:59:42 +0530 Subject: [PATCH 33/34] fix code format --- openfl/utilities/phi_utils.py | 466 +++++++++++++++++++--------------- 1 file changed, 260 insertions(+), 206 deletions(-) diff --git a/openfl/utilities/phi_utils.py b/openfl/utilities/phi_utils.py index 1d914b8412..e1c2415ed1 100644 --- a/openfl/utilities/phi_utils.py +++ b/openfl/utilities/phi_utils.py @@ -5,13 +5,16 @@ - Visualization functions for comparing 4-bit and 8-bit quantization """ -import torch +# flake8: noqa: E501, E722 + import matplotlib.pyplot as plt +import numpy as np import pandas as pd import seaborn as sns -import numpy as np +import torch from matplotlib.ticker import EngFormatter + def get_gpu_memory_info(): """Get GPU memory usage information in MB.""" try: @@ -19,18 +22,16 @@ def get_gpu_memory_info(): allocated = torch.cuda.memory_allocated() / (1024 * 1024) reserved = torch.cuda.memory_reserved() / (1024 * 1024) max_allocated = torch.cuda.max_memory_allocated() / (1024 * 1024) - return { - "allocated": allocated, - "reserved": reserved, - "max_allocated": max_allocated - } + return {"allocated": allocated, "reserved": reserved, "max_allocated": max_allocated} else: return {"allocated": 0, "reserved": 0, "max_allocated": 0} except: return {"allocated": 0, "reserved": 0, "max_allocated": 0} + class MemoryTracker: """Track GPU memory usage during training""" + def __init__(self, collaborator_name, quant_type): self.collaborator_name = collaborator_name self.quant_type = quant_type @@ -38,51 +39,51 @@ def __init__(self, collaborator_name, quant_type): self.peak = {"allocated": 0, "reserved": 0, "max_allocated": 0} self.training_loss = None self.eval_loss = None - + def log(self, timestamp): """Log current memory usage at a specific timestamp""" self.timestamps[timestamp] = get_gpu_memory_info() - + def log_loss(self, training_loss=None, eval_loss=None): """Log training or evaluation loss""" if training_loss is not None: self.training_loss = training_loss if eval_loss is not None: self.eval_loss = eval_loss - + def update_peak(self): """Update peak memory usage values""" current = get_gpu_memory_info() self.peak["allocated"] = max(self.peak["allocated"], current["allocated"]) self.peak["reserved"] = max(self.peak["reserved"], current["reserved"]) self.peak["max_allocated"] = max(self.peak["max_allocated"], current["max_allocated"]) - + def reset_peak(self): """Reset peak memory usage values""" self.peak = {"allocated": 0, "reserved": 0, "max_allocated": 0} - + def report(self): """Print memory usage report""" print(f"\n==== Memory Usage Report for {self.collaborator_name} ({self.quant_type}) ====") - print(f"Peak Memory Usage:") + print("Peak Memory Usage:") print(f" Allocated: {self.peak['allocated']:.2f} MB") print(f" Reserved: {self.peak['reserved']:.2f} MB") print(f" Max Allocated: {self.peak['max_allocated']:.2f} MB") - + print("\nMemory Usage by Stage:") for timestamp, mem in self.timestamps.items(): print(f" {timestamp}:") print(f" Allocated: {mem['allocated']:.2f} MB") print(f" Reserved: {mem['reserved']:.2f} MB") print(f" Max Allocated: {mem['max_allocated']:.2f} MB") - + print("\nPerformance Metrics:") if self.training_loss is not None: print(f" Training Loss: {self.training_loss:.4f}") if self.eval_loss is not None: print(f" Evaluation Loss: {self.eval_loss:.4f}") print("-" * 50) - + def get_stats(self): """Get all statistics as a dictionary""" stats = { @@ -91,7 +92,7 @@ def get_stats(self): "peak_max_allocated": self.peak["max_allocated"], "quant_type": self.quant_type, "training_loss": self.training_loss, - "eval_loss": self.eval_loss + "eval_loss": self.eval_loss, } for timestamp, mem in self.timestamps.items(): stats[f"{timestamp}_allocated"] = mem["allocated"] @@ -99,164 +100,202 @@ def get_stats(self): stats[f"{timestamp}_max_allocated"] = mem["max_allocated"] return stats -def plot_memory_metrics(flow_4bit, flow_8bit): + +def plot_memory_metrics(flow_4bit, flow_8bit): # NOQA: C901 """Plot and compare memory metrics between 4-bit and 8-bit quantization.""" try: # Create figure with multiple subplots fig, axs = plt.subplots(2, 2, figsize=(16, 12)) - fig.suptitle('4-bit vs 8-bit Quantization Comparison', fontsize=16) - + fig.suptitle("4-bit vs 8-bit Quantization Comparison", fontsize=16) + # Colors for consistent plotting - colors_4bit = {'Portland': 'blue', 'Seattle': 'green'} - colors_8bit = {'Portland': 'darkblue', 'Seattle': 'darkgreen'} - markers_4bit = {'Portland': 'o', 'Seattle': 's'} - markers_8bit = {'Portland': '^', 'Seattle': 'D'} - + colors_4bit = {"Portland": "blue", "Seattle": "green"} + colors_8bit = {"Portland": "darkblue", "Seattle": "darkgreen"} + markers_4bit = {"Portland": "o", "Seattle": "s"} + markers_8bit = {"Portland": "^", "Seattle": "D"} + # Flatten the metric data for plotting memory_data = [] for quant, flow in [("4-bit", flow_4bit), ("8-bit", flow_8bit)]: stats = flow.all_memory_stats for collab, rounds_data in stats.items(): for round_name, metrics in rounds_data.items(): - round_num = int(round_name.split('_')[1]) + round_num = int(round_name.split("_")[1]) row = { - 'Collaborator': collab, - 'Round': round_num, - 'Quantization': quant, - 'Peak Memory (MB)': metrics.get('peak_max_allocated', 0), - 'Training Loss': metrics.get('training_loss', 0), - 'Eval Loss': metrics.get('eval_loss', 0) + "Collaborator": collab, + "Round": round_num, + "Quantization": quant, + "Peak Memory (MB)": metrics.get("peak_max_allocated", 0), + "Training Loss": metrics.get("training_loss", 0), + "Eval Loss": metrics.get("eval_loss", 0), } memory_data.append(row) - + df = pd.DataFrame(memory_data) - + # Plot 1: Peak Memory Usage by Round - axs[0, 0].set_title('Peak Memory Usage by Round') - for quant_type in ['4-bit', '8-bit']: - for collab in df['Collaborator'].unique(): - subset = df[(df['Quantization'] == quant_type) & (df['Collaborator'] == collab)] - color = colors_4bit[collab] if quant_type == '4-bit' else colors_8bit[collab] - marker = markers_4bit[collab] if quant_type == '4-bit' else markers_8bit[collab] - axs[0, 0].plot(subset['Round'], subset['Peak Memory (MB)'], - marker=marker, linestyle='-', label=f"{collab} ({quant_type})", - color=color) - - axs[0, 0].set_xlabel('Round') - axs[0, 0].set_ylabel('Memory (MB)') + axs[0, 0].set_title("Peak Memory Usage by Round") + for quant_type in ["4-bit", "8-bit"]: + for collab in df["Collaborator"].unique(): + subset = df[(df["Quantization"] == quant_type) & (df["Collaborator"] == collab)] + color = colors_4bit[collab] if quant_type == "4-bit" else colors_8bit[collab] + marker = markers_4bit[collab] if quant_type == "4-bit" else markers_8bit[collab] + axs[0, 0].plot( + subset["Round"], + subset["Peak Memory (MB)"], + marker=marker, + linestyle="-", + label=f"{collab} ({quant_type})", + color=color, + ) + + axs[0, 0].set_xlabel("Round") + axs[0, 0].set_ylabel("Memory (MB)") axs[0, 0].legend() axs[0, 0].grid(True, alpha=0.3) - axs[0, 0].yaxis.set_major_formatter(EngFormatter(unit='B')) - + axs[0, 0].yaxis.set_major_formatter(EngFormatter(unit="B")) + # Plot 2: Training Loss by Round - axs[0, 1].set_title('Training Loss by Round') - for quant_type in ['4-bit', '8-bit']: - for collab in df['Collaborator'].unique(): - subset = df[(df['Quantization'] == quant_type) & (df['Collaborator'] == collab)] - color = colors_4bit[collab] if quant_type == '4-bit' else colors_8bit[collab] - marker = markers_4bit[collab] if quant_type == '4-bit' else markers_8bit[collab] - axs[0, 1].plot(subset['Round'], subset['Training Loss'], - marker=marker, linestyle='-', label=f"{collab} ({quant_type})", - color=color) - - axs[0, 1].set_xlabel('Round') - axs[0, 1].set_ylabel('Loss') + axs[0, 1].set_title("Training Loss by Round") + for quant_type in ["4-bit", "8-bit"]: + for collab in df["Collaborator"].unique(): + subset = df[(df["Quantization"] == quant_type) & (df["Collaborator"] == collab)] + color = colors_4bit[collab] if quant_type == "4-bit" else colors_8bit[collab] + marker = markers_4bit[collab] if quant_type == "4-bit" else markers_8bit[collab] + axs[0, 1].plot( + subset["Round"], + subset["Training Loss"], + marker=marker, + linestyle="-", + label=f"{collab} ({quant_type})", + color=color, + ) + + axs[0, 1].set_xlabel("Round") + axs[0, 1].set_ylabel("Loss") axs[0, 1].legend() axs[0, 1].grid(True, alpha=0.3) - + # Plot 3: Eval Loss by Round - axs[1, 0].set_title('Evaluation Loss by Round') - for quant_type in ['4-bit', '8-bit']: - for collab in df['Collaborator'].unique(): - subset = df[(df['Quantization'] == quant_type) & (df['Collaborator'] == collab)] - color = colors_4bit[collab] if quant_type == '4-bit' else colors_8bit[collab] - marker = markers_4bit[collab] if quant_type == '4-bit' else markers_8bit[collab] - axs[1, 0].plot(subset['Round'], subset['Eval Loss'], - marker=marker, linestyle='-', label=f"{collab} ({quant_type})", - color=color) - - axs[1, 0].set_xlabel('Round') - axs[1, 0].set_ylabel('Loss') + axs[1, 0].set_title("Evaluation Loss by Round") + for quant_type in ["4-bit", "8-bit"]: + for collab in df["Collaborator"].unique(): + subset = df[(df["Quantization"] == quant_type) & (df["Collaborator"] == collab)] + color = colors_4bit[collab] if quant_type == "4-bit" else colors_8bit[collab] + marker = markers_4bit[collab] if quant_type == "4-bit" else markers_8bit[collab] + axs[1, 0].plot( + subset["Round"], + subset["Eval Loss"], + marker=marker, + linestyle="-", + label=f"{collab} ({quant_type})", + color=color, + ) + + axs[1, 0].set_xlabel("Round") + axs[1, 0].set_ylabel("Loss") axs[1, 0].legend() axs[1, 0].grid(True, alpha=0.3) - + # Plot 4: Memory vs Loss (bubble chart) - axs[1, 1].set_title('Memory Usage vs. Evaluation Loss') - for quant_type in ['4-bit', '8-bit']: - for collab in df['Collaborator'].unique(): - subset = df[(df['Quantization'] == quant_type) & (df['Collaborator'] == collab)] - color = colors_4bit[collab] if quant_type == '4-bit' else colors_8bit[collab] - marker = markers_4bit[collab] if quant_type == '4-bit' else markers_8bit[collab] - + axs[1, 1].set_title("Memory Usage vs. Evaluation Loss") + for quant_type in ["4-bit", "8-bit"]: + for collab in df["Collaborator"].unique(): + subset = df[(df["Quantization"] == quant_type) & (df["Collaborator"] == collab)] + color = colors_4bit[collab] if quant_type == "4-bit" else colors_8bit[collab] + marker = markers_4bit[collab] if quant_type == "4-bit" else markers_8bit[collab] + # Size proportional to round number for visual differentiation - sizes = [100 * (r+1) for r in subset['Round']] - - axs[1, 1].scatter(subset['Peak Memory (MB)'], subset['Eval Loss'], - s=sizes, alpha=0.7, - label=f"{collab} ({quant_type})", - color=color, marker=marker) - + sizes = [100 * (r + 1) for r in subset["Round"]] + + axs[1, 1].scatter( + subset["Peak Memory (MB)"], + subset["Eval Loss"], + s=sizes, + alpha=0.7, + label=f"{collab} ({quant_type})", + color=color, + marker=marker, + ) + # Add round number annotations for _, row in subset.iterrows(): - axs[1, 1].annotate(f"R{int(row['Round'])}", - (row['Peak Memory (MB)'], row['Eval Loss']), - xytext=(5, 5), textcoords='offset points') - - axs[1, 1].set_xlabel('Peak Memory (MB)') - axs[1, 1].set_ylabel('Evaluation Loss') + axs[1, 1].annotate( + f"R{int(row['Round'])}", + (row["Peak Memory (MB)"], row["Eval Loss"]), + xytext=(5, 5), + textcoords="offset points", + ) + + axs[1, 1].set_xlabel("Peak Memory (MB)") + axs[1, 1].set_ylabel("Evaluation Loss") axs[1, 1].legend() axs[1, 1].grid(True, alpha=0.3) - axs[1, 1].xaxis.set_major_formatter(EngFormatter(unit='B')) - + axs[1, 1].xaxis.set_major_formatter(EngFormatter(unit="B")) + plt.tight_layout() plt.subplots_adjust(top=0.92) plt.show() - + # Print summary comparison print("\n==== Performance Summary ====\n") # Group by quantization and compute means - summary = df.groupby('Quantization').agg({ - 'Peak Memory (MB)': 'mean', - 'Training Loss': 'mean', - 'Eval Loss': 'mean' - }).reset_index() - + summary = ( + df.groupby("Quantization") + .agg({"Peak Memory (MB)": "mean", "Training Loss": "mean", "Eval Loss": "mean"}) + .reset_index() + ) + # Calculate percentage difference - mem_diff_pct = ((summary.loc[1, 'Peak Memory (MB)'] - summary.loc[0, 'Peak Memory (MB)']) / - summary.loc[0, 'Peak Memory (MB)'] * 100) - - eval_diff_pct = ((summary.loc[1, 'Eval Loss'] - summary.loc[0, 'Eval Loss']) / - summary.loc[0, 'Eval Loss'] * 100) - - print(f"Memory Usage Comparison:") + mem_diff_pct = ( + (summary.loc[1, "Peak Memory (MB)"] - summary.loc[0, "Peak Memory (MB)"]) + / summary.loc[0, "Peak Memory (MB)"] + * 100 + ) + + eval_diff_pct = ( + (summary.loc[1, "Eval Loss"] - summary.loc[0, "Eval Loss"]) + / summary.loc[0, "Eval Loss"] + * 100 + ) + + print("Memory Usage Comparison:") print(f" 4-bit Avg: {summary.loc[0, 'Peak Memory (MB)']:.2f} MB") print(f" 8-bit Avg: {summary.loc[1, 'Peak Memory (MB)']:.2f} MB") - print(f" Difference: {abs(mem_diff_pct):.1f}% {'more' if mem_diff_pct > 0 else 'less'} memory with 8-bit") - - print(f"\nEvaluation Loss Comparison:") + print( + f" Difference: {abs(mem_diff_pct):.1f}% {'more' if mem_diff_pct > 0 else 'less'} memory with 8-bit" + ) + + print("\nEvaluation Loss Comparison:") print(f" 4-bit Avg: {summary.loc[0, 'Eval Loss']:.4f}") print(f" 8-bit Avg: {summary.loc[1, 'Eval Loss']:.4f}") - print(f" Difference: {abs(eval_diff_pct):.1f}% {'higher' if eval_diff_pct > 0 else 'lower'} loss with 8-bit") - - loss_efficiency = ((summary.loc[0, 'Eval Loss'] - summary.loc[1, 'Eval Loss']) / - (summary.loc[0, 'Peak Memory (MB)'] - summary.loc[1, 'Peak Memory (MB)'])) - + print( + f" Difference: {abs(eval_diff_pct):.1f}% {'higher' if eval_diff_pct > 0 else 'lower'} loss with 8-bit" + ) + + loss_efficiency = (summary.loc[0, "Eval Loss"] - summary.loc[1, "Eval Loss"]) / ( + summary.loc[0, "Peak Memory (MB)"] - summary.loc[1, "Peak Memory (MB)"] + ) + if loss_efficiency > 0: efficiency_msg = "8-bit provides more efficiency memory usage relative to loss" else: efficiency_msg = "4-bit provides more efficiency memory usage relative to loss" - + print(f"\nEfficiency Analysis: {efficiency_msg}") except ImportError: - print("Plotting requires matplotlib and pandas. Install with: pip install matplotlib pandas") + print( + "Plotting requires matplotlib and pandas. Install with: pip install matplotlib pandas" + ) except Exception as e: print(f"Error plotting metrics: {str(e)}") -def plot_loss_metrics(flow_4bit, flow_8bit): + +def plot_loss_metrics(flow_4bit, flow_8bit): # NOQA: C901 """Plot training and evaluation loss metrics comparing 4-bit and 8-bit quantization""" # Extract and organize loss data loss_data = [] - + # Helper function to safely convert tensor to float value def tensor_to_float(val): if val is None: @@ -264,108 +303,120 @@ def tensor_to_float(val): if isinstance(val, torch.Tensor): return val.detach().cpu().float().numpy().item() return val - + # Process 4-bit data for collab, rounds_data in flow_4bit.all_memory_stats.items(): for round_name, stats in rounds_data.items(): - round_num = int(round_name.split('_')[1]) if '_' in round_name else 0 + round_num = int(round_name.split("_")[1]) if "_" in round_name else 0 quant_type = stats.get("quant_type", "4bit") training_loss = tensor_to_float(stats.get("training_loss")) eval_loss = tensor_to_float(stats.get("eval_loss")) - + if training_loss is not None or eval_loss is not None: - loss_data.append({ - "Collaborator": collab, - "Round": round_name, - "Round Number": round_num, - "Training Loss": training_loss, - "Eval Loss": eval_loss, - "Quantization": quant_type - }) - + loss_data.append( + { + "Collaborator": collab, + "Round": round_name, + "Round Number": round_num, + "Training Loss": training_loss, + "Eval Loss": eval_loss, + "Quantization": quant_type, + } + ) + # Process 8-bit data if provided if flow_8bit is not None: for collab, rounds_data in flow_8bit.all_memory_stats.items(): for round_name, stats in rounds_data.items(): - round_num = int(round_name.split('_')[1]) if '_' in round_name else 0 + round_num = int(round_name.split("_")[1]) if "_" in round_name else 0 quant_type = stats.get("quant_type", "8bit") training_loss = tensor_to_float(stats.get("training_loss")) eval_loss = tensor_to_float(stats.get("eval_loss")) - + if training_loss is not None or eval_loss is not None: - loss_data.append({ - "Collaborator": collab, - "Round": round_name, - "Round Number": round_num, - "Training Loss": training_loss, - "Eval Loss": eval_loss, - "Quantization": quant_type - }) - + loss_data.append( + { + "Collaborator": collab, + "Round": round_name, + "Round Number": round_num, + "Training Loss": training_loss, + "Eval Loss": eval_loss, + "Quantization": quant_type, + } + ) + loss_df = pd.DataFrame(loss_data) - + # Create a figure with subplots for loss metrics - fig, axes = plt.subplots(2, 1, figsize=(15, 12), gridspec_kw={'height_ratios': [1, 1]}) - + fig, axes = plt.subplots(2, 1, figsize=(15, 12), gridspec_kw={"height_ratios": [1, 1]}) + # 1. Training loss across rounds (top plot) group_var = "Quantization" if flow_8bit else "Collaborator" - + sns.lineplot( - x="Round Number", - y="Training Loss", - hue=group_var, - data=loss_df, - marker='o', + x="Round Number", + y="Training Loss", + hue=group_var, + data=loss_df, + marker="o", sort=True, linewidth=3, markersize=10, - ax=axes[0] + ax=axes[0], ) - axes[0].set_title("Training Loss Across Rounds", fontsize=14, fontweight='bold') + axes[0].set_title("Training Loss Across Rounds", fontsize=14, fontweight="bold") axes[0].set_xlabel("Round", fontsize=12) axes[0].set_ylabel("Loss", fontsize=12) - axes[0].legend(title=group_var, bbox_to_anchor=(1.05, 1), loc='upper left') - + axes[0].legend(title=group_var, bbox_to_anchor=(1.05, 1), loc="upper left") + # 2. Evaluation loss across rounds (bottom plot) sns.lineplot( - x="Round Number", - y="Eval Loss", - hue=group_var, - data=loss_df, - marker='o', + x="Round Number", + y="Eval Loss", + hue=group_var, + data=loss_df, + marker="o", sort=True, linewidth=3, markersize=10, - ax=axes[1] + ax=axes[1], ) - axes[1].set_title("Evaluation Loss Across Rounds", fontsize=14, fontweight='bold') + axes[1].set_title("Evaluation Loss Across Rounds", fontsize=14, fontweight="bold") axes[1].set_xlabel("Round", fontsize=12) axes[1].set_ylabel("Loss", fontsize=12) - axes[1].legend(title=group_var, bbox_to_anchor=(1.05, 1), loc='upper left') - + axes[1].legend(title=group_var, bbox_to_anchor=(1.05, 1), loc="upper left") + plt.tight_layout() plt.show() - + # Print summary statistics if flow_8bit: print("\n==== Loss Comparison: 4-bit vs 8-bit ====\n") - + # Group by quantization and compute means - summary = loss_df.groupby('Quantization').agg({ - 'Training Loss': ['mean', 'std'], - 'Eval Loss': ['mean', 'std'] - }) - - print(f"Training Loss (4-bit): {summary.loc['4bit', ('Training Loss', 'mean')]:.4f} ± {summary.loc['4bit', ('Training Loss', 'std')]:.4f}") - print(f"Training Loss (8-bit): {summary.loc['8bit', ('Training Loss', 'mean')]:.4f} ± {summary.loc['8bit', ('Training Loss', 'std')]:.4f}") - print(f"\nEval Loss (4-bit): {summary.loc['4bit', ('Eval Loss', 'mean')]:.4f} ± {summary.loc['4bit', ('Eval Loss', 'std')]:.4f}") - print(f"Eval Loss (8-bit): {summary.loc['8bit', ('Eval Loss', 'mean')]:.4f} ± {summary.loc['8bit', ('Eval Loss', 'std')]:.4f}") + summary = loss_df.groupby("Quantization").agg( + {"Training Loss": ["mean", "std"], "Eval Loss": ["mean", "std"]} + ) + + print( + f"Training Loss (4-bit): {summary.loc['4bit', ('Training Loss', 'mean')]:.4f} ± {summary.loc['4bit', ('Training Loss', 'std')]:.4f}" + ) + print( + f"Training Loss (8-bit): {summary.loc['8bit', ('Training Loss', 'mean')]:.4f} ± {summary.loc['8bit', ('Training Loss', 'std')]:.4f}" + ) + print( + f"\nEval Loss (4-bit): {summary.loc['4bit', ('Eval Loss', 'mean')]:.4f} ± {summary.loc['4bit', ('Eval Loss', 'std')]:.4f}" + ) + print( + f"Eval Loss (8-bit): {summary.loc['8bit', ('Eval Loss', 'mean')]:.4f} ± {summary.loc['8bit', ('Eval Loss', 'std')]:.4f}" + ) + def plot_aggregated_metrics(flow_4bit, flow_8bit): """Plot aggregated metrics comparing 4-bit and 8-bit quantization""" # Create a figure with subplots for aggregated metrics fig, axes = plt.subplots(1, 2, figsize=(16, 6)) - + # Helper function to safely convert tensor to float value def tensor_to_float(val): if val is None: @@ -373,7 +424,7 @@ def tensor_to_float(val): if isinstance(val, torch.Tensor): return val.detach().cpu().float().numpy().item() return val - + # Convert any tensor values to CPU before plotting loss_history_4bit = [tensor_to_float(x) for x in flow_4bit.average_loss_history] loss_history_8bit = [tensor_to_float(x) for x in flow_8bit.average_loss_history] @@ -381,51 +432,54 @@ def tensor_to_float(val): agg_model_loss_8bit = [tensor_to_float(x) for x in flow_8bit.agg_model_loss_history] local_model_loss_4bit = [tensor_to_float(x) for x in flow_4bit.local_model_loss_history] local_model_loss_8bit = [tensor_to_float(x) for x in flow_8bit.local_model_loss_history] - + # Setup data rounds = list(range(len(loss_history_4bit))) - + # Plot average loss history - axes[0].plot(rounds, loss_history_4bit, 'bo-', linewidth=2, markersize=8, label='4-bit') - axes[0].plot(rounds, loss_history_8bit, 'ro-', linewidth=2, markersize=8, label='8-bit') - axes[0].set_title('Average Training Loss by Round', fontsize=14, fontweight='bold') - axes[0].set_xlabel('Round', fontsize=12) - axes[0].set_ylabel('Loss', fontsize=12) + axes[0].plot(rounds, loss_history_4bit, "bo-", linewidth=2, markersize=8, label="4-bit") + axes[0].plot(rounds, loss_history_8bit, "ro-", linewidth=2, markersize=8, label="8-bit") + axes[0].set_title("Average Training Loss by Round", fontsize=14, fontweight="bold") + axes[0].set_xlabel("Round", fontsize=12) + axes[0].set_ylabel("Loss", fontsize=12) axes[0].grid(True, alpha=0.3) axes[0].legend(fontsize=10) - + # Plot final metrics comparison - metrics = ['Avg Training Loss', 'Agg Model Loss', 'Local Model Loss'] + metrics = ["Avg Training Loss", "Agg Model Loss", "Local Model Loss"] values_4bit = [loss_history_4bit[-1], agg_model_loss_4bit[-1], local_model_loss_4bit[-1]] values_8bit = [loss_history_8bit[-1], agg_model_loss_8bit[-1], local_model_loss_8bit[-1]] - + x = np.arange(len(metrics)) width = 0.35 - - bars1 = axes[1].bar(x - width/2, values_4bit, width, label='4-bit', color='blue', alpha=0.7) - bars2 = axes[1].bar(x + width/2, values_8bit, width, label='8-bit', color='red', alpha=0.7) - + + bars1 = axes[1].bar(x - width / 2, values_4bit, width, label="4-bit", color="blue", alpha=0.7) + bars2 = axes[1].bar(x + width / 2, values_8bit, width, label="8-bit", color="red", alpha=0.7) + # Add value labels on bars for bars in [bars1, bars2]: for bar in bars: height = bar.get_height() - axes[1].annotate(f'{height:.4f}', - xy=(bar.get_x() + bar.get_width() / 2, height), - xytext=(0, 3), - textcoords="offset points", - ha='center', va='bottom', - fontsize=9) - - axes[1].set_title('Final Metrics Comparison', fontsize=14, fontweight='bold') - axes[1].set_ylabel('Loss', fontsize=12) + axes[1].annotate( + f"{height:.4f}", + xy=(bar.get_x() + bar.get_width() / 2, height), + xytext=(0, 3), + textcoords="offset points", + ha="center", + va="bottom", + fontsize=9, + ) + + axes[1].set_title("Final Metrics Comparison", fontsize=14, fontweight="bold") + axes[1].set_ylabel("Loss", fontsize=12) axes[1].set_xticks(x) axes[1].set_xticklabels(metrics, rotation=15) - axes[1].legend(loc='upper right', fontsize=10) + axes[1].legend(loc="upper right", fontsize=10) axes[1].grid(True, alpha=0.3) - + plt.tight_layout() plt.show() - + # Print percent differences print("\n==== Percentage Difference (8-bit vs 4-bit) ====\n") for i, metric in enumerate(metrics): From b1f48fcfd445d0511a525cbc5ee0bdfcc9b8cb6b Mon Sep 17 00:00:00 2001 From: Rajith Date: Wed, 21 May 2025 17:14:58 +0530 Subject: [PATCH 34/34] renamed file name --- ...phi-4-withquantization.ipynb => phi-4-peft-quantization.ipynb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename openfl-tutorials/experimental/workflow/LLM/{phi-4-withquantization.ipynb => phi-4-peft-quantization.ipynb} (100%) diff --git a/openfl-tutorials/experimental/workflow/LLM/phi-4-withquantization.ipynb b/openfl-tutorials/experimental/workflow/LLM/phi-4-peft-quantization.ipynb similarity index 100% rename from openfl-tutorials/experimental/workflow/LLM/phi-4-withquantization.ipynb rename to openfl-tutorials/experimental/workflow/LLM/phi-4-peft-quantization.ipynb