File size: 5,798 Bytes
9a25157
dc1be6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ccd8a2a
dc1be6e
 
ccd8a2a
dc1be6e
 
ccd8a2a
dc1be6e
 
ccd8a2a
 
 
 
 
 
 
 
 
 
 
 
dc1be6e
 
ccd8a2a
dc1be6e
ccd8a2a
dc1be6e
 
 
ccd8a2a
dc1be6e
 
 
 
 
 
ccd8a2a
dc1be6e
 
ccd8a2a
dc1be6e
 
ccd8a2a
dc1be6e
 
 
ccd8a2a
dc1be6e
 
ccd8a2a
dc1be6e
78424dc
c13d23b
ccd8a2a
dc1be6e
c13d23b
ccd8a2a
 
dc1be6e
 
b00a78e
dc1be6e
b00a78e
dc1be6e
b00a78e
dc1be6e
 
 
 
b00a78e
 
 
 
ccd8a2a
dc1be6e
b00a78e
 
 
 
 
ccd8a2a
dc1be6e
ccd8a2a
dc1be6e
 
 
 
 
 
 
 
 
 
 
b00a78e
dc1be6e
 
ccd8a2a
dc1be6e
 
 
 
 
 
ccd8a2a
dc1be6e
 
 
 
 
b00a78e
dc1be6e
ccd8a2a
b00a78e
 
ccd8a2a
dc1be6e
 
 
ccd8a2a
dc1be6e
 
 
 
 
78424dc
dc1be6e
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
<!DOCTYPE html>
<html>
  <head>
    <style>
      body {
        font-family: Arial, sans-serif;
      }
      input, button, progress {
        display: block;
        margin-top: 10px;
      }
      #message {
        margin-top: 20px;
        color: blue;
      }
      #error {
        color: red;
      }
    </style>
  </head>
  <body>
    <label for="tokenInput">Hugging Face Token:</label>
    <input type="password" id="tokenInput" name="tokenInput">
    <label for="repoInput">Repository ID:</label>
    <input type="text" id="repoInput" name="repoInput" placeholder="my-user/nlp-model">
    <input type="file" id="fileUpload" multiple>
    <button id="uploadButton">Upload Files</button>
    <div id="processingMessage"></div>
    <progress id="progressBar" value="0" max="100"></progress>
    <div id="message"></div>
    <div id="error"></div>

    <script type="module">
      import { createRepo, uploadFiles } from "https://cdn.jsdelivr.net/npm/@huggingface/[email protected]/+esm";

      const uploadButton = document.getElementById('uploadButton');
      uploadButton.addEventListener('click', upload);

      function isS3Url(url) {
        // Replace this with the actual condition to identify S3 URLs
        return url.startsWith('https://s3.amazonaws.com/');
      }

      // Save the original fetch function
      const originalFetch = fetch;

      // Replace the global fetch function
      fetch = (url, init) => {
        if (isS3Url(url) && init.method === 'PUT') {
          return new Promise((resolve, reject) => {
            const xhr = new XMLHttpRequest();

            xhr.open(init.method, url);

            for (let header in init.headers) {
              xhr.setRequestHeader(header, init.headers[header]);
            }

            xhr.onload = () => {
              resolve({
                ok: xhr.status >= 200 && xhr.status < 300,
                status: xhr.status,
                statusText: xhr.statusText,
                text: () => Promise.resolve(xhr.responseText),
                json: () => Promise.resolve(JSON.parse(xhr.responseText))
              });
            };

            xhr.onerror = () => reject(new TypeError('Network request failed'));
            xhr.ontimeout = () => reject(new TypeError('Network request failed due to timeout'));

            xhr.upload.onprogress = (event) => {
              if (event.lengthComputable) {
                const progressBar = document.getElementById('progressBar');
                progressBar.value = (event.loaded / event.total) * 100;
              }
            };

            xhr.send(init.body);
          });
        } else {
          // Use the original fetch function for non-S3 requests
          return originalFetch(url, init);
        }
      };

      async function upload() {
        const fileInput = document.getElementById('fileUpload');
        const files = Array.from(fileInput.files);
        const tokenInput = document.getElementById('tokenInput');
        const HF_ACCESS_TOKEN = tokenInput.value;
        const repoInput = document.getElementById('repoInput');
        const REPO_ID = repoInput.value;
        const progressBar = document.getElementById('progressBar');
        const messageDiv = document.getElementById('message');
        const errorDiv = document.getElementById('error');
        const processingMessage = document.getElementById('processingMessage');
        progressBar.value = 0;
        messageDiv.textContent = '';
        errorDiv.textContent = '';
        processingMessage.textContent = '';

        if (files.length > 0) {
          let totalSize = 0;
          for (let file of files) {
            totalSize += file.size;
          }
          totalSize = totalSize / (1024 * 1024);

          const startTime = Date.now();

          try {
            await createRepo({
              repo: REPO_ID,
              credentials: { accessToken: HF_ACCESS_TOKEN },
            });
          } catch (error) {
            if (error.message === 'You already created this model repo') {
              console.log('Repository already exists, proceeding to upload files');
            } else {
              console.error('Error creating repository', error);
              errorDiv.textContent = 'Error creating repository';
              return;
            }
          }

          try {
            await uploadFiles({
              repo: REPO_ID,
              credentials: { accessToken: HF_ACCESS_TOKEN },
              files: files.map(file => ({path: file.name, content: file}))
            });

            console.log(`All files uploaded successfully`);
            progressBar.value = 100;
          } catch (error) {
            console.error('Error uploading files', error);
            errorDiv.textContent = 'Error uploading files';
            return;
          }

          const elapsedTime = (Date.now() - startTime) / 1000;
          let speed = totalSize / elapsedTime;

          let time1GB = (1024 / speed) / 60;
          let time5GB = (5 * 1024 / speed) / 60;
          let time10GB = (10 * 1024 / speed) / 60;

          messageDiv.innerHTML = `All files uploaded successfully in ${elapsedTime.toFixed(2)} seconds, for all ${totalSize.toFixed(2)} MB in the ${files.length} files, speed ${speed.toFixed(2)} MB/s.<br>To upload a 1GB model at this speed, it would take approximately ${time1GB.toFixed(2)} minutes.<br>To upload a 5GB model at this speed, it would take approximately ${time5GB.toFixed(2)} minutes.<br>To upload a 10GB model at this speed, it would take approximately ${time10GB.toFixed(2)} minutes.`;
          processingMessage.textContent = "All files processed";
        } else {
          messageDiv.textContent = 'Please select files to upload';
        }
      }
    </script>
  </body>
</html>